From 0324329ed92f61cf183befaf901e7fce9dc1297e Mon Sep 17 00:00:00 2001 From: Noah Boorstin Date: Mon, 26 Apr 2021 14:34:38 -0400 Subject: [PATCH 1/2] linux: start using internal branch predictor signal --- wally-pipelined/regression/wave-dos/busybear-waves.do | 3 ++- wally-pipelined/testbench/testbench-busybear.sv | 5 +++-- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/wally-pipelined/regression/wave-dos/busybear-waves.do b/wally-pipelined/regression/wave-dos/busybear-waves.do index 1ce0cf48..e8bcc3bd 100644 --- a/wally-pipelined/regression/wave-dos/busybear-waves.do +++ b/wally-pipelined/regression/wave-dos/busybear-waves.do @@ -21,6 +21,7 @@ add wave -hex /testbench/dut/hart/ifu/InstrRawD add wave /testbench/CheckInstrD add wave /testbench/lastCheckInstrD add wave /testbench/speculative +add wave /testbench/dut/hart/ifu/bpred/BPPredWrongE add wave /testbench/lastPC2 add wave -divider add wave -divider @@ -125,4 +126,4 @@ configure wave -snapdistance 10 configure wave -datasetprefix 0 configure wave -rowmargin 4 configure wave -childrowmargin 2 -set DefaultRadix hexadecimal \ No newline at end of file +set DefaultRadix hexadecimal diff --git a/wally-pipelined/testbench/testbench-busybear.sv b/wally-pipelined/testbench/testbench-busybear.sv index 93ebbdd1..1a2aa678 100644 --- a/wally-pipelined/testbench/testbench-busybear.sv +++ b/wally-pipelined/testbench/testbench-busybear.sv @@ -554,12 +554,13 @@ module testbench(); endcase //check things! - if ((~speculative) && (~equal(dut.hart.ifu.PCD,pcExpected,3))) begin + if ((~dut.hart.ifu.bpred.BPPredWrongE) && (~equal(dut.hart.ifu.PCD,pcExpected,3))) begin + //if ((~speculative) && (~equal(dut.hart.ifu.PCD,pcExpected,3))) begin $display("%0t ps, instr %0d: PC does not equal PC expected: %x, %x", $time, instrs, dut.hart.ifu.PCD, pcExpected); `ERROR end InstrMask = CheckInstrD[1:0] == 2'b11 ? 32'hFFFFFFFF : 32'h0000FFFF; - if ((~forcedInstr) && (~speculative) && ((InstrMask & dut.hart.ifu.InstrRawD) !== (InstrMask & CheckInstrD))) begin + if ((~forcedInstr) && (~dut.hart.ifu.bpred.BPPredWrongE) && ((InstrMask & dut.hart.ifu.InstrRawD) !== (InstrMask & CheckInstrD))) begin $display("%0t ps, instr %0d: InstrD does not equal CheckInstrD: %x, %x, PC: %x", $time, instrs, dut.hart.ifu.InstrRawD, CheckInstrD, dut.hart.ifu.PCD); `ERROR end From ff1a6b63ed5794164a3a407dc25716f70f034364 Mon Sep 17 00:00:00 2001 From: Noah Boorstin Date: Mon, 26 Apr 2021 14:38:05 -0400 Subject: [PATCH 2/2] ok but do that better --- .../testbench/testbench-busybear.sv | 48 +++++++++---------- 1 file changed, 24 insertions(+), 24 deletions(-) diff --git a/wally-pipelined/testbench/testbench-busybear.sv b/wally-pipelined/testbench/testbench-busybear.sv index 1a2aa678..3236bfc5 100644 --- a/wally-pipelined/testbench/testbench-busybear.sv +++ b/wally-pipelined/testbench/testbench-busybear.sv @@ -531,36 +531,36 @@ module testbench(); end instrs += 1; // are we at a branch/jump? - casex (lastCheckInstrD[31:0]) - 32'b00000000001000000000000001110011, // URET - 32'b00010000001000000000000001110011, // SRET - 32'b00110000001000000000000001110011, // MRET - 32'bXXXXXXXXXXXXXXXXXXXXXXXXX1101111, // JAL - 32'bXXXXXXXXXXXXXXXXXXXXXXXXX1100111, // JALR - 32'bXXXXXXXXXXXXXXXXXXXXXXXXX1100011, // B - 32'bXXXXXXXXXXXXXXXX110XXXXXXXXXXX01, // C.BEQZ - 32'bXXXXXXXXXXXXXXXX111XXXXXXXXXXX01, // C.BNEZ - 32'bXXXXXXXXXXXXXXXX101XXXXXXXXXXX01: // C.J - speculative = 1; - 32'bXXXXXXXXXXXXXXXX1001000000000010, // C.EBREAK: - 32'bXXXXXXXXXXXXXXXXX000XXXXX1110011: // Something that's not CSRR* - speculative = 0; // tbh don't really know what should happen here - 32'b000110000000XXXXXXXXXXXXX1110011, // CSR* SATP, * - 32'bXXXXXXXXXXXXXXXX1000XXXXX0000010, // C.JR - 32'bXXXXXXXXXXXXXXXX1001XXXXX0000010: // C.JALR //this is RV64 only so no C.JAL - speculative = 1; - default: - speculative = 0; - endcase + //casex (lastCheckInstrD[31:0]) + // 32'b00000000001000000000000001110011, // URET + // 32'b00010000001000000000000001110011, // SRET + // 32'b00110000001000000000000001110011, // MRET + // 32'bXXXXXXXXXXXXXXXXXXXXXXXXX1101111, // JAL + // 32'bXXXXXXXXXXXXXXXXXXXXXXXXX1100111, // JALR + // 32'bXXXXXXXXXXXXXXXXXXXXXXXXX1100011, // B + // 32'bXXXXXXXXXXXXXXXX110XXXXXXXXXXX01, // C.BEQZ + // 32'bXXXXXXXXXXXXXXXX111XXXXXXXXXXX01, // C.BNEZ + // 32'bXXXXXXXXXXXXXXXX101XXXXXXXXXXX01: // C.J + // speculative = 1; + // 32'bXXXXXXXXXXXXXXXX1001000000000010, // C.EBREAK: + // 32'bXXXXXXXXXXXXXXXXX000XXXXX1110011: // Something that's not CSRR* + // speculative = 0; // tbh don't really know what should happen here + // 32'b000110000000XXXXXXXXXXXXX1110011, // CSR* SATP, * + // 32'bXXXXXXXXXXXXXXXX1000XXXXX0000010, // C.JR + // 32'bXXXXXXXXXXXXXXXX1001XXXXX0000010: // C.JALR //this is RV64 only so no C.JAL + // speculative = 1; + // default: + // speculative = 0; + //endcase + speculative = dut.hart.ifu.bpred.BPPredWrongE; //check things! - if ((~dut.hart.ifu.bpred.BPPredWrongE) && (~equal(dut.hart.ifu.PCD,pcExpected,3))) begin - //if ((~speculative) && (~equal(dut.hart.ifu.PCD,pcExpected,3))) begin + if ((~speculative) && (~equal(dut.hart.ifu.PCD,pcExpected,3))) begin $display("%0t ps, instr %0d: PC does not equal PC expected: %x, %x", $time, instrs, dut.hart.ifu.PCD, pcExpected); `ERROR end InstrMask = CheckInstrD[1:0] == 2'b11 ? 32'hFFFFFFFF : 32'h0000FFFF; - if ((~forcedInstr) && (~dut.hart.ifu.bpred.BPPredWrongE) && ((InstrMask & dut.hart.ifu.InstrRawD) !== (InstrMask & CheckInstrD))) begin + if ((~forcedInstr) && (~speculative) && ((InstrMask & dut.hart.ifu.InstrRawD) !== (InstrMask & CheckInstrD))) begin $display("%0t ps, instr %0d: InstrD does not equal CheckInstrD: %x, %x, PC: %x", $time, instrs, dut.hart.ifu.InstrRawD, CheckInstrD, dut.hart.ifu.PCD); `ERROR end