forked from Github_Repos/cvw
		
	Wally previously was overcounting retired instructions when they were flushed.
InstrValidM was used to control when the counter was updated. However this is not suppress the counter when the instruction is flushed in the M stage.
This commit is contained in:
		
							parent
							
								
									9fdcc6c9ca
								
							
						
					
					
						commit
						c31b7b4dc5
					
				| @ -33,7 +33,8 @@ module csr #(parameter | ||||
|   UIE_REGW = 12'b0 | ||||
|   ) ( | ||||
|   input  logic             clk, reset, | ||||
|   input  logic             FlushW, StallD, StallE, StallM, StallW, | ||||
|   input  logic             FlushD, FlushE, FlushM, FlushW, | ||||
|   input  logic             StallD, StallE, StallM, StallW, | ||||
|   input  logic [31:0]      InstrD,InstrE,InstrM,  | ||||
|   input  logic [`XLEN-1:0] PCF, PCD, PCE, PCM, SrcAM, | ||||
|   input  logic             InterruptM, | ||||
|  | ||||
| @ -72,6 +72,7 @@ module csrc #(parameter | ||||
| ) ( | ||||
|     input logic 	     clk, reset, | ||||
|     input logic 	     StallD, StallE, StallM, StallW, | ||||
|     input  logic             FlushD, FlushE, FlushM, FlushW,    | ||||
|     input logic 	     InstrValidM, LoadStallD, CSRMWriteM, | ||||
|     input logic 	     BPPredDirWrongM, | ||||
|     input logic 	     BTBPredPCWrongM, | ||||
| @ -103,6 +104,10 @@ module csrc #(parameter | ||||
|       logic        WriteHPMCOUNTER3M, WriteHPMCOUNTER4M; | ||||
|       logic [4:0]  CounterNumM; | ||||
|       logic [`COUNTERS-1:3][`XLEN-1:0] HPMCOUNTER_REGW, HPMCOUNTERH_REGW; | ||||
|       logic 			       InstrValidNotFlushedM; | ||||
| 
 | ||||
|       assign InstrValidNotFlushedM = InstrValidM & ~StallW & ~FlushW; | ||||
|        | ||||
|       //logic [`COUNTERS-1:3][`XLEN-1:0] HPMCOUNTERH_REGW;
 | ||||
| 
 | ||||
|       // Write enables
 | ||||
| @ -116,7 +121,7 @@ module csrc #(parameter | ||||
|       // Counter adders with inhibits for power savings
 | ||||
|       assign CYCLEPlusM = CYCLE_REGW + {63'b0, ~MCOUNTINHIBIT_REGW[0]}; | ||||
|       //assign TIMEPlusM = TIME_REGW + 1; // can't be inhibited
 | ||||
|       assign INSTRETPlusM = INSTRET_REGW + {63'b0, InstrValidM & ~StallW & ~MCOUNTINHIBIT_REGW[2]}; | ||||
|       assign INSTRETPlusM = INSTRET_REGW + {63'b0, InstrValidNotFlushedM & ~MCOUNTINHIBIT_REGW[2]}; | ||||
|       //assign HPMCOUNTER3PlusM = HPMCOUNTER3_REGW + {63'b0, LoadStallD & ~MCOUNTINHIBIT_REGW[3]}; // count load stalls
 | ||||
|       //assign HPMCOUNTER4PlusM = HPMCOUNTER4_REGW + {63'b0, 1'b0 & ~MCOUNTINHIBIT_REGW[4]}; // change to count signals
 | ||||
|       assign NextCYCLEM = WriteCYCLEM ? CSRWriteValM : CYCLEPlusM[`XLEN-1:0]; | ||||
| @ -139,17 +144,23 @@ module csrc #(parameter | ||||
|       if(`QEMU) begin | ||||
|         assign CounterEvent[`COUNTERS-1:2] = 0; | ||||
|       end else begin | ||||
|         assign CounterEvent[2] = InstrValidM & ~StallW; | ||||
|         assign CounterEvent[3] = LoadStallD & ~StallD; | ||||
|         assign CounterEvent[4] = BPPredDirWrongM & ~StallM; | ||||
|         assign CounterEvent[5] = InstrClassM[0] & ~StallM; | ||||
|         assign CounterEvent[6] = BTBPredPCWrongM & ~StallM; | ||||
|         assign CounterEvent[7] = (InstrClassM[4] | InstrClassM[2] | InstrClassM[1]) & ~StallM; | ||||
|         assign CounterEvent[8] = RASPredPCWrongM & ~StallM; | ||||
|         assign CounterEvent[9] = InstrClassM[3] & ~StallM; | ||||
|         assign CounterEvent[10] = BPPredClassNonCFIWrongM & ~StallM; | ||||
|         assign CounterEvent[11] = DCacheAccess & ~StallM; | ||||
|         assign CounterEvent[12] = DCacheMiss & ~StallM;       | ||||
| 
 | ||||
| 	logic LoadStallE, LoadStallM; | ||||
| 	 | ||||
| 	flopenrc #(1) LoadStallEReg(.clk, .reset, .clear(FlushE), .en(~StallE), .d(LoadStallD), .q(LoadStallE)); | ||||
| 	flopenrc #(1) LoadStallMReg(.clk, .reset, .clear(FlushM), .en(~StallM), .d(LoadStallE), .q(LoadStallM));	 | ||||
| 	 | ||||
|         assign CounterEvent[2] = InstrValidNotFlushedM; | ||||
|         assign CounterEvent[3] = LoadStallM & InstrValidNotFlushedM; | ||||
|         assign CounterEvent[4] = BPPredDirWrongM & InstrValidNotFlushedM; | ||||
|         assign CounterEvent[5] = InstrClassM[0] & InstrValidNotFlushedM; | ||||
|         assign CounterEvent[6] = BTBPredPCWrongM & InstrValidNotFlushedM; | ||||
|         assign CounterEvent[7] = (InstrClassM[4] | InstrClassM[2] | InstrClassM[1]) & InstrValidNotFlushedM; | ||||
|         assign CounterEvent[8] = RASPredPCWrongM & InstrValidNotFlushedM; | ||||
|         assign CounterEvent[9] = InstrClassM[3] & InstrValidNotFlushedM; | ||||
|         assign CounterEvent[10] = BPPredClassNonCFIWrongM & InstrValidNotFlushedM; | ||||
|         assign CounterEvent[11] = DCacheAccess & InstrValidNotFlushedM; | ||||
|         assign CounterEvent[12] = DCacheMiss & InstrValidNotFlushedM;       | ||||
|         assign CounterEvent[`COUNTERS-1:13] = 0; // eventually give these sources, including FP instructions, I$/D$ misses, branches and mispredictions
 | ||||
|       end | ||||
|        | ||||
|  | ||||
| @ -25,7 +25,7 @@ | ||||
| 
 | ||||
| `include "wally-config.vh" | ||||
| 
 | ||||
| `define DEBUG_TRACE 1 | ||||
| `define DEBUG_TRACE 0 | ||||
| `define DontHaltOnCSRMisMatch 1 | ||||
| 
 | ||||
| module testbench(); | ||||
| @ -129,6 +129,7 @@ module testbench(); | ||||
|   integer 	    NumCSRWIndex; | ||||
|   integer 	    NumCSRPostWIndex;     | ||||
| //  logic 	    CurrentInterruptForce;
 | ||||
|   logic [`XLEN-1:0] InstrCountW; | ||||
|    | ||||
|   // -----------
 | ||||
|   // Error Macro
 | ||||
| @ -139,6 +140,7 @@ module testbench(); | ||||
| 
 | ||||
|   initial begin | ||||
|     data_file_all = $fopen({`LINUX_TEST_VECTORS,"all.txt"}, "r"); | ||||
|     InstrCountW = '0; | ||||
|   end | ||||
| 
 | ||||
| /* -----\/----- EXCLUDED -----\/----- | ||||
| @ -350,6 +352,7 @@ module testbench(); | ||||
|   always @(negedge clk) begin | ||||
|     // always check PC, instruction bits
 | ||||
|     if (checkInstrW) begin | ||||
|       InstrCountW += 1; | ||||
|       // check PCW
 | ||||
|       fault = 0; | ||||
|       if(PCW != ExpectedPCW) begin | ||||
| @ -363,6 +366,11 @@ module testbench(); | ||||
| 	fault = 1; | ||||
|       end | ||||
| 
 | ||||
|       // check the number of instructions
 | ||||
|       if(dut.hart.priv.csr.genblk1.counters.genblk1.INSTRET_REGW != InstrCountW) begin | ||||
| 	$display("%t, Number of instruction Retired = %d does not equal number of instructions in trace = %d", $time, dut.hart.priv.csr.genblk1.counters.genblk1.INSTRET_REGW, InstrCountW); | ||||
| 	if(!`DontHaltOnCSRMisMatch) fault = 1; | ||||
|       end | ||||
|        | ||||
|       #2; // delay 2 ns.
 | ||||
| 
 | ||||
| @ -427,7 +435,7 @@ module testbench(); | ||||
| 	      $display("CSR: %s = %016x, expected = %016x", ExpectedCSRArrayW[NumCSRPostWIndex], dut.hart.priv.csr.genblk1.csrm.MHARTID_REGW, ExpectedCSRArrayValueW[NumCSRPostWIndex]);	       | ||||
| 	    end  | ||||
| 	    if (dut.hart.priv.csr.genblk1.csrm.MHARTID_REGW != ExpectedCSRArrayValueW[NumCSRPostWIndex]) begin | ||||
| 	      $display("CSR: %s = %016x, does not equal expected value %016x", ExpectedCSRArrayW[NumCSRPostWIndex], dut.hart.priv.csr.genblk1.csrm.MHARTID_REGW, ExpectedCSRArrayValueW[NumCSRPostWIndex]);	       | ||||
| 	      $display("%t, CSR: %s = %016x, does not equal expected value %016x", $time, ExpectedCSRArrayW[NumCSRPostWIndex], dut.hart.priv.csr.genblk1.csrm.MHARTID_REGW, ExpectedCSRArrayValueW[NumCSRPostWIndex]);	       | ||||
| 	      if(!`DontHaltOnCSRMisMatch) fault = 1; | ||||
| 	    end | ||||
| 	  end | ||||
| @ -436,7 +444,7 @@ module testbench(); | ||||
| 	      $display("CSR: %s = %016x, expected = %016x", ExpectedCSRArrayW[NumCSRPostWIndex], dut.hart.priv.csr.genblk1.csrm.MSTATUS_REGW, ExpectedCSRArrayValueW[NumCSRPostWIndex]); | ||||
| 	    end | ||||
| 	    if ((dut.hart.priv.csr.genblk1.csrm.MSTATUS_REGW) != (ExpectedCSRArrayValueW[NumCSRPostWIndex])) begin | ||||
| 	      $display("CSR: %s = %016x, does not equal expected value %016x", ExpectedCSRArrayW[NumCSRPostWIndex], dut.hart.priv.csr.genblk1.csrm.MSTATUS_REGW, ExpectedCSRArrayValueW[NumCSRPostWIndex]); | ||||
| 	      $display("%t, CSR: %s = %016x, does not equal expected value %016x", $time, ExpectedCSRArrayW[NumCSRPostWIndex], dut.hart.priv.csr.genblk1.csrm.MSTATUS_REGW, ExpectedCSRArrayValueW[NumCSRPostWIndex]); | ||||
| 	      if(!`DontHaltOnCSRMisMatch) fault = 1; | ||||
| 	    end | ||||
| 	  end | ||||
| @ -445,7 +453,7 @@ module testbench(); | ||||
| 	      $display("CSR: %s = %016x, expected = %016x", ExpectedCSRArrayW[NumCSRPostWIndex], dut.hart.priv.csr.genblk1.csrm.MTVEC_REGW, ExpectedCSRArrayValueW[NumCSRPostWIndex]); | ||||
| 	    end | ||||
| 	    if (dut.hart.priv.csr.genblk1.csrm.MTVEC_REGW != ExpectedCSRArrayValueW[NumCSRPostWIndex]) begin | ||||
| 	      $display("CSR: %s = %016x, does not equal expected value %016x", ExpectedCSRArrayW[NumCSRPostWIndex], dut.hart.priv.csr.genblk1.csrm.MTVEC_REGW, ExpectedCSRArrayValueW[NumCSRPostWIndex]); | ||||
| 	      $display("%t, CSR: %s = %016x, does not equal expected value %016x", $time, ExpectedCSRArrayW[NumCSRPostWIndex], dut.hart.priv.csr.genblk1.csrm.MTVEC_REGW, ExpectedCSRArrayValueW[NumCSRPostWIndex]); | ||||
| 	      if(!`DontHaltOnCSRMisMatch) fault = 1; | ||||
| 	    end | ||||
| 	  end | ||||
| @ -454,7 +462,7 @@ module testbench(); | ||||
| 	      $display("CSR: %s = %016x, expected = %016x", ExpectedCSRArrayW[NumCSRPostWIndex], dut.hart.priv.csr.genblk1.csrm.MIP_REGW, ExpectedCSRArrayValueW[NumCSRPostWIndex]); | ||||
| 	    end | ||||
| 	    if (dut.hart.priv.csr.genblk1.csrm.MIP_REGW != ExpectedCSRArrayValueW[NumCSRPostWIndex]) begin | ||||
| 	      $display("CSR: %s = %016x, does not equal expected value %016x", ExpectedCSRArrayW[NumCSRPostWIndex], dut.hart.priv.csr.genblk1.csrm.MIP_REGW, ExpectedCSRArrayValueW[NumCSRPostWIndex]); | ||||
| 	      $display("%t, CSR: %s = %016x, does not equal expected value %016x", $time, ExpectedCSRArrayW[NumCSRPostWIndex], dut.hart.priv.csr.genblk1.csrm.MIP_REGW, ExpectedCSRArrayValueW[NumCSRPostWIndex]); | ||||
| 	      if(!`DontHaltOnCSRMisMatch) fault = 1; | ||||
| 	    end | ||||
| 	  end | ||||
| @ -463,7 +471,7 @@ module testbench(); | ||||
| 	      $display("CSR: %s = %016x, expected = %016x", ExpectedCSRArrayW[NumCSRPostWIndex], dut.hart.priv.csr.genblk1.csrm.MIE_REGW, ExpectedCSRArrayValueW[NumCSRPostWIndex]); | ||||
| 	    end | ||||
| 	    if (dut.hart.priv.csr.genblk1.csrm.MIE_REGW != ExpectedCSRArrayValueW[NumCSRPostWIndex]) begin | ||||
| 	      $display("CSR: %s = %016x, does not equal expected value %016x", ExpectedCSRArrayW[NumCSRPostWIndex], dut.hart.priv.csr.genblk1.csrm.MIE_REGW, ExpectedCSRArrayValueW[NumCSRPostWIndex]); | ||||
| 	      $display("%t, CSR: %s = %016x, does not equal expected value %016x", $time, ExpectedCSRArrayW[NumCSRPostWIndex], dut.hart.priv.csr.genblk1.csrm.MIE_REGW, ExpectedCSRArrayValueW[NumCSRPostWIndex]); | ||||
| 	      if(!`DontHaltOnCSRMisMatch) fault = 1; | ||||
| 	    end | ||||
| 	  end | ||||
| @ -472,7 +480,7 @@ module testbench(); | ||||
| 	      $display("CSR: %s = %016x, expected = %016x", ExpectedCSRArrayW[NumCSRPostWIndex], dut.hart.priv.csr.genblk1.csrm.MIDELEG_REGW, ExpectedCSRArrayValueW[NumCSRPostWIndex]); | ||||
| 	    end | ||||
| 	    if (dut.hart.priv.csr.genblk1.csrm.MIDELEG_REGW != ExpectedCSRArrayValueW[NumCSRPostWIndex]) begin | ||||
| 	      $display("CSR: %s = %016x, does not equal expected value %016x", ExpectedCSRArrayW[NumCSRPostWIndex], dut.hart.priv.csr.genblk1.csrm.MIDELEG_REGW, ExpectedCSRArrayValueW[NumCSRPostWIndex]); | ||||
| 	      $display("%t, CSR: %s = %016x, does not equal expected value %016x", $time, ExpectedCSRArrayW[NumCSRPostWIndex], dut.hart.priv.csr.genblk1.csrm.MIDELEG_REGW, ExpectedCSRArrayValueW[NumCSRPostWIndex]); | ||||
| 	      if(!`DontHaltOnCSRMisMatch) fault = 1; | ||||
| 	    end | ||||
| 	  end | ||||
| @ -481,7 +489,7 @@ module testbench(); | ||||
| 	      $display("CSR: %s = %016x, expected = %016x", ExpectedCSRArrayW[NumCSRPostWIndex], dut.hart.priv.csr.genblk1.csrm.MEDELEG_REGW, ExpectedCSRArrayValueW[NumCSRPostWIndex]); | ||||
| 	    end | ||||
| 	    if (dut.hart.priv.csr.genblk1.csrm.MEDELEG_REGW != ExpectedCSRArrayValueW[NumCSRPostWIndex]) begin | ||||
| 	      $display("CSR: %s = %016x, does not equal expected value %016x", ExpectedCSRArrayW[NumCSRPostWIndex], dut.hart.priv.csr.genblk1.csrm.MEDELEG_REGW, ExpectedCSRArrayValueW[NumCSRPostWIndex]); | ||||
| 	      $display("%t, CSR: %s = %016x, does not equal expected value %016x", $time, ExpectedCSRArrayW[NumCSRPostWIndex], dut.hart.priv.csr.genblk1.csrm.MEDELEG_REGW, ExpectedCSRArrayValueW[NumCSRPostWIndex]); | ||||
| 	      if(!`DontHaltOnCSRMisMatch) fault = 1; | ||||
| 	    end | ||||
| 	  end | ||||
| @ -490,7 +498,7 @@ module testbench(); | ||||
| 	      $display("CSR: %s = %016x, expected = %016x", ExpectedCSRArrayW[NumCSRPostWIndex], dut.hart.priv.csr.genblk1.csrm.MEPC_REGW, ExpectedCSRArrayValueW[NumCSRPostWIndex]); | ||||
| 	    end | ||||
| 	    if (dut.hart.priv.csr.genblk1.csrm.MEPC_REGW != ExpectedCSRArrayValueW[NumCSRPostWIndex]) begin | ||||
| 	      $display("CSR: %s = %016x, does not equal expected value %016x", ExpectedCSRArrayW[NumCSRPostWIndex], dut.hart.priv.csr.genblk1.csrm.MEPC_REGW, ExpectedCSRArrayValueW[NumCSRPostWIndex]); | ||||
| 	      $display("%t, CSR: %s = %016x, does not equal expected value %016x", $time, ExpectedCSRArrayW[NumCSRPostWIndex], dut.hart.priv.csr.genblk1.csrm.MEPC_REGW, ExpectedCSRArrayValueW[NumCSRPostWIndex]); | ||||
| 	      if(!`DontHaltOnCSRMisMatch) fault = 1; | ||||
| 	    end | ||||
| 	  end | ||||
| @ -500,7 +508,7 @@ module testbench(); | ||||
| 	      $display("CSR: %s = %016x, expected = %016x", ExpectedCSRArrayW[NumCSRPostWIndex], dut.hart.priv.csr.genblk1.csrm.MTVAL_REGW, ExpectedCSRArrayValueW[NumCSRPostWIndex]); | ||||
| 	    end | ||||
| 	    if (dut.hart.priv.csr.genblk1.csrm.MTVAL_REGW != ExpectedCSRArrayValueW[NumCSRPostWIndex]) begin | ||||
| 	      $display("CSR: %s = %016x, does not equal expected value %016x", ExpectedCSRArrayW[NumCSRPostWIndex], dut.hart.priv.csr.genblk1.csrm.MTVAL_REGW, ExpectedCSRArrayValueW[NumCSRPostWIndex]); | ||||
| 	      $display("%t, CSR: %s = %016x, does not equal expected value %016x", $time, ExpectedCSRArrayW[NumCSRPostWIndex], dut.hart.priv.csr.genblk1.csrm.MTVAL_REGW, ExpectedCSRArrayValueW[NumCSRPostWIndex]); | ||||
| 	      if(!`DontHaltOnCSRMisMatch) fault = 1; | ||||
| 	    end | ||||
| 	  end | ||||
| @ -510,7 +518,7 @@ module testbench(); | ||||
| 	      $display("CSR: %s = %016x, expected = %016x", ExpectedCSRArrayW[NumCSRPostWIndex], dut.hart.priv.csr.genblk1.csrs.SEPC_REGW, ExpectedCSRArrayValueW[NumCSRPostWIndex]); | ||||
| 	    end | ||||
| 	    if (dut.hart.priv.csr.genblk1.csrs.SEPC_REGW != ExpectedCSRArrayValueW[NumCSRPostWIndex]) begin | ||||
| 	      $display("CSR: %s = %016x, does not equal expected value %016x", ExpectedCSRArrayW[NumCSRPostWIndex], dut.hart.priv.csr.genblk1.csrs.SEPC_REGW, ExpectedCSRArrayValueW[NumCSRPostWIndex]); | ||||
| 	      $display("%t, CSR: %s = %016x, does not equal expected value %016x", $time, ExpectedCSRArrayW[NumCSRPostWIndex], dut.hart.priv.csr.genblk1.csrs.SEPC_REGW, ExpectedCSRArrayValueW[NumCSRPostWIndex]); | ||||
| 	      if(!`DontHaltOnCSRMisMatch) fault = 1; | ||||
| 	    end | ||||
| 	  end | ||||
| @ -519,7 +527,7 @@ module testbench(); | ||||
| 	      $display("CSR: %s = %016x, expected = %016x", ExpectedCSRArrayW[NumCSRPostWIndex], dut.hart.priv.csr.genblk1.csrs.genblk1.SCAUSE_REGW, ExpectedCSRArrayValueW[NumCSRPostWIndex]); | ||||
| 	    end | ||||
| 	    if (dut.hart.priv.csr.genblk1.csrs.genblk1.SCAUSE_REGW != ExpectedCSRArrayValueW[NumCSRPostWIndex]) begin | ||||
| 	      $display("CSR: %s = %016x, does not equal expected value %016x", ExpectedCSRArrayW[NumCSRPostWIndex], dut.hart.priv.csr.genblk1.csrs.genblk1.SCAUSE_REGW, ExpectedCSRArrayValueW[NumCSRPostWIndex]); | ||||
| 	      $display("%t, CSR: %s = %016x, does not equal expected value %016x", $time, ExpectedCSRArrayW[NumCSRPostWIndex], dut.hart.priv.csr.genblk1.csrs.genblk1.SCAUSE_REGW, ExpectedCSRArrayValueW[NumCSRPostWIndex]); | ||||
| 	      if(!`DontHaltOnCSRMisMatch) fault = 1; | ||||
| 	    end | ||||
| 	  end | ||||
| @ -528,7 +536,7 @@ module testbench(); | ||||
| 	      $display("CSR: %s = %016x, expected = %016x", ExpectedCSRArrayW[NumCSRPostWIndex], dut.hart.priv.csr.genblk1.csrs.STVEC_REGW, ExpectedCSRArrayValueW[NumCSRPostWIndex]); | ||||
| 	    end | ||||
| 	    if (dut.hart.priv.csr.genblk1.csrs.STVEC_REGW != ExpectedCSRArrayValueW[NumCSRPostWIndex]) begin | ||||
| 	      $display("CSR: %s = %016x, does not equal expected value %016x", ExpectedCSRArrayW[NumCSRPostWIndex], dut.hart.priv.csr.genblk1.csrs.STVEC_REGW, ExpectedCSRArrayValueW[NumCSRPostWIndex]); | ||||
| 	      $display("%t, CSR: %s = %016x, does not equal expected value %016x", $time, ExpectedCSRArrayW[NumCSRPostWIndex], dut.hart.priv.csr.genblk1.csrs.STVEC_REGW, ExpectedCSRArrayValueW[NumCSRPostWIndex]); | ||||
| 	      if(!`DontHaltOnCSRMisMatch) fault = 1; | ||||
| 	    end | ||||
| 	  end | ||||
| @ -537,7 +545,7 @@ module testbench(); | ||||
| 	      $display("CSR: %s = %016x, expected = %016x", ExpectedCSRArrayW[NumCSRPostWIndex], dut.hart.priv.csr.genblk1.csrs.genblk1.STVAL_REGW, ExpectedCSRArrayValueW[NumCSRPostWIndex]); | ||||
| 	    end | ||||
| 	    if (dut.hart.priv.csr.genblk1.csrs.genblk1.STVAL_REGW != ExpectedCSRArrayValueW[NumCSRPostWIndex]) begin | ||||
| 	      $display("CSR: %s = %016x, does not equal expected value %016x", ExpectedCSRArrayW[NumCSRPostWIndex], dut.hart.priv.csr.genblk1.csrs.genblk1.STVAL_REGW, ExpectedCSRArrayValueW[NumCSRPostWIndex]); | ||||
| 	      $display("%t, CSR: %s = %016x, does not equal expected value %016x", $time, ExpectedCSRArrayW[NumCSRPostWIndex], dut.hart.priv.csr.genblk1.csrs.genblk1.STVAL_REGW, ExpectedCSRArrayValueW[NumCSRPostWIndex]); | ||||
| 	      if(!`DontHaltOnCSRMisMatch) fault = 1; | ||||
| 	    end | ||||
| 	  end | ||||
|  | ||||
		Loading…
	
		Reference in New Issue
	
	Block a user