Added microarchitectural counter for renamed instructions

This counter is used for the SBC Condition 1 verification
This commit is contained in:
Franz Fuchs
2021-06-08 13:18:57 +01:00
parent c1cdd9e5e1
commit 914eb17550
3 changed files with 38 additions and 2 deletions

View File

@@ -238,6 +238,10 @@ instance BitVectorable #(EventsCoreMem, SizeOf#(HpmRpt), EventsCoreMemElements)
function Vector#(EventsCoreMemElements, HpmRpt) to_vector(EventsCoreMem e) =
reverse(unpack(pack(e)));
endinstance
instance BitVectorable #(EventsTransExe, SizeOf#(SupCnt), EventsTransExeElements) provisos (Bits #(EventsTransExe, m));
function Vector#(EventsTransExeElements, SupCnt) to_vector(EventsTransExe e) =
reverse(unpack(pack(e)));
endinstance
instance BitVectorable #(EventsCache, SizeOf#(HpmRpt), EventsCacheElements) provisos (Bits #(EventsCache, m));
function Vector#(EventsCacheElements, HpmRpt) to_vector(EventsCache e) =
reverse(unpack(pack(e)));
@@ -1116,12 +1120,14 @@ module mkCore#(CoreId coreId)(Core);
Vector #(32, Bit #(Report_Width)) tgc_evts_vec = to_large_vector (events_tgc_reg);
EventsCache llMem = unpack(pack(events_llc_reg) | pack(l2Tlb.events));
Vector #(16, Bit #(Report_Width)) llc_evts_vec = to_large_vector (llMem);
Vector #(16, Bit #(Report_Width)) trans_exe_evts_vec = to_large_vector (renameStage.events);
let events = append (null_evt, core_evts_vec);
events = append (events, imem_evts_vec);
events = append (events, dmem_evts_vec);
events = append (events, tgc_evts_vec);
events = append (events, llc_evts_vec);
events = append (events, trans_exe_evts_vec);
(* fire_when_enabled, no_implicit_conditions *)
rule rl_send_perf_evts;

View File

@@ -45,6 +45,7 @@ import Fifos::*;
import FIFO::*;
import Types::*;
import ProcTypes::*;
import DReg::*;
import CCTypes::*;
import SynthParam::*;
import Performance::*;
@@ -104,6 +105,11 @@ endinterface
interface RenameStage;
// performance count
method Data getPerf(ExeStagePerfType t);
`ifdef PERFORMANCE_MONITORING
method EventsTransExe events;
`endif
// deadlock check
interface Get#(RenameStuck) renameInstStuck;
interface Get#(RenameStuck) renameCorrectPathStuck;
@@ -140,7 +146,9 @@ module mkRenameStage#(RenameInput inIfc)(RenameStage);
Count#(Data) specNonMemCycles <- mkCount(0);
`endif
`endif
`ifdef PERFORMANCE_MONITORING
Reg#(EventsTransExe) events_reg <- mkDReg(unpack(0));
`endif
// deadlock check
`ifdef CHECK_DEADLOCK
// timer to check deadlock
@@ -579,6 +587,13 @@ module mkRenameStage#(RenameInput inIfc)(RenameStage);
};
rob.enqPort[0].enq(y);
`ifdef PERFORMANCE_MONITORING
EventsTransExe events = unpack(0);
$display("Rename-SysInst: 1");
events.evt_RENAMED_INST = 1;
events_reg <= events;
`endif
// record if we issue an CSR inst. TODO also for SCRs?
if(dInst.iType == Csr) begin
inIfc.issueCsrInstOrInterrupt;
@@ -1161,6 +1176,12 @@ module mkRenameStage#(RenameInput inIfc)(RenameStage);
end
end
`endif
`ifdef PERFORMANCE_MONITORING
EventsTransExe events = unpack(0);
$display("Rename-NormalInst count:", fshow(renameCnt));
events.evt_RENAMED_INST = renameCnt;
events_reg <= events;
`endif
`ifdef CHECK_DEADLOCK
if(doCorrectPath) begin
@@ -1191,6 +1212,10 @@ module mkRenameStage#(RenameInput inIfc)(RenameStage);
endcase);
endmethod
`ifdef PERFORMANCE_MONITORING
method events = events_reg;
`endif
`ifdef INCLUDE_GDB_CONTROL
method Action debug_halt_req () if (rg_m_halt_req == tagged Invalid);
rg_m_halt_req <= tagged Valid intrDebugHalt;

View File

@@ -1049,7 +1049,7 @@ endfunction
function x addPc(x cap, Bit#(12) inc) provisos (Add#(f, 12, c), CHERICap::CHERICap#(x, a, b, c, d, e)) = setAddrUnsafe(cap, getAddr(cap) + signExtend(inc));
`ifdef PERFORMANCE_MONITORING
typedef 112 No_Of_Evts;
typedef 128 No_Of_Evts;
typedef 8 Report_Width;
typedef 64 Counter_Width;
typedef 29 No_Of_Ctrs;
@@ -1120,6 +1120,11 @@ typedef struct {
HpmRpt evt_MEM_CAP_STORE_TAG_SET;
} EventsCoreMem deriving (Bits, FShow); // Memory needs more space for reporting delays
typedef TDiv#(SizeOf#(EventsCoreMem),Report_Width) EventsCoreMemElements;
typedef struct {
SupCnt evt_RENAMED_INST;
} EventsTransExe deriving (Bits, FShow);
typedef TDiv#(SizeOf#(EventsTransExe),SizeOf#(SupCnt)) EventsTransExeElements;
`endif
function Bit#(outWidth) hash(Bit#(inWidth) in)