-
Notifications
You must be signed in to change notification settings - Fork 29
/
Copy pathinsn_srl.v
60 lines (54 loc) · 2.4 KB
/
insn_srl.v
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
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
// DO NOT EDIT -- auto-generated from riscv-formal/insns/generate.py
module rvfi_insn_srl (
input rvfi_valid,
input [`RISCV_FORMAL_ILEN - 1 : 0] rvfi_insn,
input [`RISCV_FORMAL_XLEN - 1 : 0] rvfi_pc_rdata,
input [`RISCV_FORMAL_XLEN - 1 : 0] rvfi_rs1_rdata,
input [`RISCV_FORMAL_XLEN - 1 : 0] rvfi_rs2_rdata,
input [`RISCV_FORMAL_XLEN - 1 : 0] rvfi_mem_rdata,
`ifdef RISCV_FORMAL_CSR_MISA
input [`RISCV_FORMAL_XLEN - 1 : 0] rvfi_csr_misa_rdata,
output [`RISCV_FORMAL_XLEN - 1 : 0] spec_csr_misa_rmask,
`endif
output spec_valid,
output spec_trap,
output [ 4 : 0] spec_rs1_addr,
output [ 4 : 0] spec_rs2_addr,
output [ 4 : 0] spec_rd_addr,
output [`RISCV_FORMAL_XLEN - 1 : 0] spec_rd_wdata,
output [`RISCV_FORMAL_XLEN - 1 : 0] spec_pc_wdata,
output [`RISCV_FORMAL_XLEN - 1 : 0] spec_mem_addr,
output [`RISCV_FORMAL_XLEN/8 - 1 : 0] spec_mem_rmask,
output [`RISCV_FORMAL_XLEN/8 - 1 : 0] spec_mem_wmask,
output [`RISCV_FORMAL_XLEN - 1 : 0] spec_mem_wdata
);
// R-type instruction format
wire [`RISCV_FORMAL_ILEN-1:0] insn_padding = rvfi_insn >> 16 >> 16;
wire [6:0] insn_funct7 = rvfi_insn[31:25];
wire [4:0] insn_rs2 = rvfi_insn[24:20];
wire [4:0] insn_rs1 = rvfi_insn[19:15];
wire [2:0] insn_funct3 = rvfi_insn[14:12];
wire [4:0] insn_rd = rvfi_insn[11: 7];
wire [6:0] insn_opcode = rvfi_insn[ 6: 0];
`ifdef RISCV_FORMAL_CSR_MISA
wire misa_ok = (rvfi_csr_misa_rdata & `RISCV_FORMAL_XLEN'h 0) == `RISCV_FORMAL_XLEN'h 0;
assign spec_csr_misa_rmask = `RISCV_FORMAL_XLEN'h 0;
`else
wire misa_ok = 1;
`endif
// SRL instruction
wire [5:0] shamt = `RISCV_FORMAL_XLEN == 64 ? rvfi_rs2_rdata[5:0] : rvfi_rs2_rdata[4:0];
wire [`RISCV_FORMAL_XLEN-1:0] result = rvfi_rs1_rdata >> shamt;
assign spec_valid = rvfi_valid && !insn_padding && insn_funct7 == 7'b 0000000 && insn_funct3 == 3'b 101 && insn_opcode == 7'b 0110011;
assign spec_rs1_addr = insn_rs1;
assign spec_rs2_addr = insn_rs2;
assign spec_rd_addr = insn_rd;
assign spec_rd_wdata = spec_rd_addr ? result : 0;
assign spec_pc_wdata = rvfi_pc_rdata + 4;
// default assignments
assign spec_trap = !misa_ok;
assign spec_mem_addr = 0;
assign spec_mem_rmask = 0;
assign spec_mem_wmask = 0;
assign spec_mem_wdata = 0;
endmodule