1
+ module riscv_decode (
2
+ input logic [31 : 0 ] if_dec_instr_i,
3
+ output logic [4 : 0 ] rs1_o,
4
+ output logic [4 : 0 ] rs2_o,
5
+ output logic [4 : 0 ] rd_o,
6
+ output logic [6 : 0 ] op_o,
7
+ output logic [2 : 0 ] funct3_o,
8
+ output logic [6 : 0 ] funct7_o,
9
+ output logic is_r_type_o,
10
+ output logic is_i_type_o,
11
+ output logic is_s_type_o,
12
+ output logic is_b_type_o,
13
+ output logic is_u_type_o,
14
+ output logic is_j_type_o,
15
+ output logic [11 : 0 ] i_type_imm_o,
16
+ output logic [11 : 0 ] s_type_imm_o,
17
+ output logic [11 : 0 ] b_type_imm_o,
18
+ output logic [19 : 0 ] u_type_imm_o,
19
+ output logic [19 : 0 ] j_type_imm_o
20
+ );
21
+
22
+ assign rd_o = if_dec_instr_i[11 : 7 ];
23
+ assign rs1_o = if_dec_instr_i[19 : 15 ];
24
+ assign rs2_o = if_dec_instr_i[24 : 20 ];
25
+ assign op_o = if_dec_instr_i[6 : 0 ];
26
+ assign funct3_o = if_dec_instr_i[14 : 12 ];
27
+ assign funct7_o = if_dec_instr_i[31 : 25 ];
28
+
29
+ // Decode the type of the instruction
30
+ always_comb begin
31
+ is_r_type_o = 1'b0 ;
32
+ is_i_type_o = 1'b0 ;
33
+ is_s_type_o = 1'b0 ;
34
+ is_b_type_o = 1'b0 ;
35
+ is_u_type_o = 1'b0 ;
36
+ is_j_type_o = 1'b0 ;
37
+ case (op_o)
38
+ 7'h33 : is_r_type_o = 1'b1 ;
39
+ // I-type data processing
40
+ // I-type LW
41
+ // JALR
42
+ 7'h13 ,
43
+ 7'h03 ,
44
+ 7'h67 : is_i_type_o = 1'b1 ;
45
+ 7'h23 : is_s_type_o = 1'b1 ;
46
+ 7'h63 : is_b_type_o = 1'b1 ;
47
+ 7'h6F : is_j_type_o = 1'b1 ;
48
+ endcase
49
+ end
50
+
51
+ assign i_type_imm_o[11 : 0 ] = if_dec_instr_i[31 : 20 ];
52
+ assign s_type_imm_o[11 : 0 ] = { if_dec_instr_i[31 : 25 ], if_dec_instr_i[11 : 7 ]} ;
53
+ assign b_type_imm_o[11 : 0 ] = { if_dec_instr_i[31 ], if_dec_instr_i[7 ], if_dec_instr_i[30 : 25 ],
54
+ if_dec_instr_i[11 : 8 ]} ;
55
+ assign u_type_imm_o[19 : 0 ] = if_dec_instr_i[31 : 12 ];
56
+ assign j_type_imm_o[19 : 0 ] = { if_dec_instr_i[31 ], if_dec_instr_i[19 : 12 ], if_dec_instr_i[20 ],
57
+ if_dec_instr_i[30 : 21 ]} ;
58
+
59
+ endmodule
0 commit comments