diff --git a/wally-pipelined/regression/wally-buildroot-batch.do b/wally-pipelined/regression/wally-buildroot-batch.do index c16655e1e..bca3ca35e 100644 --- a/wally-pipelined/regression/wally-buildroot-batch.do +++ b/wally-pipelined/regression/wally-buildroot-batch.do @@ -25,7 +25,7 @@ vlib work-buildroot # suppress spurious warnngs about # "Extra checking for conflicts with always_comb done at vopt time" # because vsim will run vopt -vlog +incdir+../config/buildroot +incdir+../config/shared ../testbench/testbench-linux.sv ../src/*/*.sv -suppress 2583 +vlog +incdir+../config/buildroot +incdir+../config/shared ../testbench/testbench-linux.sv ../testbench/common/*.sv ../src/*/*.sv -suppress 2583 # start and run simulation diff --git a/wally-pipelined/regression/wally-buildroot.do b/wally-pipelined/regression/wally-buildroot.do index 452ba54d4..1f4a15a5c 100644 --- a/wally-pipelined/regression/wally-buildroot.do +++ b/wally-pipelined/regression/wally-buildroot.do @@ -25,7 +25,7 @@ vlib work-buildroot # suppress spurious warnngs about # "Extra checking for conflicts with always_comb done at vopt time" # because vsim will run vopt -vlog +incdir+../config/buildroot +incdir+../config/shared ../testbench/testbench-linux.sv ../src/*/*.sv -suppress 2583 +vlog +incdir+../config/buildroot +incdir+../config/shared ../testbench/testbench-linux.sv ../testbench/common/*.sv ../src/*/*.sv -suppress 2583 # start and run simulation @@ -34,10 +34,15 @@ vopt +acc work.testbench -o workopt vsim workopt -suppress 8852,12070 +run 100 ns +add log -r /* #-- Run the Simulation -run -all -do ./wave-dos/linux-waves.do -run -all +#run -all +#do ./wave-dos/linux-waves.do +#run 60 ms +do wave.do +#run -all + exec ./slack-notifier/slack-notifier.py ##quit diff --git a/wally-pipelined/regression/wally-busybear-batch.do b/wally-pipelined/regression/wally-busybear-batch.do index e9beed4ce..1bcc164ea 100644 --- a/wally-pipelined/regression/wally-busybear-batch.do +++ b/wally-pipelined/regression/wally-busybear-batch.do @@ -26,7 +26,7 @@ vlib work_busybear # suppress spurious warnngs about # "Extra checking for conflicts with always_comb done at vopt time" # because vsim will run vopt -vlog -work work_busybear +incdir+../config/busybear +incdir+../config/shared ../testbench/testbench-linux.sv ../src/*/*.sv -suppress 2583 +vlog -work work_busybear +incdir+../config/busybear +incdir+../config/shared ../testbench/testbench-linux.sv ../testbench/common/*.sv ../src/*/*.sv -suppress 2583 # start and run simulation diff --git a/wally-pipelined/regression/wally-busybear.do b/wally-pipelined/regression/wally-busybear.do index 204d1c4e4..9a567402a 100644 --- a/wally-pipelined/regression/wally-busybear.do +++ b/wally-pipelined/regression/wally-busybear.do @@ -26,7 +26,7 @@ vlib work-busybear # suppress spurious warnngs about # "Extra checking for conflicts with always_comb done at vopt time" # because vsim will run vopt -vlog +incdir+../config/busybear +incdir+../config/shared ../testbench/testbench-linux.sv ../src/*/*.sv -suppress 2583 +vlog +incdir+../config/busybear +incdir+../config/shared ../testbench/testbench-linux.sv ../testbench/common/*.sv ../src/*/*.sv -suppress 2583 # start and run simulation diff --git a/wally-pipelined/regression/wally-coremark_bare.do b/wally-pipelined/regression/wally-coremark_bare.do index 1c54f015f..401da0d6d 100644 --- a/wally-pipelined/regression/wally-coremark_bare.do +++ b/wally-pipelined/regression/wally-coremark_bare.do @@ -28,7 +28,7 @@ vlib work # because vsim will run vopt # default to config/coremark, but allow this to be overridden at the command line. For example: -vlog +incdir+../config/coremark_bare +incdir+../config/shared ../testbench/testbench-coremark_bare.sv ../testbench/function_radix.sv ../src/*/*.sv -suppress 2583 +vlog +incdir+../config/coremark_bare +incdir+../config/shared ../testbench/testbench-coremark_bare.sv ../testbench/common/*.sv ../testbench/function_radix.sv ../src/*/*.sv -suppress 2583 # start and run simulation # remove +acc flag for faster sim during regressions if there is no need to access internal signals diff --git a/wally-pipelined/regression/wally-pipelined-batch-muldiv.do b/wally-pipelined/regression/wally-pipelined-batch-muldiv.do index c1d6410f6..cef5619eb 100644 --- a/wally-pipelined/regression/wally-pipelined-batch-muldiv.do +++ b/wally-pipelined/regression/wally-pipelined-batch-muldiv.do @@ -30,9 +30,9 @@ vlib work_$2 # default to config/rv64ic, but allow this to be overridden at the command line. For example: # do wally-pipelined-batch.do ../config/rv32ic rv32ic switch $argc { - 0 {vlog +incdir+../config/rv64imc +incdir+../config/shared ../testbench/testbench-imperas-div.sv ../src/*/*.sv -suppress 2583} - 1 {vlog +incdir+$1 +incdir+../config/shared ../testbench/testbench-imperas-div.sv ../src/*/*.sv -suppress 2583} - 2 {vlog -work work_$2 +incdir+$1 +incdir+../config/shared ../testbench/testbench-imperas-div.sv ../src/*/*.sv -suppress 2583} + 0 {vlog +incdir+../config/rv64imc +incdir+../config/shared ../testbench/testbench-imperas-div.sv ../testbench/common/*.sv ../src/*/*.sv -suppress 2583} + 1 {vlog +incdir+$1 +incdir+../config/shared ../testbench/testbench-imperas-div.sv ../testbench/common/*.sv ../src/*/*.sv -suppress 2583} + 2 {vlog -work work_$2 +incdir+$1 +incdir+../config/shared ../testbench/testbench-imperas-div.sv ../testbench/common/*.sv ../src/*/*.sv -suppress 2583} } # start and run simulation # remove +acc flag for faster sim during regressions if there is no need to access internal signals diff --git a/wally-pipelined/regression/wally-pipelined-batch-rv32icfd.do b/wally-pipelined/regression/wally-pipelined-batch-rv32icfd.do index 00ad9f080..048663194 100644 --- a/wally-pipelined/regression/wally-pipelined-batch-rv32icfd.do +++ b/wally-pipelined/regression/wally-pipelined-batch-rv32icfd.do @@ -29,9 +29,9 @@ vlib work_$2 # default to config/rv64ic, but allow this to be overridden at the command line. For example: switch $argc { - 0 {vlog +incdir+../config/rv32icfd +incdir+../config/shared ../testbench/testbench-imperas.sv ../src/*/*.sv -suppress 2583} - 1 {vlog +incdir+$1 +incdir+../config/shared ../testbench/testbench-imperas.sv ../src/*/*.sv -suppress 2583} - 2 {vlog -work work_$2 +incdir+$1 +incdir+../config/shared ../testbench/testbench-imperas.sv ../src/*/*.sv -suppress 2583} + 0 {vlog +incdir+../config/rv32icfd +incdir+../config/shared ../testbench/testbench-imperas.sv ../testbench/common/*.sv ../src/*/*.sv -suppress 2583} + 1 {vlog +incdir+$1 +incdir+../config/shared ../testbench/testbench-imperas.sv ../testbench/common/*.sv ../src/*/*.sv -suppress 2583} + 2 {vlog -work work_$2 +incdir+$1 +incdir+../config/shared ../testbench/testbench-imperas.sv ../testbench/common/*.sv ../src/*/*.sv -suppress 2583} } # start and run simulation # remove +acc flag for faster sim during regressions if there is no need to access internal signals diff --git a/wally-pipelined/regression/wally-pipelined-batch-rv64icfd.do b/wally-pipelined/regression/wally-pipelined-batch-rv64icfd.do index e6e158ebd..efa90d038 100644 --- a/wally-pipelined/regression/wally-pipelined-batch-rv64icfd.do +++ b/wally-pipelined/regression/wally-pipelined-batch-rv64icfd.do @@ -30,9 +30,9 @@ vlib work_$2 # default to config/rv64icfd, but allow this to be overridden at the command line. For example: # do wally-pipelined-batch.do ../config/rv32ic rv32ic switch $argc { - 0 {vlog +incdir+../config/rv64icfd +incdir+../config/shared ../testbench/testbench-imperas.sv ../src/*/*.sv -suppress 2583} - 1 {vlog +incdir+$1 +incdir+../config/shared ../testbench/testbench-imperas.sv ../src/*/*.sv -suppress 2583} - 2 {vlog -work work_$2 +incdir+$1 +incdir+../config/shared ../testbench/testbench-imperas.sv ../src/*/*.sv -suppress 2583} + 0 {vlog +incdir+../config/rv64icfd +incdir+../config/shared ../testbench/testbench-imperas.sv ../testbench/common/*.sv ../src/*/*.sv -suppress 2583} + 1 {vlog +incdir+$1 +incdir+../config/shared ../testbench/testbench-imperas.sv ../testbench/common/*.sv ../src/*/*.sv -suppress 2583} + 2 {vlog -work work_$2 +incdir+$1 +incdir+../config/shared ../testbench/testbench-imperas.sv ../testbench/common/*.sv ../src/*/*.sv -suppress 2583} } # start and run simulation # remove +acc flag for faster sim during regressions if there is no need to access internal signals diff --git a/wally-pipelined/regression/wally-pipelined-batch.do b/wally-pipelined/regression/wally-pipelined-batch.do index 1e67b836e..28b866973 100644 --- a/wally-pipelined/regression/wally-pipelined-batch.do +++ b/wally-pipelined/regression/wally-pipelined-batch.do @@ -30,9 +30,9 @@ vlib work_$2 # default to config/rv64ic, but allow this to be overridden at the command line. For example: # do wally-pipelined-batch.do ../config/rv32ic rv32ic switch $argc { - 0 {vlog +incdir+../config/rv64ic +incdir+../config/shared ../testbench/testbench-imperas.sv ../src/*/*.sv -suppress 2583} - 1 {vlog +incdir+$1 +incdir+../config/shared ../testbench/testbench-imperas.sv ../src/*/*.sv -suppress 2583} - 2 {vlog -work work_$2 +incdir+$1 +incdir+../config/shared ../testbench/testbench-imperas.sv ../src/*/*.sv -suppress 2583} + 0 {vlog +incdir+../config/rv64ic +incdir+../config/shared ../testbench/testbench-imperas.sv ../testbench/common/*.sv ../src/*/*.sv -suppress 2583} + 1 {vlog +incdir+$1 +incdir+../config/shared ../testbench/testbench-imperas.sv ../testbench/common/*.sv ../src/*/*.sv -suppress 2583} + 2 {vlog -work work_$2 +incdir+$1 +incdir+../config/shared ../testbench/testbench-imperas.sv ../testbench/common/*.sv ../src/*/*.sv -suppress 2583} } # start and run simulation # remove +acc flag for faster sim during regressions if there is no need to access internal signals diff --git a/wally-pipelined/regression/wally-pipelined-muldiv.do b/wally-pipelined/regression/wally-pipelined-muldiv.do index 746ba1163..f40d0c5d5 100644 --- a/wally-pipelined/regression/wally-pipelined-muldiv.do +++ b/wally-pipelined/regression/wally-pipelined-muldiv.do @@ -30,8 +30,8 @@ vlib work # default to config/rv64ic, but allow this to be overridden at the command line. For example: # do wally-pipelined.do ../config/rv32ic switch $argc { - 0 {vlog +incdir+../config/rv64imc +incdir+../config/shared ../testbench/testbench-imperas-div.sv ../src/*/*.sv -suppress 2583} - 1 {vlog +incdir+$1 +incdir+../config/shared ../testbench/testbench-imperas-div.sv ../testbench/function_radix.sv ../src/*/*.sv -suppress 2583} + 0 {vlog +incdir+../config/rv64imc +incdir+../config/shared ../testbench/testbench-imperas-div.sv ../testbench/common/*.sv ../src/*/*.sv -suppress 2583} + 1 {vlog +incdir+$1 +incdir+../config/shared ../testbench/testbench-imperas-div.sv ../testbench/common/*.sv ../src/*/*.sv -suppress 2583} } # start and run simulation # remove +acc flag for faster sim during regressions if there is no need to access internal signals diff --git a/wally-pipelined/regression/wally-pipelined-ross.do b/wally-pipelined/regression/wally-pipelined-ross.do index 15a515de5..a8c15c4e7 100644 --- a/wally-pipelined/regression/wally-pipelined-ross.do +++ b/wally-pipelined/regression/wally-pipelined-ross.do @@ -30,8 +30,8 @@ vlib work # default to config/rv64ic, but allow this to be overridden at the command line. For example: # do wally-pipelined.do ../config/rv32ic switch $argc { - 0 {vlog +incdir+../config/rv64ic +incdir+../config/shared ../testbench/testbench-imperas.sv ../testbench/function_radix.sv ../src/*/*.sv -suppress 2583} - 1 {vlog +incdir+$1 +incdir+../config/shared ../testbench/testbench-imperas.sv ../testbench/function_radix.sv ../src/*/*.sv -suppress 2583} + 0 {vlog +incdir+../config/rv64ic +incdir+../config/shared ../testbench/testbench-imperas.sv ../testbench/common/*.sv ../src/*/*.sv -suppress 2583} + 1 {vlog +incdir+$1 +incdir+../config/shared ../testbench/testbench-imperas.sv ../testbench/common/*.sv ../src/*/*.sv -suppress 2583} } # start and run simulation # remove +acc flag for faster sim during regressions if there is no need to access internal signals diff --git a/wally-pipelined/regression/wally-pipelined-rv32icfd.do b/wally-pipelined/regression/wally-pipelined-rv32icfd.do index eb3f3e127..0a1f49056 100644 --- a/wally-pipelined/regression/wally-pipelined-rv32icfd.do +++ b/wally-pipelined/regression/wally-pipelined-rv32icfd.do @@ -30,8 +30,8 @@ vlib work # default to config/rv64ic, but allow this to be overridden at the command line. For example: # do wally-pipelined.do ../config/rv32ic switch $argc { - 0 {vlog +incdir+../config/rv32icfd +incdir+../config/shared ../testbench/testbench-imperas.sv ../src/*/*.sv -suppress 2583} - 1 {vlog +incdir+$1 +incdir+../config/shared ../testbench/testbench-imperas.sv ../testbench/function_radix.sv ../src/*/*.sv -suppress 2583} + 0 {vlog +incdir+../config/rv32icfd +incdir+../config/shared ../testbench/testbench-imperas.sv ../testbench/common/*.sv ../src/*/*.sv -suppress 2583} + 1 {vlog +incdir+$1 +incdir+../config/shared ../testbench/testbench-imperas.sv ../testbench/common/*.sv ../src/*/*.sv -suppress 2583} } # start and run simulation # remove +acc flag for faster sim during regressions if there is no need to access internal signals diff --git a/wally-pipelined/regression/wally-pipelined-rv64icfd.do b/wally-pipelined/regression/wally-pipelined-rv64icfd.do index 39f62903f..3b9fcfc68 100644 --- a/wally-pipelined/regression/wally-pipelined-rv64icfd.do +++ b/wally-pipelined/regression/wally-pipelined-rv64icfd.do @@ -30,8 +30,8 @@ vlib work # default to config/rv64icfd, but allow this to be overridden at the command line. For example: # do wally-pipelined.do ../config/rv32ic switch $argc { - 0 {vlog +incdir+../config/rv64icfd +incdir+../config/shared ../testbench/testbench-imperas.sv ../src/*/*.sv -suppress 2583} - 1 {vlog +incdir+$1 +incdir+../config/shared ../testbench/testbench-imperas.sv ../testbench/function_radix.sv ../src/*/*.sv -suppress 2583} + 0 {vlog +incdir+../config/rv64icfd +incdir+../config/shared ../testbench/testbench-imperas.sv ../testbench/common/*.sv ../src/*/*.sv -suppress 2583} + 1 {vlog +incdir+$1 +incdir+../config/shared ../testbench/testbench-imperas.sv ../testbench/common/*.sv ../src/*/*.sv -suppress 2583} } # start and run simulation # remove +acc flag for faster sim during regressions if there is no need to access internal signals diff --git a/wally-pipelined/regression/wally-pipelined.do b/wally-pipelined/regression/wally-pipelined.do index f1faffa73..861657308 100644 --- a/wally-pipelined/regression/wally-pipelined.do +++ b/wally-pipelined/regression/wally-pipelined.do @@ -30,8 +30,8 @@ vlib work # default to config/rv64ic, but allow this to be overridden at the command line. For example: # do wally-pipelined.do ../config/rv32ic switch $argc { - 0 {vlog +incdir+../config/rv64ic +incdir+../config/shared ../testbench/testbench-imperas.sv ../src/*/*.sv -suppress 2583} - 1 {vlog +incdir+$1 +incdir+../config/shared ../testbench/testbench-imperas.sv ../testbench/function_radix.sv ../src/*/*.sv -suppress 2583} + 0 {vlog +incdir+../config/rv64ic +incdir+../config/shared ../testbench/testbench-imperas.sv ../testbench/common/*.sv ../src/*/*.sv -suppress 2583} + 1 {vlog +incdir+$1 +incdir+../config/shared ../testbench/testbench-imperas.sv ../testbench/common/*.sv ../src/*/*.sv -suppress 2583} } # start and run simulation # remove +acc flag for faster sim during regressions if there is no need to access internal signals diff --git a/wally-pipelined/regression/wally-privileged.do b/wally-pipelined/regression/wally-privileged.do index 21507c461..b0b8186ff 100644 --- a/wally-pipelined/regression/wally-privileged.do +++ b/wally-pipelined/regression/wally-privileged.do @@ -30,8 +30,8 @@ vlib work # default to config/rv64ic, but allow this to be overridden at the command line. For example: # do wally-pipelined.do ../config/rv32ic switch $argc { - 0 {vlog +incdir+../config/rv64ic +incdir+../config/shared ../testbench/testbench-imperas.sv ../src/*/*.sv -suppress 2583} - 1 {vlog +incdir+$1 +incdir+../config/shared ../testbench/testbench-imperas.sv ../testbench/function_radix.sv ../src/*/*.sv -suppress 2583} + 0 {vlog +incdir+../config/rv64ic +incdir+../config/shared ../testbench/testbench-imperas.sv ../testbench/common/*.sv ../src/*/*.sv -suppress 2583} + 1 {vlog +incdir+$1 +incdir+../config/shared ../testbench/testbench-imperas.sv ../testbench/common/*.sv ../src/*/*.sv -suppress 2583} } # start and run simulation # remove +acc flag for faster sim during regressions if there is no need to access internal signals diff --git a/wally-pipelined/testbench/function_radix.sv b/wally-pipelined/testbench/common/function_radix.sv similarity index 100% rename from wally-pipelined/testbench/function_radix.sv rename to wally-pipelined/testbench/common/function_radix.sv diff --git a/wally-pipelined/testbench/common/instrNameDecTB.sv b/wally-pipelined/testbench/common/instrNameDecTB.sv new file mode 100644 index 000000000..ba2c9bba1 --- /dev/null +++ b/wally-pipelined/testbench/common/instrNameDecTB.sv @@ -0,0 +1,260 @@ +// decode the instruction name, to help the test bench +module instrNameDecTB( + input logic [31:0] instr, + output string name); + + logic [6:0] op; + logic [2:0] funct3; + logic [6:0] funct7; + logic [11:0] imm; + logic [4:0] rs2; + + assign op = instr[6:0]; + assign funct3 = instr[14:12]; + assign funct7 = instr[31:25]; + assign imm = instr[31:20]; + assign rs2 = instr[24:20]; + + // it would be nice to add the operands to the name + // create another variable called decoded + + always_comb + casez({op, funct3}) + 10'b0000000_000: name = "BAD"; + 10'b0000011_000: name = "LB"; + 10'b0000011_001: name = "LH"; + 10'b0000011_010: name = "LW"; + 10'b0000011_011: name = "LD"; + 10'b0000011_100: name = "LBU"; + 10'b0000011_101: name = "LHU"; + 10'b0000011_110: name = "LWU"; + 10'b0010011_000: if (instr[31:15] == 0 && instr[11:7] ==0) name = "NOP/FLUSH"; + else name = "ADDI"; + 10'b0010011_001: if (funct7[6:1] == 6'b000000) name = "SLLI"; + else name = "ILLEGAL"; + 10'b0010011_010: name = "SLTI"; + 10'b0010011_011: name = "SLTIU"; + 10'b0010011_100: name = "XORI"; + 10'b0010011_101: if (funct7[6:1] == 6'b000000) name = "SRLI"; + else if (funct7[6:1] == 6'b010000) name = "SRAI"; + else name = "ILLEGAL"; + 10'b0010011_110: name = "ORI"; + 10'b0010011_111: name = "ANDI"; + 10'b0010111_???: name = "AUIPC"; + 10'b0100011_000: name = "SB"; + 10'b0100011_001: name = "SH"; + 10'b0100011_010: name = "SW"; + 10'b0100011_011: name = "SD"; + 10'b0011011_000: name = "ADDIW"; + 10'b0011011_001: name = "SLLIW"; + 10'b0011011_101: if (funct7 == 7'b0000000) name = "SRLIW"; + else if (funct7 == 7'b0100000) name = "SRAIW"; + else name = "ILLEGAL"; + 10'b0111011_000: if (funct7 == 7'b0000000) name = "ADDW"; + else if (funct7 == 7'b0100000) name = "SUBW"; + else if (funct7 == 7'b0000001) name = "MULW"; + else name = "ILLEGAL"; + 10'b0111011_001: if (funct7 == 7'b0000000) name = "SLLW"; + else if (funct7 == 7'b0000001) name = "DIVW"; + else name = "ILLEGAL"; + 10'b0111011_101: if (funct7 == 7'b0000000) name = "SRLW"; + else if (funct7 == 7'b0100000) name = "SRAW"; + else if (funct7 == 7'b0000001) name = "DIVUW"; + else name = "ILLEGAL"; + 10'b0111011_110: if (funct7 == 7'b0000001) name = "REMW"; + else name = "ILLEGAL"; + 10'b0111011_111: if (funct7 == 7'b0000001) name = "REMUW"; + else name = "ILLEGAL"; + 10'b0110011_000: if (funct7 == 7'b0000000) name = "ADD"; + else if (funct7 == 7'b0000001) name = "MUL"; + else if (funct7 == 7'b0100000) name = "SUB"; + else name = "ILLEGAL"; + 10'b0110011_001: if (funct7 == 7'b0000000) name = "SLL"; + else if (funct7 == 7'b0000001) name = "MULH"; + else name = "ILLEGAL"; + 10'b0110011_010: if (funct7 == 7'b0000000) name = "SLT"; + else if (funct7 == 7'b0000001) name = "MULHSU"; + else name = "ILLEGAL"; + 10'b0110011_011: if (funct7 == 7'b0000000) name = "SLTU"; + else if (funct7 == 7'b0000001) name = "MULHU"; + else name = "ILLEGAL"; + 10'b0110011_100: if (funct7 == 7'b0000000) name = "XOR"; + else if (funct7 == 7'b0000001) name = "DIV"; + else name = "ILLEGAL"; + 10'b0110011_101: if (funct7 == 7'b0000000) name = "SRL"; + else if (funct7 == 7'b0000001) name = "DIVU"; + else if (funct7 == 7'b0100000) name = "SRA"; + else name = "ILLEGAL"; + 10'b0110011_110: if (funct7 == 7'b0000000) name = "OR"; + else if (funct7 == 7'b0000001) name = "REM"; + else name = "ILLEGAL"; + 10'b0110011_111: if (funct7 == 7'b0000000) name = "AND"; + else if (funct7 == 7'b0000001) name = "REMU"; + else name = "ILLEGAL"; + 10'b0110111_???: name = "LUI"; + 10'b1100011_000: name = "BEQ"; + 10'b1100011_001: name = "BNE"; + 10'b1100011_100: name = "BLT"; + 10'b1100011_101: name = "BGE"; + 10'b1100011_110: name = "BLTU"; + 10'b1100011_111: name = "BGEU"; + 10'b1100111_000: name = "JALR"; + 10'b1101111_???: name = "JAL"; + 10'b1110011_000: if (imm == 0) name = "ECALL"; + else if (imm == 1) name = "EBREAK"; + else if (imm == 2) name = "URET"; + else if (imm == 258) name = "SRET"; + else if (imm == 770) name = "MRET"; + else if (funct7 == 9) name = "SFENCE.VMA"; + else name = "ILLEGAL"; + 10'b1110011_001: name = "CSRRW"; + 10'b1110011_010: name = "CSRRS"; + 10'b1110011_011: name = "CSRRC"; + 10'b1110011_101: name = "CSRRWI"; + 10'b1110011_110: name = "CSRRSI"; + 10'b1110011_111: name = "CSRRCI"; + 10'b0101111_010: if (funct7[6:2] == 5'b00010) name = "LR.W"; + else if (funct7[6:2] == 5'b00011) name = "SC.W"; + else if (funct7[6:2] == 5'b00001) name = "AMOSWAP.W"; + else if (funct7[6:2] == 5'b00000) name = "AMOADD.W"; + else if (funct7[6:2] == 5'b00100) name = "AMOAXOR.W"; + else if (funct7[6:2] == 5'b01100) name = "AMOAND.W"; + else if (funct7[6:2] == 5'b01000) name = "AMOOR.W"; + else if (funct7[6:2] == 5'b10000) name = "AMOMIN.W"; + else if (funct7[6:2] == 5'b10100) name = "AMOMAX.W"; + else if (funct7[6:2] == 5'b11000) name = "AMOMINU.W"; + else if (funct7[6:2] == 5'b11100) name = "AMOMAXU.W"; + else name = "ILLEGAL"; + 10'b0101111_011: if (funct7[6:2] == 5'b00010) name = "LR.D"; + else if (funct7[6:2] == 5'b00011) name = "SC.D"; + else if (funct7[6:2] == 5'b00001) name = "AMOSWAP.D"; + else if (funct7[6:2] == 5'b00000) name = "AMOADD.D"; + else if (funct7[6:2] == 5'b00100) name = "AMOAXOR.D"; + else if (funct7[6:2] == 5'b01100) name = "AMOAND.D"; + else if (funct7[6:2] == 5'b01000) name = "AMOOR.D"; + else if (funct7[6:2] == 5'b10000) name = "AMOMIN.D"; + else if (funct7[6:2] == 5'b10100) name = "AMOMAX.D"; + else if (funct7[6:2] == 5'b11000) name = "AMOMINU.D"; + else if (funct7[6:2] == 5'b11100) name = "AMOMAXU.D"; + else name = "ILLEGAL"; + 10'b0001111_???: name = "FENCE"; + 10'b1000011_???: name = "FMADD"; + 10'b1000111_???: name = "FMSUB"; + 10'b1001011_???: name = "FNMSUB"; + 10'b1001111_???: name = "FNMADD"; + 10'b1010011_000: if (funct7[6:2] == 5'b00000) name = "FADD"; + else if (funct7[6:2] == 5'b00001) name = "FSUB"; + else if (funct7[6:2] == 5'b00010) name = "FMUL"; + else if (funct7[6:2] == 5'b00011) name = "FDIV"; + else if (funct7[6:2] == 5'b01011) name = "FSQRT"; + else if (funct7 == 7'b1100000 && rs2 == 5'b00000) name = "FCVT.W.S"; + else if (funct7 == 7'b1100000 && rs2 == 5'b00001) name = "FCVT.WU.S"; + else if (funct7 == 7'b1100000 && rs2 == 5'b00010) name = "FCVT.L.S"; + else if (funct7 == 7'b1100000 && rs2 == 5'b00011) name = "FCVT.LU.S"; + else if (funct7 == 7'b1101000 && rs2 == 5'b00000) name = "FCVT.S.W"; + else if (funct7 == 7'b1101000 && rs2 == 5'b00001) name = "FCVT.S.WU"; + else if (funct7 == 7'b1101000 && rs2 == 5'b00010) name = "FCVT.S.L"; + else if (funct7 == 7'b1101000 && rs2 == 5'b00011) name = "FCVT.S.LU"; + else if (funct7 == 7'b1100001 && rs2 == 5'b00000) name = "FCVT.W.D"; + else if (funct7 == 7'b1100001 && rs2 == 5'b00001) name = "FCVT.WU.D"; + else if (funct7 == 7'b1100001 && rs2 == 5'b00010) name = "FCVT.L.D"; + else if (funct7 == 7'b1100001 && rs2 == 5'b00011) name = "FCVT.LU.D"; + else if (funct7 == 7'b1101001 && rs2 == 5'b00000) name = "FCVT.D.W"; + else if (funct7 == 7'b1101001 && rs2 == 5'b00001) name = "FCVT.D.WU"; + else if (funct7 == 7'b1101001 && rs2 == 5'b00010) name = "FCVT.D.L"; + else if (funct7 == 7'b1101001 && rs2 == 5'b00011) name = "FCVT.D.LU"; + else if (funct7 == 7'b0100000 && rs2 == 5'b00001) name = "FCVT.S.D"; + else if (funct7 == 7'b0100001 && rs2 == 5'b00000) name = "FCVT.D.S"; + else if (funct7 == 7'b1110000 && rs2 == 5'b00000) name = "FMV.X.W"; + else if (funct7 == 7'b1111000 && rs2 == 5'b00000) name = "FMV.W.X"; + else if (funct7 == 7'b1110001 && rs2 == 5'b00000) name = "FMV.X.D"; // DOUBLE + else if (funct7 == 7'b1111001 && rs2 == 5'b00000) name = "FMV.D.X"; // DOUBLE + else if (funct7[6:2] == 5'b00100) name = "FSGNJ"; + else if (funct7[6:2] == 5'b00101) name = "FMIN"; + else if (funct7[6:2] == 5'b10100) name = "FLE"; + else name = "ILLEGAL"; + 10'b1010011_001: if (funct7[6:2] == 5'b00000) name = "FADD"; + else if (funct7[6:2] == 5'b00001) name = "FSUB"; + else if (funct7[6:2] == 5'b00010) name = "FMUL"; + else if (funct7[6:2] == 5'b00011) name = "FDIV"; + else if (funct7[6:2] == 5'b01011) name = "FSQRT"; + else if (funct7 == 7'b1100000 && rs2 == 5'b00000) name = "FCVT.W.S"; + else if (funct7 == 7'b1100000 && rs2 == 5'b00001) name = "FCVT.WU.S"; + else if (funct7 == 7'b1100000 && rs2 == 5'b00010) name = "FCVT.L.S"; + else if (funct7 == 7'b1100000 && rs2 == 5'b00011) name = "FCVT.LU.S"; + else if (funct7 == 7'b1101000 && rs2 == 5'b00000) name = "FCVT.S.W"; + else if (funct7 == 7'b1101000 && rs2 == 5'b00001) name = "FCVT.S.WU"; + else if (funct7 == 7'b1101000 && rs2 == 5'b00010) name = "FCVT.S.L"; + else if (funct7 == 7'b1101000 && rs2 == 5'b00011) name = "FCVT.S.LU"; + else if (funct7 == 7'b1100001 && rs2 == 5'b00000) name = "FCVT.W.D"; + else if (funct7 == 7'b1100001 && rs2 == 5'b00001) name = "FCVT.WU.D"; + else if (funct7 == 7'b1100001 && rs2 == 5'b00010) name = "FCVT.L.D"; + else if (funct7 == 7'b1100001 && rs2 == 5'b00011) name = "FCVT.LU.D"; + else if (funct7 == 7'b1101001 && rs2 == 5'b00000) name = "FCVT.D.W"; + else if (funct7 == 7'b1101001 && rs2 == 5'b00001) name = "FCVT.D.WU"; + else if (funct7 == 7'b1101001 && rs2 == 5'b00010) name = "FCVT.D.L"; + else if (funct7 == 7'b1101001 && rs2 == 5'b00011) name = "FCVT.D.LU"; + else if (funct7 == 7'b0100000 && rs2 == 5'b00001) name = "FCVT.S.D"; + else if (funct7 == 7'b0100001 && rs2 == 5'b00000) name = "FCVT.D.S"; + else if (funct7[6:2] == 5'b00100) name = "FSGNJN"; + else if (funct7[6:2] == 5'b00101) name = "FMAX"; + else if (funct7[6:2] == 5'b10100) name = "FLT"; + else if (funct7[6:2] == 5'b11100) name = "FCLASS"; + else name = "ILLEGAL"; + 10'b1010011_010: if (funct7[6:2] == 5'b00000) name = "FADD"; + else if (funct7[6:2] == 5'b00001) name = "FSUB"; + else if (funct7[6:2] == 5'b00010) name = "FMUL"; + else if (funct7[6:2] == 5'b00011) name = "FDIV"; + else if (funct7[6:2] == 5'b01011) name = "FSQRT"; + else if (funct7 == 7'b1100000 && rs2 == 5'b00000) name = "FCVT.W.S"; + else if (funct7 == 7'b1100000 && rs2 == 5'b00001) name = "FCVT.WU.S"; + else if (funct7 == 7'b1100000 && rs2 == 5'b00010) name = "FCVT.L.S"; + else if (funct7 == 7'b1100000 && rs2 == 5'b00011) name = "FCVT.LU.S"; + else if (funct7 == 7'b1101000 && rs2 == 5'b00000) name = "FCVT.S.W"; + else if (funct7 == 7'b1101000 && rs2 == 5'b00001) name = "FCVT.S.WU"; + else if (funct7 == 7'b1101000 && rs2 == 5'b00010) name = "FCVT.S.L"; + else if (funct7 == 7'b1101000 && rs2 == 5'b00011) name = "FCVT.S.LU"; + else if (funct7 == 7'b1100001 && rs2 == 5'b00000) name = "FCVT.W.D"; + else if (funct7 == 7'b1100001 && rs2 == 5'b00001) name = "FCVT.WU.D"; + else if (funct7 == 7'b1100001 && rs2 == 5'b00010) name = "FCVT.L.D"; + else if (funct7 == 7'b1100001 && rs2 == 5'b00011) name = "FCVT.LU.D"; + else if (funct7 == 7'b1101001 && rs2 == 5'b00000) name = "FCVT.D.W"; + else if (funct7 == 7'b1101001 && rs2 == 5'b00001) name = "FCVT.D.WU"; + else if (funct7 == 7'b1101001 && rs2 == 5'b00010) name = "FCVT.D.L"; + else if (funct7 == 7'b1101001 && rs2 == 5'b00011) name = "FCVT.D.LU"; + else if (funct7 == 7'b0100000 && rs2 == 5'b00001) name = "FCVT.S.D"; + else if (funct7 == 7'b0100001 && rs2 == 5'b00000) name = "FCVT.D.S"; + else if (funct7[6:2] == 5'b00100) name = "FSGNJX"; + else if (funct7[6:2] == 5'b10100) name = "FEQ"; + else name = "ILLEGAL"; + 10'b1010011_???: if (funct7[6:2] == 5'b00000) name = "FADD"; + else if (funct7[6:2] == 5'b00001) name = "FSUB"; + else if (funct7[6:2] == 5'b00010) name = "FMUL"; + else if (funct7[6:2] == 5'b00011) name = "FDIV"; + else if (funct7[6:2] == 5'b01011) name = "FSQRT"; + else if (funct7 == 7'b1100000 && rs2 == 5'b00000) name = "FCVT.W.S"; + else if (funct7 == 7'b1100000 && rs2 == 5'b00001) name = "FCVT.WU.S"; + else if (funct7 == 7'b1100000 && rs2 == 5'b00010) name = "FCVT.L.S"; + else if (funct7 == 7'b1100000 && rs2 == 5'b00011) name = "FCVT.LU.S"; + else if (funct7 == 7'b1101000 && rs2 == 5'b00000) name = "FCVT.S.W"; + else if (funct7 == 7'b1101000 && rs2 == 5'b00001) name = "FCVT.S.WU"; + else if (funct7 == 7'b1101000 && rs2 == 5'b00010) name = "FCVT.S.L"; + else if (funct7 == 7'b1101000 && rs2 == 5'b00011) name = "FCVT.S.LU"; + else if (funct7 == 7'b1100001 && rs2 == 5'b00000) name = "FCVT.W.D"; + else if (funct7 == 7'b1100001 && rs2 == 5'b00001) name = "FCVT.WU.D"; + else if (funct7 == 7'b1100001 && rs2 == 5'b00010) name = "FCVT.L.D"; + else if (funct7 == 7'b1100001 && rs2 == 5'b00011) name = "FCVT.LU.D"; + else if (funct7 == 7'b1101001 && rs2 == 5'b00000) name = "FCVT.D.W"; + else if (funct7 == 7'b1101001 && rs2 == 5'b00001) name = "FCVT.D.WU"; + else if (funct7 == 7'b1101001 && rs2 == 5'b00010) name = "FCVT.D.L"; + else if (funct7 == 7'b1101001 && rs2 == 5'b00011) name = "FCVT.D.LU"; + else if (funct7 == 7'b0100000 && rs2 == 5'b00001) name = "FCVT.S.D"; + else if (funct7 == 7'b0100001 && rs2 == 5'b00000) name = "FCVT.D.S"; + else name = "ILLEGAL"; + 10'b0000111_010: name = "FLW"; + 10'b0100111_010: name = "FSW"; + 10'b0000111_011: name = "FLD"; + 10'b0100111_011: name = "FSD"; + default: name = "ILLEGAL"; + endcase +endmodule diff --git a/wally-pipelined/testbench/common/instrTrackerTB.sv b/wally-pipelined/testbench/common/instrTrackerTB.sv new file mode 100644 index 000000000..0283f6502 --- /dev/null +++ b/wally-pipelined/testbench/common/instrTrackerTB.sv @@ -0,0 +1,17 @@ +module instrTrackerTB( + input logic clk, reset, FlushE, + input logic [31:0] InstrF, InstrD, + input logic [31:0] InstrE, InstrM, + input logic [31:0] InstrW, +// output logic [31:0] InstrW, + output string InstrFName, InstrDName, InstrEName, InstrMName, InstrWName); + + // stage Instr to Writeback for visualization + // flopr #(32) InstrWReg(clk, reset, InstrM, InstrW); + + instrNameDecTB fdec(InstrF, InstrFName); + instrNameDecTB ddec(InstrD, InstrDName); + instrNameDecTB edec(InstrE, InstrEName); + instrNameDecTB mdec(InstrM, InstrMName); + instrNameDecTB wdec(InstrW, InstrWName); +endmodule diff --git a/wally-pipelined/testbench/common/logging.sv b/wally-pipelined/testbench/common/logging.sv new file mode 100644 index 000000000..bb87accea --- /dev/null +++ b/wally-pipelined/testbench/common/logging.sv @@ -0,0 +1,10 @@ +module logging( + input logic clk, reset, + input logic [31:0] HADDR, + input logic [1:0] HTRANS); + + always @(posedge clk) + if (HTRANS != 2'b00 && HADDR == 0) + $display("%t Warning: access to memory address 0\n", $realtime); +endmodule + diff --git a/wally-pipelined/testbench/testbench-coremark.sv b/wally-pipelined/testbench/testbench-coremark.sv index 6c0f81934..82a41d837 100644 --- a/wally-pipelined/testbench/testbench-coremark.sv +++ b/wally-pipelined/testbench/testbench-coremark.sv @@ -92,129 +92,3 @@ module testbench(); endmodule /* verilator lint_on STMTDLY */ /* verilator lint_on WIDTH */ -module instrTrackerTB( - input logic clk, reset, FlushE, - input logic [31:0] InstrF, InstrD, - input logic [31:0] InstrE, InstrM, - input logic [31:0] InstrW, - output string InstrFName, InstrDName, InstrEName, InstrMName, InstrWName); - - // stage Instr to Writeback for visualization - instrNameDecTB fdec(InstrF, InstrFName); - instrNameDecTB ddec(InstrD, InstrDName); - instrNameDecTB edec(InstrE, InstrEName); - instrNameDecTB mdec(InstrM, InstrMName); - instrNameDecTB wdec(InstrW, InstrWName); -endmodule -// decode the instruction name, to help the test bench -module instrNameDecTB( - input logic [31:0] instr, - output string name); - logic [6:0] op; - logic [2:0] funct3; - logic [6:0] funct7; - logic [11:0] imm; - assign op = instr[6:0]; - assign funct3 = instr[14:12]; - assign funct7 = instr[31:25]; - assign imm = instr[31:20]; - // it would be nice to add the operands to the name - // create another variable called decoded - always_comb - casez({op, funct3}) - 10'b0000000_000: name = "BAD"; - 10'b0000011_000: name = "LB"; - 10'b0000011_001: name = "LH"; - 10'b0000011_010: name = "LW"; - 10'b0000011_011: name = "LD"; - 10'b0000011_100: name = "LBU"; - 10'b0000011_101: name = "LHU"; - 10'b0000011_110: name = "LWU"; - 10'b0010011_000: if (instr[31:15] == 0 && instr[11:7] ==0) name = "NOP/FLUSH"; - else name = "ADDI"; - 10'b0010011_001: if (funct7[6:1] == 6'b000000) name = "SLLI"; - else name = "ILLEGAL"; - 10'b0010011_010: name = "SLTI"; - 10'b0010011_011: name = "SLTIU"; - 10'b0010011_100: name = "XORI"; - 10'b0010011_101: if (funct7[6:1] == 6'b000000) name = "SRLI"; - else if (funct7[6:1] == 6'b010000) name = "SRAI"; - else name = "ILLEGAL"; - 10'b0010011_110: name = "ORI"; - 10'b0010011_111: name = "ANDI"; - 10'b0010111_???: name = "AUIPC"; - 10'b0100011_000: name = "SB"; - 10'b0100011_001: name = "SH"; - 10'b0100011_010: name = "SW"; - 10'b0100011_011: name = "SD"; - 10'b0011011_000: name = "ADDIW"; - 10'b0011011_001: name = "SLLIW"; - 10'b0011011_101: if (funct7 == 7'b0000000) name = "SRLIW"; - else if (funct7 == 7'b0100000) name = "SRAIW"; - else name = "ILLEGAL"; - 10'b0111011_000: if (funct7 == 7'b0000000) name = "ADDW"; - else if (funct7 == 7'b0100000) name = "SUBW"; - else if (funct7 == 7'b0000001) name = "MULW"; - else name = "ILLEGAL"; - 10'b0111011_001: if (funct7 == 7'b0000000) name = "SLLW"; - else if (funct7 == 7'b0000001) name = "DIVW"; - else name = "ILLEGAL"; - 10'b0111011_101: if (funct7 == 7'b0000000) name = "SRLW"; - else if (funct7 == 7'b0100000) name = "SRAW"; - else if (funct7 == 7'b0000001) name = "DIVUW"; - else name = "ILLEGAL"; - 10'b0111011_110: if (funct7 == 7'b0000001) name = "REMW"; - else name = "ILLEGAL"; - 10'b0111011_111: if (funct7 == 7'b0000001) name = "REMUW"; - else name = "ILLEGAL"; - 10'b0110011_000: if (funct7 == 7'b0000000) name = "ADD"; - else if (funct7 == 7'b0000001) name = "MUL"; - else if (funct7 == 7'b0100000) name = "SUB"; - else name = "ILLEGAL"; - 10'b0110011_001: if (funct7 == 7'b0000000) name = "SLL"; - else if (funct7 == 7'b0000001) name = "MULH"; - else name = "ILLEGAL"; - 10'b0110011_010: if (funct7 == 7'b0000000) name = "SLT"; - else if (funct7 == 7'b0000001) name = "MULHSU"; - else name = "ILLEGAL"; - 10'b0110011_011: if (funct7 == 7'b0000000) name = "SLTU"; - else if (funct7 == 7'b0000001) name = "MULHU"; - else name = "ILLEGAL"; - 10'b0110011_100: if (funct7 == 7'b0000000) name = "XOR"; - else if (funct7 == 7'b0000001) name = "DIV"; - else name = "ILLEGAL"; - 10'b0110011_101: if (funct7 == 7'b0000000) name = "SRL"; - else if (funct7 == 7'b0000001) name = "DIVU"; - else if (funct7 == 7'b0100000) name = "SRA"; - else name = "ILLEGAL"; - 10'b0110011_110: if (funct7 == 7'b0000000) name = "OR"; - else if (funct7 == 7'b0000001) name = "REM"; - else name = "ILLEGAL"; - 10'b0110011_111: if (funct7 == 7'b0000000) name = "AND"; - else if (funct7 == 7'b0000001) name = "REMU"; - else name = "ILLEGAL"; - 10'b0110111_???: name = "LUI"; - 10'b1100011_000: name = "BEQ"; - 10'b1100011_001: name = "BNE"; - 10'b1100011_100: name = "BLT"; - 10'b1100011_101: name = "BGE"; - 10'b1100011_110: name = "BLTU"; - 10'b1100011_111: name = "BGEU"; - 10'b1100111_000: name = "JALR"; - 10'b1101111_???: name = "JAL"; - 10'b1110011_000: if (imm == 0) name = "ECALL"; - else if (imm == 1) name = "EBREAK"; - else if (imm == 2) name = "URET"; - else if (imm == 258) name = "SRET"; - else if (imm == 770) name = "MRET"; - else name = "ILLEGAL"; - 10'b1110011_001: name = "CSRRW"; - 10'b1110011_010: name = "CSRRS"; - 10'b1110011_011: name = "CSRRC"; - 10'b1110011_101: name = "CSRRWI"; - 10'b1110011_110: name = "CSRRSI"; - 10'b1110011_111: name = "CSRRCI"; - 10'b0001111_???: name = "FENCE"; - default: name = "ILLEGAL"; - endcase -endmodule diff --git a/wally-pipelined/testbench/testbench-coremark_bare.sv b/wally-pipelined/testbench/testbench-coremark_bare.sv index 9c9a4f252..90003e98d 100644 --- a/wally-pipelined/testbench/testbench-coremark_bare.sv +++ b/wally-pipelined/testbench/testbench-coremark_bare.sv @@ -110,129 +110,3 @@ module testbench(); endmodule /* verilator lint_on STMTDLY */ /* verilator lint_on WIDTH */ -module instrTrackerTB( - input logic clk, reset, FlushE, - input logic [31:0] InstrF, InstrD, - input logic [31:0] InstrE, InstrM, - input logic [31:0] InstrW, - output string InstrFName, InstrDName, InstrEName, InstrMName, InstrWName); - - // stage Instr to Writeback for visualization - instrNameDecTB fdec(InstrF, InstrFName); - instrNameDecTB ddec(InstrD, InstrDName); - instrNameDecTB edec(InstrE, InstrEName); - instrNameDecTB mdec(InstrM, InstrMName); - instrNameDecTB wdec(InstrW, InstrWName); -endmodule -// decode the instruction name, to help the test bench -module instrNameDecTB( - input logic [31:0] instr, - output string name); - logic [6:0] op; - logic [2:0] funct3; - logic [6:0] funct7; - logic [11:0] imm; - assign op = instr[6:0]; - assign funct3 = instr[14:12]; - assign funct7 = instr[31:25]; - assign imm = instr[31:20]; - // it would be nice to add the operands to the name - // create another variable called decoded - always_comb - casez({op, funct3}) - 10'b0000000_000: name = "BAD"; - 10'b0000011_000: name = "LB"; - 10'b0000011_001: name = "LH"; - 10'b0000011_010: name = "LW"; - 10'b0000011_011: name = "LD"; - 10'b0000011_100: name = "LBU"; - 10'b0000011_101: name = "LHU"; - 10'b0000011_110: name = "LWU"; - 10'b0010011_000: if (instr[31:15] == 0 && instr[11:7] ==0) name = "NOP/FLUSH"; - else name = "ADDI"; - 10'b0010011_001: if (funct7[6:1] == 6'b000000) name = "SLLI"; - else name = "ILLEGAL"; - 10'b0010011_010: name = "SLTI"; - 10'b0010011_011: name = "SLTIU"; - 10'b0010011_100: name = "XORI"; - 10'b0010011_101: if (funct7[6:1] == 6'b000000) name = "SRLI"; - else if (funct7[6:1] == 6'b010000) name = "SRAI"; - else name = "ILLEGAL"; - 10'b0010011_110: name = "ORI"; - 10'b0010011_111: name = "ANDI"; - 10'b0010111_???: name = "AUIPC"; - 10'b0100011_000: name = "SB"; - 10'b0100011_001: name = "SH"; - 10'b0100011_010: name = "SW"; - 10'b0100011_011: name = "SD"; - 10'b0011011_000: name = "ADDIW"; - 10'b0011011_001: name = "SLLIW"; - 10'b0011011_101: if (funct7 == 7'b0000000) name = "SRLIW"; - else if (funct7 == 7'b0100000) name = "SRAIW"; - else name = "ILLEGAL"; - 10'b0111011_000: if (funct7 == 7'b0000000) name = "ADDW"; - else if (funct7 == 7'b0100000) name = "SUBW"; - else if (funct7 == 7'b0000001) name = "MULW"; - else name = "ILLEGAL"; - 10'b0111011_001: if (funct7 == 7'b0000000) name = "SLLW"; - else if (funct7 == 7'b0000001) name = "DIVW"; - else name = "ILLEGAL"; - 10'b0111011_101: if (funct7 == 7'b0000000) name = "SRLW"; - else if (funct7 == 7'b0100000) name = "SRAW"; - else if (funct7 == 7'b0000001) name = "DIVUW"; - else name = "ILLEGAL"; - 10'b0111011_110: if (funct7 == 7'b0000001) name = "REMW"; - else name = "ILLEGAL"; - 10'b0111011_111: if (funct7 == 7'b0000001) name = "REMUW"; - else name = "ILLEGAL"; - 10'b0110011_000: if (funct7 == 7'b0000000) name = "ADD"; - else if (funct7 == 7'b0000001) name = "MUL"; - else if (funct7 == 7'b0100000) name = "SUB"; - else name = "ILLEGAL"; - 10'b0110011_001: if (funct7 == 7'b0000000) name = "SLL"; - else if (funct7 == 7'b0000001) name = "MULH"; - else name = "ILLEGAL"; - 10'b0110011_010: if (funct7 == 7'b0000000) name = "SLT"; - else if (funct7 == 7'b0000001) name = "MULHSU"; - else name = "ILLEGAL"; - 10'b0110011_011: if (funct7 == 7'b0000000) name = "SLTU"; - else if (funct7 == 7'b0000001) name = "MULHU"; - else name = "ILLEGAL"; - 10'b0110011_100: if (funct7 == 7'b0000000) name = "XOR"; - else if (funct7 == 7'b0000001) name = "DIV"; - else name = "ILLEGAL"; - 10'b0110011_101: if (funct7 == 7'b0000000) name = "SRL"; - else if (funct7 == 7'b0000001) name = "DIVU"; - else if (funct7 == 7'b0100000) name = "SRA"; - else name = "ILLEGAL"; - 10'b0110011_110: if (funct7 == 7'b0000000) name = "OR"; - else if (funct7 == 7'b0000001) name = "REM"; - else name = "ILLEGAL"; - 10'b0110011_111: if (funct7 == 7'b0000000) name = "AND"; - else if (funct7 == 7'b0000001) name = "REMU"; - else name = "ILLEGAL"; - 10'b0110111_???: name = "LUI"; - 10'b1100011_000: name = "BEQ"; - 10'b1100011_001: name = "BNE"; - 10'b1100011_100: name = "BLT"; - 10'b1100011_101: name = "BGE"; - 10'b1100011_110: name = "BLTU"; - 10'b1100011_111: name = "BGEU"; - 10'b1100111_000: name = "JALR"; - 10'b1101111_???: name = "JAL"; - 10'b1110011_000: if (imm == 0) name = "ECALL"; - else if (imm == 1) name = "EBREAK"; - else if (imm == 2) name = "URET"; - else if (imm == 258) name = "SRET"; - else if (imm == 770) name = "MRET"; - else name = "ILLEGAL"; - 10'b1110011_001: name = "CSRRW"; - 10'b1110011_010: name = "CSRRS"; - 10'b1110011_011: name = "CSRRC"; - 10'b1110011_101: name = "CSRRWI"; - 10'b1110011_110: name = "CSRRSI"; - 10'b1110011_111: name = "CSRRCI"; - 10'b0001111_???: name = "FENCE"; - default: name = "ILLEGAL"; - endcase -endmodule diff --git a/wally-pipelined/testbench/testbench-imperas.sv b/wally-pipelined/testbench/testbench-imperas.sv index b3ccaf586..54adf864c 100644 --- a/wally-pipelined/testbench/testbench-imperas.sv +++ b/wally-pipelined/testbench/testbench-imperas.sv @@ -156,7 +156,7 @@ string tests32f[] = '{ }; string tests64a[] = '{ - //"rv64a/WALLY-AMO", "2110", + "rv64a/WALLY-AMO", "2110", "rv64a/WALLY-LRSC", "2110" }; @@ -216,7 +216,6 @@ string tests32f[] = '{ string tests64i[] = '{ //"rv64i/WALLY-PIPELINE-100K", "f7ff0", - //"rv64i/WALLY-LOAD", "11bf0", "rv64i/I-ADD-01", "3000", "rv64i/I-ADDI-01", "3000", "rv64i/I-ADDIW-01", "3000", @@ -314,7 +313,7 @@ string tests32f[] = '{ }; string tests32a[] = '{ - //"rv64a/WALLY-AMO", "2110", + "rv32a/WALLY-AMO", "2110", "rv32a/WALLY-LRSC", "2110" }; @@ -767,296 +766,6 @@ endmodule /* verilator lint_on STMTDLY */ /* verilator lint_on WIDTH */ -module instrTrackerTB( - input logic clk, reset, FlushE, - input logic [31:0] InstrF, InstrD, - input logic [31:0] InstrE, InstrM, - input logic [31:0] InstrW, -// output logic [31:0] InstrW, - output string InstrFName, InstrDName, InstrEName, InstrMName, InstrWName); - - // stage Instr to Writeback for visualization - // flopr #(32) InstrWReg(clk, reset, InstrM, InstrW); - - instrNameDecTB fdec(InstrF, InstrFName); - instrNameDecTB ddec(InstrD, InstrDName); - instrNameDecTB edec(InstrE, InstrEName); - instrNameDecTB mdec(InstrM, InstrMName); - instrNameDecTB wdec(InstrW, InstrWName); -endmodule - -// decode the instruction name, to help the test bench -module instrNameDecTB( - input logic [31:0] instr, - output string name); - - logic [6:0] op; - logic [2:0] funct3; - logic [6:0] funct7; - logic [11:0] imm; - logic [4:0] rs2; - - assign op = instr[6:0]; - assign funct3 = instr[14:12]; - assign funct7 = instr[31:25]; - assign imm = instr[31:20]; - assign rs2 = instr[24:20]; - - // it would be nice to add the operands to the name - // create another variable called decoded - - always_comb - casez({op, funct3}) - 10'b0000000_000: name = "BAD"; - 10'b0000011_000: name = "LB"; - 10'b0000011_001: name = "LH"; - 10'b0000011_010: name = "LW"; - 10'b0000011_011: name = "LD"; - 10'b0000011_100: name = "LBU"; - 10'b0000011_101: name = "LHU"; - 10'b0000011_110: name = "LWU"; - 10'b0010011_000: if (instr[31:15] == 0 && instr[11:7] ==0) name = "NOP/FLUSH"; - else name = "ADDI"; - 10'b0010011_001: if (funct7[6:1] == 6'b000000) name = "SLLI"; - else name = "ILLEGAL"; - 10'b0010011_010: name = "SLTI"; - 10'b0010011_011: name = "SLTIU"; - 10'b0010011_100: name = "XORI"; - 10'b0010011_101: if (funct7[6:1] == 6'b000000) name = "SRLI"; - else if (funct7[6:1] == 6'b010000) name = "SRAI"; - else name = "ILLEGAL"; - 10'b0010011_110: name = "ORI"; - 10'b0010011_111: name = "ANDI"; - 10'b0010111_???: name = "AUIPC"; - 10'b0100011_000: name = "SB"; - 10'b0100011_001: name = "SH"; - 10'b0100011_010: name = "SW"; - 10'b0100011_011: name = "SD"; - 10'b0011011_000: name = "ADDIW"; - 10'b0011011_001: name = "SLLIW"; - 10'b0011011_101: if (funct7 == 7'b0000000) name = "SRLIW"; - else if (funct7 == 7'b0100000) name = "SRAIW"; - else name = "ILLEGAL"; - 10'b0111011_000: if (funct7 == 7'b0000000) name = "ADDW"; - else if (funct7 == 7'b0100000) name = "SUBW"; - else if (funct7 == 7'b0000001) name = "MULW"; - else name = "ILLEGAL"; - 10'b0111011_001: if (funct7 == 7'b0000000) name = "SLLW"; - else if (funct7 == 7'b0000001) name = "DIVW"; - else name = "ILLEGAL"; - 10'b0111011_101: if (funct7 == 7'b0000000) name = "SRLW"; - else if (funct7 == 7'b0100000) name = "SRAW"; - else if (funct7 == 7'b0000001) name = "DIVUW"; - else name = "ILLEGAL"; - 10'b0111011_110: if (funct7 == 7'b0000001) name = "REMW"; - else name = "ILLEGAL"; - 10'b0111011_111: if (funct7 == 7'b0000001) name = "REMUW"; - else name = "ILLEGAL"; - 10'b0110011_000: if (funct7 == 7'b0000000) name = "ADD"; - else if (funct7 == 7'b0000001) name = "MUL"; - else if (funct7 == 7'b0100000) name = "SUB"; - else name = "ILLEGAL"; - 10'b0110011_001: if (funct7 == 7'b0000000) name = "SLL"; - else if (funct7 == 7'b0000001) name = "MULH"; - else name = "ILLEGAL"; - 10'b0110011_010: if (funct7 == 7'b0000000) name = "SLT"; - else if (funct7 == 7'b0000001) name = "MULHSU"; - else name = "ILLEGAL"; - 10'b0110011_011: if (funct7 == 7'b0000000) name = "SLTU"; - else if (funct7 == 7'b0000001) name = "MULHU"; - else name = "ILLEGAL"; - 10'b0110011_100: if (funct7 == 7'b0000000) name = "XOR"; - else if (funct7 == 7'b0000001) name = "DIV"; - else name = "ILLEGAL"; - 10'b0110011_101: if (funct7 == 7'b0000000) name = "SRL"; - else if (funct7 == 7'b0000001) name = "DIVU"; - else if (funct7 == 7'b0100000) name = "SRA"; - else name = "ILLEGAL"; - 10'b0110011_110: if (funct7 == 7'b0000000) name = "OR"; - else if (funct7 == 7'b0000001) name = "REM"; - else name = "ILLEGAL"; - 10'b0110011_111: if (funct7 == 7'b0000000) name = "AND"; - else if (funct7 == 7'b0000001) name = "REMU"; - else name = "ILLEGAL"; - 10'b0110111_???: name = "LUI"; - 10'b1100011_000: name = "BEQ"; - 10'b1100011_001: name = "BNE"; - 10'b1100011_100: name = "BLT"; - 10'b1100011_101: name = "BGE"; - 10'b1100011_110: name = "BLTU"; - 10'b1100011_111: name = "BGEU"; - 10'b1100111_000: name = "JALR"; - 10'b1101111_???: name = "JAL"; - 10'b1110011_000: if (imm == 0) name = "ECALL"; - else if (imm == 1) name = "EBREAK"; - else if (imm == 2) name = "URET"; - else if (imm == 258) name = "SRET"; - else if (imm == 770) name = "MRET"; - else if (funct7 == 9) name = "SFENCE.VMA"; - else name = "ILLEGAL"; - 10'b1110011_001: name = "CSRRW"; - 10'b1110011_010: name = "CSRRS"; - 10'b1110011_011: name = "CSRRC"; - 10'b1110011_101: name = "CSRRWI"; - 10'b1110011_110: name = "CSRRSI"; - 10'b1110011_111: name = "CSRRCI"; - 10'b0101111_010: if (funct7[6:2] == 5'b00010) name = "LR.W"; - else if (funct7[6:2] == 5'b00011) name = "SC.W"; - else if (funct7[6:2] == 5'b00001) name = "AMOSWAP.W"; - else if (funct7[6:2] == 5'b00000) name = "AMOADD.W"; - else if (funct7[6:2] == 5'b00100) name = "AMOAXOR.W"; - else if (funct7[6:2] == 5'b01100) name = "AMOAND.W"; - else if (funct7[6:2] == 5'b01000) name = "AMOOR.W"; - else if (funct7[6:2] == 5'b10000) name = "AMOMIN.W"; - else if (funct7[6:2] == 5'b10100) name = "AMOMAX.W"; - else if (funct7[6:2] == 5'b11000) name = "AMOMINU.W"; - else if (funct7[6:2] == 5'b11100) name = "AMOMAXU.W"; - else name = "ILLEGAL"; - 10'b0101111_011: if (funct7[6:2] == 5'b00010) name = "LR.D"; - else if (funct7[6:2] == 5'b00011) name = "SC.D"; - else if (funct7[6:2] == 5'b00001) name = "AMOSWAP.D"; - else if (funct7[6:2] == 5'b00000) name = "AMOADD.D"; - else if (funct7[6:2] == 5'b00100) name = "AMOAXOR.D"; - else if (funct7[6:2] == 5'b01100) name = "AMOAND.D"; - else if (funct7[6:2] == 5'b01000) name = "AMOOR.D"; - else if (funct7[6:2] == 5'b10000) name = "AMOMIN.D"; - else if (funct7[6:2] == 5'b10100) name = "AMOMAX.D"; - else if (funct7[6:2] == 5'b11000) name = "AMOMINU.D"; - else if (funct7[6:2] == 5'b11100) name = "AMOMAXU.D"; - else name = "ILLEGAL"; - 10'b0001111_???: name = "FENCE"; - 10'b1000011_???: name = "FMADD"; - 10'b1000111_???: name = "FMSUB"; - 10'b1001011_???: name = "FNMSUB"; - 10'b1001111_???: name = "FNMADD"; - 10'b1010011_000: if (funct7[6:2] == 5'b00000) name = "FADD"; - else if (funct7[6:2] == 5'b00001) name = "FSUB"; - else if (funct7[6:2] == 5'b00010) name = "FMUL"; - else if (funct7[6:2] == 5'b00011) name = "FDIV"; - else if (funct7[6:2] == 5'b01011) name = "FSQRT"; - else if (funct7 == 7'b1100000 && rs2 == 5'b00000) name = "FCVT.W.S"; - else if (funct7 == 7'b1100000 && rs2 == 5'b00001) name = "FCVT.WU.S"; - else if (funct7 == 7'b1100000 && rs2 == 5'b00010) name = "FCVT.L.S"; - else if (funct7 == 7'b1100000 && rs2 == 5'b00011) name = "FCVT.LU.S"; - else if (funct7 == 7'b1101000 && rs2 == 5'b00000) name = "FCVT.S.W"; - else if (funct7 == 7'b1101000 && rs2 == 5'b00001) name = "FCVT.S.WU"; - else if (funct7 == 7'b1101000 && rs2 == 5'b00010) name = "FCVT.S.L"; - else if (funct7 == 7'b1101000 && rs2 == 5'b00011) name = "FCVT.S.LU"; - else if (funct7 == 7'b1100001 && rs2 == 5'b00000) name = "FCVT.W.D"; - else if (funct7 == 7'b1100001 && rs2 == 5'b00001) name = "FCVT.WU.D"; - else if (funct7 == 7'b1100001 && rs2 == 5'b00010) name = "FCVT.L.D"; - else if (funct7 == 7'b1100001 && rs2 == 5'b00011) name = "FCVT.LU.D"; - else if (funct7 == 7'b1101001 && rs2 == 5'b00000) name = "FCVT.D.W"; - else if (funct7 == 7'b1101001 && rs2 == 5'b00001) name = "FCVT.D.WU"; - else if (funct7 == 7'b1101001 && rs2 == 5'b00010) name = "FCVT.D.L"; - else if (funct7 == 7'b1101001 && rs2 == 5'b00011) name = "FCVT.D.LU"; - else if (funct7 == 7'b0100000 && rs2 == 5'b00001) name = "FCVT.S.D"; - else if (funct7 == 7'b0100001 && rs2 == 5'b00000) name = "FCVT.D.S"; - else if (funct7 == 7'b1110000 && rs2 == 5'b00000) name = "FMV.X.W"; - else if (funct7 == 7'b1111000 && rs2 == 5'b00000) name = "FMV.W.X"; - else if (funct7 == 7'b1110001 && rs2 == 5'b00000) name = "FMV.X.D"; // DOUBLE - else if (funct7 == 7'b1111001 && rs2 == 5'b00000) name = "FMV.D.X"; // DOUBLE - else if (funct7[6:2] == 5'b00100) name = "FSGNJ"; - else if (funct7[6:2] == 5'b00101) name = "FMIN"; - else if (funct7[6:2] == 5'b10100) name = "FLE"; - else name = "ILLEGAL"; - 10'b1010011_001: if (funct7[6:2] == 5'b00000) name = "FADD"; - else if (funct7[6:2] == 5'b00001) name = "FSUB"; - else if (funct7[6:2] == 5'b00010) name = "FMUL"; - else if (funct7[6:2] == 5'b00011) name = "FDIV"; - else if (funct7[6:2] == 5'b01011) name = "FSQRT"; - else if (funct7 == 7'b1100000 && rs2 == 5'b00000) name = "FCVT.W.S"; - else if (funct7 == 7'b1100000 && rs2 == 5'b00001) name = "FCVT.WU.S"; - else if (funct7 == 7'b1100000 && rs2 == 5'b00010) name = "FCVT.L.S"; - else if (funct7 == 7'b1100000 && rs2 == 5'b00011) name = "FCVT.LU.S"; - else if (funct7 == 7'b1101000 && rs2 == 5'b00000) name = "FCVT.S.W"; - else if (funct7 == 7'b1101000 && rs2 == 5'b00001) name = "FCVT.S.WU"; - else if (funct7 == 7'b1101000 && rs2 == 5'b00010) name = "FCVT.S.L"; - else if (funct7 == 7'b1101000 && rs2 == 5'b00011) name = "FCVT.S.LU"; - else if (funct7 == 7'b1100001 && rs2 == 5'b00000) name = "FCVT.W.D"; - else if (funct7 == 7'b1100001 && rs2 == 5'b00001) name = "FCVT.WU.D"; - else if (funct7 == 7'b1100001 && rs2 == 5'b00010) name = "FCVT.L.D"; - else if (funct7 == 7'b1100001 && rs2 == 5'b00011) name = "FCVT.LU.D"; - else if (funct7 == 7'b1101001 && rs2 == 5'b00000) name = "FCVT.D.W"; - else if (funct7 == 7'b1101001 && rs2 == 5'b00001) name = "FCVT.D.WU"; - else if (funct7 == 7'b1101001 && rs2 == 5'b00010) name = "FCVT.D.L"; - else if (funct7 == 7'b1101001 && rs2 == 5'b00011) name = "FCVT.D.LU"; - else if (funct7 == 7'b0100000 && rs2 == 5'b00001) name = "FCVT.S.D"; - else if (funct7 == 7'b0100001 && rs2 == 5'b00000) name = "FCVT.D.S"; - else if (funct7[6:2] == 5'b00100) name = "FSGNJN"; - else if (funct7[6:2] == 5'b00101) name = "FMAX"; - else if (funct7[6:2] == 5'b10100) name = "FLT"; - else if (funct7[6:2] == 5'b11100) name = "FCLASS"; - else name = "ILLEGAL"; - 10'b1010011_010: if (funct7[6:2] == 5'b00000) name = "FADD"; - else if (funct7[6:2] == 5'b00001) name = "FSUB"; - else if (funct7[6:2] == 5'b00010) name = "FMUL"; - else if (funct7[6:2] == 5'b00011) name = "FDIV"; - else if (funct7[6:2] == 5'b01011) name = "FSQRT"; - else if (funct7 == 7'b1100000 && rs2 == 5'b00000) name = "FCVT.W.S"; - else if (funct7 == 7'b1100000 && rs2 == 5'b00001) name = "FCVT.WU.S"; - else if (funct7 == 7'b1100000 && rs2 == 5'b00010) name = "FCVT.L.S"; - else if (funct7 == 7'b1100000 && rs2 == 5'b00011) name = "FCVT.LU.S"; - else if (funct7 == 7'b1101000 && rs2 == 5'b00000) name = "FCVT.S.W"; - else if (funct7 == 7'b1101000 && rs2 == 5'b00001) name = "FCVT.S.WU"; - else if (funct7 == 7'b1101000 && rs2 == 5'b00010) name = "FCVT.S.L"; - else if (funct7 == 7'b1101000 && rs2 == 5'b00011) name = "FCVT.S.LU"; - else if (funct7 == 7'b1100001 && rs2 == 5'b00000) name = "FCVT.W.D"; - else if (funct7 == 7'b1100001 && rs2 == 5'b00001) name = "FCVT.WU.D"; - else if (funct7 == 7'b1100001 && rs2 == 5'b00010) name = "FCVT.L.D"; - else if (funct7 == 7'b1100001 && rs2 == 5'b00011) name = "FCVT.LU.D"; - else if (funct7 == 7'b1101001 && rs2 == 5'b00000) name = "FCVT.D.W"; - else if (funct7 == 7'b1101001 && rs2 == 5'b00001) name = "FCVT.D.WU"; - else if (funct7 == 7'b1101001 && rs2 == 5'b00010) name = "FCVT.D.L"; - else if (funct7 == 7'b1101001 && rs2 == 5'b00011) name = "FCVT.D.LU"; - else if (funct7 == 7'b0100000 && rs2 == 5'b00001) name = "FCVT.S.D"; - else if (funct7 == 7'b0100001 && rs2 == 5'b00000) name = "FCVT.D.S"; - else if (funct7[6:2] == 5'b00100) name = "FSGNJX"; - else if (funct7[6:2] == 5'b10100) name = "FEQ"; - else name = "ILLEGAL"; - 10'b1010011_???: if (funct7[6:2] == 5'b00000) name = "FADD"; - else if (funct7[6:2] == 5'b00001) name = "FSUB"; - else if (funct7[6:2] == 5'b00010) name = "FMUL"; - else if (funct7[6:2] == 5'b00011) name = "FDIV"; - else if (funct7[6:2] == 5'b01011) name = "FSQRT"; - else if (funct7 == 7'b1100000 && rs2 == 5'b00000) name = "FCVT.W.S"; - else if (funct7 == 7'b1100000 && rs2 == 5'b00001) name = "FCVT.WU.S"; - else if (funct7 == 7'b1100000 && rs2 == 5'b00010) name = "FCVT.L.S"; - else if (funct7 == 7'b1100000 && rs2 == 5'b00011) name = "FCVT.LU.S"; - else if (funct7 == 7'b1101000 && rs2 == 5'b00000) name = "FCVT.S.W"; - else if (funct7 == 7'b1101000 && rs2 == 5'b00001) name = "FCVT.S.WU"; - else if (funct7 == 7'b1101000 && rs2 == 5'b00010) name = "FCVT.S.L"; - else if (funct7 == 7'b1101000 && rs2 == 5'b00011) name = "FCVT.S.LU"; - else if (funct7 == 7'b1100001 && rs2 == 5'b00000) name = "FCVT.W.D"; - else if (funct7 == 7'b1100001 && rs2 == 5'b00001) name = "FCVT.WU.D"; - else if (funct7 == 7'b1100001 && rs2 == 5'b00010) name = "FCVT.L.D"; - else if (funct7 == 7'b1100001 && rs2 == 5'b00011) name = "FCVT.LU.D"; - else if (funct7 == 7'b1101001 && rs2 == 5'b00000) name = "FCVT.D.W"; - else if (funct7 == 7'b1101001 && rs2 == 5'b00001) name = "FCVT.D.WU"; - else if (funct7 == 7'b1101001 && rs2 == 5'b00010) name = "FCVT.D.L"; - else if (funct7 == 7'b1101001 && rs2 == 5'b00011) name = "FCVT.D.LU"; - else if (funct7 == 7'b0100000 && rs2 == 5'b00001) name = "FCVT.S.D"; - else if (funct7 == 7'b0100001 && rs2 == 5'b00000) name = "FCVT.D.S"; - else name = "ILLEGAL"; - 10'b0000111_010: name = "FLW"; - 10'b0100111_010: name = "FSW"; - 10'b0000111_011: name = "FLD"; - 10'b0100111_011: name = "FSD"; - default: name = "ILLEGAL"; - endcase -endmodule - -module logging( - input logic clk, reset, - input logic [31:0] HADDR, - input logic [1:0] HTRANS); - - always @(posedge clk) - if (HTRANS != 2'b00 && HADDR == 0) - $display("%t Warning: access to memory address 0\n", $realtime); -endmodule - - module DCacheFlushFSM (input logic clk, input logic reset, @@ -1108,11 +817,6 @@ module DCacheFlushFSM end endgenerate -/* -----\/----- EXCLUDED -----\/----- - .Adr(((testbench.dut.hart.lsu.dcache.CacheWays[way].MemWay.CacheTagMem.StoredData[index] << tagstart) - + (index << logblockbytelen) + (cacheWord << $clog2(`XLEN/8)))), - -----/\----- EXCLUDED -----/\----- */ - integer i, j, k; always @(posedge clk) begin diff --git a/wally-pipelined/testbench/testbench-linux.sv b/wally-pipelined/testbench/testbench-linux.sv index e3bf013a2..051c625a9 100644 --- a/wally-pipelined/testbench/testbench-linux.sv +++ b/wally-pipelined/testbench/testbench-linux.sv @@ -1024,134 +1024,3 @@ module testbench(); endfunction endmodule -//module logging( -// input logic clk, reset, -// input logic [31:0] dut.hart.lsu.dcache.MemPAdrM, -// input logic [1:0] (|dut.hart.lsu.dcache.MemRWM || dut.hart.lsu.dcache.AtomicM)); -// -// always @(posedge clk) -// if ((|dut.hart.lsu.dcache.MemRWM || dut.hart.lsu.dcache.AtomicM) != 2'b00 && dut.hart.lsu.dcache.MemPAdrM == 0) -// $display("Warning: access to memory address 0\n"); -//endmodule - - -module instrTrackerTB( - input logic clk, reset, - input logic [31:0] InstrF,InstrD,InstrE,InstrM,InstrW, - output string InstrFName, InstrDName, InstrEName, InstrMName, InstrWName); - instrNameDecTB fdec(InstrF, InstrFName); - instrNameDecTB ddec(InstrD, InstrDName); - instrNameDecTB edec(InstrE, InstrEName); - instrNameDecTB mdec(InstrM, InstrMName); - instrNameDecTB wdec(InstrW, InstrWName); -endmodule - -// decode the instruction name, to help the test bench -module instrNameDecTB( - input logic [31:0] instr, - output string name); - - logic [6:0] op; - logic [2:0] funct3; - logic [6:0] funct7; - logic [11:0] imm; - - assign op = instr[6:0]; - assign funct3 = instr[14:12]; - assign funct7 = instr[31:25]; - assign imm = instr[31:20]; - - // it would be nice to add the operands to the name - // create another variable called decoded - - always_comb - casez({op, funct3}) - 10'b0000000_000: name = "BAD"; - 10'b0000011_000: name = "LB"; - 10'b0000011_001: name = "LH"; - 10'b0000011_010: name = "LW"; - 10'b0000011_011: name = "LD"; - 10'b0000011_100: name = "LBU"; - 10'b0000011_101: name = "LHU"; - 10'b0000011_110: name = "LWU"; - 10'b0010011_000: if (instr[31:15] == 0 && instr[11:7] ==0) name = "NOP/FLUSH"; - else name = "ADDI"; - 10'b0010011_001: if (funct7[6:1] == 6'b000000) name = "SLLI"; - else name = "ILLEGAL"; - 10'b0010011_010: name = "SLTI"; - 10'b0010011_011: name = "SLTIU"; - 10'b0010011_100: name = "XORI"; - 10'b0010011_101: if (funct7[6:1] == 6'b000000) name = "SRLI"; - else if (funct7[6:1] == 6'b010000) name = "SRAI"; - else name = "ILLEGAL"; - 10'b0010011_110: name = "ORI"; - 10'b0010011_111: name = "ANDI"; - 10'b0010111_???: name = "AUIPC"; - 10'b0100011_000: name = "SB"; - 10'b0100011_001: name = "SH"; - 10'b0100011_010: name = "SW"; - 10'b0100011_011: name = "SD"; - 10'b0011011_000: name = "ADDIW"; - 10'b0011011_001: name = "SLLIW"; - 10'b0011011_101: if (funct7 == 7'b0000000) name = "SRLIW"; - else if (funct7 == 7'b0100000) name = "SRAIW"; - else name = "ILLEGAL"; - 10'b0111011_000: if (funct7 == 7'b0000000) name = "ADDW"; - else if (funct7 == 7'b0100000) name = "SUBW"; - else name = "ILLEGAL"; - 10'b0111011_001: name = "SLLW"; - 10'b0111011_101: if (funct7 == 7'b0000000) name = "SRLW"; - else if (funct7 == 7'b0100000) name = "SRAW"; - else name = "ILLEGAL"; - 10'b0110011_000: if (funct7 == 7'b0000000) name = "ADD"; - else if (funct7 == 7'b0000001) name = "MUL"; - else if (funct7 == 7'b0100000) name = "SUB"; - else name = "ILLEGAL"; - 10'b0110011_001: if (funct7 == 7'b0000000) name = "SLL"; - else if (funct7 == 7'b0000001) name = "MULH"; - else name = "ILLEGAL"; - 10'b0110011_010: if (funct7 == 7'b0000000) name = "SLT"; - else if (funct7 == 7'b0000001) name = "MULHSU"; - else name = "ILLEGAL"; - 10'b0110011_011: if (funct7 == 7'b0000000) name = "SLTU"; - else if (funct7 == 7'b0000001) name = "DIV"; - else name = "ILLEGAL"; - 10'b0110011_100: if (funct7 == 7'b0000000) name = "XOR"; - else if (funct7 == 7'b0000001) name = "MUL"; - else name = "ILLEGAL"; - 10'b0110011_101: if (funct7 == 7'b0000000) name = "SRL"; - else if (funct7 == 7'b0000001) name = "DIVU"; - else if (funct7 == 7'b0100000) name = "SRA"; - else name = "ILLEGAL"; - 10'b0110011_110: if (funct7 == 7'b0000000) name = "OR"; - else if (funct7 == 7'b0000001) name = "REM"; - else name = "ILLEGAL"; - 10'b0110011_111: if (funct7 == 7'b0000000) name = "AND"; - else if (funct7 == 7'b0000001) name = "REMU"; - else name = "ILLEGAL"; - 10'b0110111_???: name = "LUI"; - 10'b1100011_000: name = "BEQ"; - 10'b1100011_001: name = "BNE"; - 10'b1100011_100: name = "BLT"; - 10'b1100011_101: name = "BGE"; - 10'b1100011_110: name = "BLTU"; - 10'b1100011_111: name = "BGEU"; - 10'b1100111_000: name = "JALR"; - 10'b1101111_???: name = "JAL"; - 10'b1110011_000: if (imm == 0) name = "ECALL"; - else if (imm == 1) name = "EBREAK"; - else if (imm == 2) name = "URET"; - else if (imm == 258) name = "SRET"; - else if (imm == 770) name = "MRET"; - else name = "ILLEGAL"; - 10'b1110011_001: name = "CSRRW"; - 10'b1110011_010: name = "CSRRS"; - 10'b1110011_011: name = "CSRRC"; - 10'b1110011_101: name = "CSRRWI"; - 10'b1110011_110: name = "CSRRSI"; - 10'b1110011_111: name = "CSRRCI"; - 10'b0001111_???: name = "FENCE"; - default: name = "ILLEGAL"; - endcase -endmodule - diff --git a/wally-pipelined/testbench/testbench-privileged.sv b/wally-pipelined/testbench/testbench-privileged.sv index c8ba0abea..335223b26 100644 --- a/wally-pipelined/testbench/testbench-privileged.sv +++ b/wally-pipelined/testbench/testbench-privileged.sv @@ -217,162 +217,3 @@ endmodule /* verilator lint_on STMTDLY */ /* verilator lint_on WIDTH */ -module instrTrackerTBPriv( - input logic clk, reset, FlushE, - input logic [31:0] InstrF, InstrD, - input logic [31:0] InstrE, InstrM, - input logic [31:0] InstrW, -// output logic [31:0] InstrW, - output string InstrFName, InstrDName, InstrEName, InstrMName, InstrWName); - - // stage Instr to Writeback for visualization - //flopr #(32) InstrWReg(clk, reset, InstrM, InstrW); - - - instrNameDecTB fdec(InstrF, InstrFName); - instrNameDecTB ddec(InstrD, InstrDName); - instrNameDecTB edec(InstrE, InstrEName); - instrNameDecTB mdec(InstrM, InstrMName); - instrNameDecTB wdec(InstrW, InstrWName); -endmodule - -// decode the instruction name, to help the test bench -module instrNameDecTB( - input logic [31:0] instr, - output string name); - - logic [6:0] op; - logic [2:0] funct3; - logic [6:0] funct7; - logic [11:0] imm; - - assign op = instr[6:0]; - assign funct3 = instr[14:12]; - assign funct7 = instr[31:25]; - assign imm = instr[31:20]; - - // it would be nice to add the operands to the name - // create another variable called decoded - - always_comb - casez({op, funct3}) - 10'b0000000_000: name = "BAD"; - 10'b0000011_000: name = "LB"; - 10'b0000011_001: name = "LH"; - 10'b0000011_010: name = "LW"; - 10'b0000011_011: name = "LD"; - 10'b0000011_100: name = "LBU"; - 10'b0000011_101: name = "LHU"; - 10'b0000011_110: name = "LWU"; - 10'b0010011_000: if (instr[31:15] == 0 && instr[11:7] ==0) name = "NOP/FLUSH"; - else name = "ADDI"; - 10'b0010011_001: if (funct7[6:1] == 6'b000000) name = "SLLI"; - else name = "ILLEGAL"; - 10'b0010011_010: name = "SLTI"; - 10'b0010011_011: name = "SLTIU"; - 10'b0010011_100: name = "XORI"; - 10'b0010011_101: if (funct7[6:1] == 6'b000000) name = "SRLI"; - else if (funct7[6:1] == 6'b010000) name = "SRAI"; - else name = "ILLEGAL"; - 10'b0010011_110: name = "ORI"; - 10'b0010011_111: name = "ANDI"; - 10'b0010111_???: name = "AUIPC"; - 10'b0100011_000: name = "SB"; - 10'b0100011_001: name = "SH"; - 10'b0100011_010: name = "SW"; - 10'b0100011_011: name = "SD"; - 10'b0011011_000: name = "ADDIW"; - 10'b0011011_001: name = "SLLIW"; - 10'b0011011_101: if (funct7 == 7'b0000000) name = "SRLIW"; - else if (funct7 == 7'b0100000) name = "SRAIW"; - else name = "ILLEGAL"; - 10'b0111011_000: if (funct7 == 7'b0000000) name = "ADDW"; - else if (funct7 == 7'b0100000) name = "SUBW"; - else if (funct7 == 7'b0000001) name = "MULW"; - else name = "ILLEGAL"; - 10'b0111011_001: if (funct7 == 7'b0000000) name = "SLLW"; - else if (funct7 == 7'b0000001) name = "DIVW"; - else name = "ILLEGAL"; - 10'b0111011_101: if (funct7 == 7'b0000000) name = "SRLW"; - else if (funct7 == 7'b0100000) name = "SRAW"; - else if (funct7 == 7'b0000001) name = "DIVUW"; - else name = "ILLEGAL"; - 10'b0111011_110: if (funct7 == 7'b0000001) name = "REMW"; - else name = "ILLEGAL"; - 10'b0111011_111: if (funct7 == 7'b0000001) name = "REMUW"; - else name = "ILLEGAL"; - 10'b0110011_000: if (funct7 == 7'b0000000) name = "ADD"; - else if (funct7 == 7'b0000001) name = "MUL"; - else if (funct7 == 7'b0100000) name = "SUB"; - else name = "ILLEGAL"; - 10'b0110011_001: if (funct7 == 7'b0000000) name = "SLL"; - else if (funct7 == 7'b0000001) name = "MULH"; - else name = "ILLEGAL"; - 10'b0110011_010: if (funct7 == 7'b0000000) name = "SLT"; - else if (funct7 == 7'b0000001) name = "MULHSU"; - else name = "ILLEGAL"; - 10'b0110011_011: if (funct7 == 7'b0000000) name = "SLTU"; - else if (funct7 == 7'b0000001) name = "MULHU"; - else name = "ILLEGAL"; - 10'b0110011_100: if (funct7 == 7'b0000000) name = "XOR"; - else if (funct7 == 7'b0000001) name = "DIV"; - else name = "ILLEGAL"; - 10'b0110011_101: if (funct7 == 7'b0000000) name = "SRL"; - else if (funct7 == 7'b0000001) name = "DIVU"; - else if (funct7 == 7'b0100000) name = "SRA"; - else name = "ILLEGAL"; - 10'b0110011_110: if (funct7 == 7'b0000000) name = "OR"; - else if (funct7 == 7'b0000001) name = "REM"; - else name = "ILLEGAL"; - 10'b0110011_111: if (funct7 == 7'b0000000) name = "AND"; - else if (funct7 == 7'b0000001) name = "REMU"; - else name = "ILLEGAL"; - 10'b0110111_???: name = "LUI"; - 10'b1100011_000: name = "BEQ"; - 10'b1100011_001: name = "BNE"; - 10'b1100011_100: name = "BLT"; - 10'b1100011_101: name = "BGE"; - 10'b1100011_110: name = "BLTU"; - 10'b1100011_111: name = "BGEU"; - 10'b1100111_000: name = "JALR"; - 10'b1101111_???: name = "JAL"; - 10'b1110011_000: if (imm == 0) name = "ECALL"; - else if (imm == 1) name = "EBREAK"; - else if (imm == 2) name = "URET"; - else if (imm == 258) name = "SRET"; - else if (imm == 770) name = "MRET"; - else name = "ILLEGAL"; - 10'b1110011_001: name = "CSRRW"; - 10'b1110011_010: name = "CSRRS"; - 10'b1110011_011: name = "CSRRC"; - 10'b1110011_101: name = "CSRRWI"; - 10'b1110011_110: name = "CSRRSI"; - 10'b1110011_111: name = "CSRRCI"; - 10'b0101111_010: if (funct7[6:2] == 5'b00010) name = "LR.W"; - else if (funct7[6:2] == 5'b00011) name = "SC.W"; - else if (funct7[6:2] == 5'b00001) name = "AMOSWAP.W"; - else if (funct7[6:2] == 5'b00000) name = "AMOADD.W"; - else if (funct7[6:2] == 5'b00100) name = "AMOAXOR.W"; - else if (funct7[6:2] == 5'b01100) name = "AMOAND.W"; - else if (funct7[6:2] == 5'b01000) name = "AMOOR.W"; - else if (funct7[6:2] == 5'b10000) name = "AMOMIN.W"; - else if (funct7[6:2] == 5'b10100) name = "AMOMAX.W"; - else if (funct7[6:2] == 5'b11000) name = "AMOMINU.W"; - else if (funct7[6:2] == 5'b11100) name = "AMOMAXU.W"; - else name = "ILLEGAL"; - 10'b0101111_011: if (funct7[6:2] == 5'b00010) name = "LR.D"; - else if (funct7[6:2] == 5'b00011) name = "SC.D"; - else if (funct7[6:2] == 5'b00001) name = "AMOSWAP.D"; - else if (funct7[6:2] == 5'b00000) name = "AMOADD.D"; - else if (funct7[6:2] == 5'b00100) name = "AMOAXOR.D"; - else if (funct7[6:2] == 5'b01100) name = "AMOAND.D"; - else if (funct7[6:2] == 5'b01000) name = "AMOOR.D"; - else if (funct7[6:2] == 5'b10000) name = "AMOMIN.D"; - else if (funct7[6:2] == 5'b10100) name = "AMOMAX.D"; - else if (funct7[6:2] == 5'b11000) name = "AMOMINU.D"; - else if (funct7[6:2] == 5'b11100) name = "AMOMAXU.D"; - else name = "ILLEGAL"; - 10'b0001111_???: name = "FENCE"; - default: name = "ILLEGAL"; - endcase -endmodule