-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathimmgen.sv
38 lines (31 loc) · 1.15 KB
/
immgen.sv
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
module immgen(
input logic [31:0] instr,
output logic [31:0] imm
);
logic [6:0] opCode;
logic [11:0] imm12;
logic [12:0] imm13;
logic [19:0] imm20;
logic [20:0] imm21;
assign opCode = instr[6:0];
assign imm12 = (opCode == 7'b0100011) ? {instr[31:25], instr[11:7]} // S type
: instr[31:20]; // other
// B type
assign imm13 = {instr[31], instr[7], instr[30:25], instr[11:8], 1'b0};
// J type
assign imm21 = {instr[31], instr[19:12], instr[20], instr[30:21], 1'b0};
// U type
assign imm20 = instr[31:12];
// sign extend or shift
assign imm = (opCode == 7'b0110111) ? {imm20, 12'b0} : // U type (lui)
(opCode == 7'b1100011) ? {{19{imm13[12]}}, imm13} :
(opCode == 7'b1101111) ? {{11{imm21[20]}}, imm21}
: {{20{imm12[11]}}, imm12};
// always @(imm) begin
// $display("instr %b", instr);
// $display("imm12 %b", imm12);
// $display("imm13 %b", imm13);
// $display("imm21 %b", imm21);
// $display("imm %b", imm);
// end
endmodule