RVSCC/rtl/MainDecoder.sv

94 lines
2.5 KiB
Systemverilog
Raw Normal View History

2022-11-28 03:44:11 +00:00
`timescale 1ns / 1ps
2022-12-24 01:13:40 +00:00
import rv32i_defs::*;
2022-11-28 03:44:11 +00:00
module MainDecoder(
input logic[6:0] opcode,
output logic branch,
output logic jump,
output logic[1:0] result_src,
output logic mem_write,
output logic alu_src,
output logic[1:0] imm_src,
output logic reg_write,
output logic[1:0] alu_op
2022-12-20 05:19:32 +00:00
);
2022-12-24 01:13:40 +00:00
opcode_fmt opcode_enum;
assign opcode_enum = opcode_fmt'(opcode);
2022-11-28 03:44:11 +00:00
always_comb begin
case(opcode)
2022-12-24 01:13:40 +00:00
LOAD: begin // lw
2022-11-28 03:44:11 +00:00
reg_write = 1;
imm_src = 'b00;
alu_src = 1;
mem_write = 0;
result_src = 'b01;
branch = 0;
alu_op = 'b00;
jump = 0;
end
2022-12-24 01:13:40 +00:00
STORE: begin // sw
2022-11-28 03:44:11 +00:00
reg_write = 0;
imm_src = 'b01;
alu_src = 1;
mem_write = 1;
2022-12-24 01:13:40 +00:00
result_src = 'bx0; // xx?
2022-11-28 03:44:11 +00:00
branch = 0;
alu_op = 'b00;
jump = 0;
end
2022-12-24 01:13:40 +00:00
REG_OPERATION: begin // r-type
2022-11-28 03:44:11 +00:00
reg_write = 1;
imm_src = 'bxx;
alu_src = 0;
mem_write = 0;
result_src = 'b00;
branch = 0;
alu_op = 'b10;
jump = 0;
end
2022-12-24 01:13:40 +00:00
BRANCH: begin // b-type
2022-11-28 03:44:11 +00:00
reg_write = 0;
imm_src = 'b10;
alu_src = 0;
mem_write = 0;
result_src = 'bxx;
branch = 1;
alu_op = 'b01;
jump = 0;
end
2022-12-24 01:13:40 +00:00
IMM_OPERATION: begin // i-type
2022-11-28 03:44:11 +00:00
reg_write = 1;
imm_src = 'b00;
alu_src = 1;
mem_write = 0;
result_src = 'b00;
branch = 0;
alu_op = 'b10;
jump = 0;
end
2022-12-24 01:13:40 +00:00
JAL: begin // jal
2022-11-28 03:44:11 +00:00
reg_write = 1;
imm_src = 'b11;
alu_src = 'bx;
mem_write = 0;
result_src = 'b10;
branch = 0;
alu_op = 'bxx;
jump = 1;
end
default: begin
2022-12-24 01:13:40 +00:00
reg_write = 'b0;
2022-11-28 03:44:11 +00:00
imm_src = 'bxx;
alu_src = 'bx;
2022-12-24 01:13:40 +00:00
mem_write = 'b0;
result_src = 'b00;
branch = 'b0;
2022-11-28 03:44:11 +00:00
alu_op = 'bx;
2022-12-24 01:13:40 +00:00
jump = 'b0;
2022-11-28 03:44:11 +00:00
end
endcase
end
endmodule