Added counter mechanism for wild jumps

This commit is contained in:
Franz Fuchs
2021-06-11 10:47:15 +01:00
parent c51af07278
commit dce934500d
3 changed files with 32 additions and 1 deletions

View File

@@ -1141,7 +1141,17 @@ 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);
//Vector #(16, Bit #(Report_Width)) trans_exe_evts_vec = to_large_vector (renameStage.events);
EventsTransExe transExe = renameStage.events;
Bit#(Report_Width) wildJumps = 0;
for(Integer i = 0; i < valueof(AluExeNum); i = i+1) begin
let alu_events = coreFix.aluExeIfc[i].events;
wildJumps = wildJumps + alu_events.evt_WILD_JUMP;
end
transExe.evt_EXECUTED_INSTS = executedInsts;
Vector #(16, Bit #(Report_Width)) trans_exe_evts_vec = to_large_vector (transExe);
let events = append (null_evt, core_evts_vec);
events = append (events, imem_evts_vec);

View File

@@ -205,6 +205,10 @@ interface AluExePipeline;
interface ReservationStationAlu rsAluIfc;
interface SpeculationUpdate specUpdate;
method Data getPerf(ExeStagePerfType t);
`ifdef PERFORMANCE_MONITORING
method EventsTransExe events;
`endif
endinterface
module mkAluExePipeline#(AluExeInput inIfc)(AluExePipeline);
@@ -223,6 +227,10 @@ module mkAluExePipeline#(AluExeInput inIfc)(AluExePipeline);
Integer exeSendBypassPort = 0;
Integer finishSendBypassPort = 1;
`ifdef PERFORMANCE_MONITORING
Reg#(EventsTransExe) events_reg <- mkDReg(unpack(0));
`endif
`ifdef PERF_COUNT
// performance counters
Count#(Data) exeRedirectBrCnt <- mkCount(0);
@@ -285,7 +293,19 @@ module mkAluExePipeline#(AluExeInput inIfc)(AluExePipeline);
let ppc = inIfc.rob_getPredPC(x.tag);
let orig_inst = inIfc.rob_getOrig_Inst (x.tag);
`ifdef PERFORMANCE_MONITORING
let res = inIfc.checkTarget(ppc);
if(!res) begin
let ppc_addr = getAddr(ppc);
let pc_addr = getAddr(pc);
if((ppc != pc + 2) || (ppc != pc + 4)) begin
$display("Not a previous target: pc = ", fshow(pc), ", ppc = ", fshow(ppc));
EventsTransExe events = unpack(0);
events.evt_WILD_JUMP = 1;
events_reg <= events;
end
end
`endif
// go to next stage
regToExeQ.enq(ToSpecFifo {

View File

@@ -1123,6 +1123,7 @@ typedef TDiv#(SizeOf#(EventsCoreMem),Report_Width) EventsCoreMemElements;
typedef struct {
SupCnt evt_RENAMED_INST;
SupCnt evt_WILD_JUMP;
} EventsTransExe deriving (Bits, FShow);
typedef TDiv#(SizeOf#(EventsTransExe),SizeOf#(SupCnt)) EventsTransExeElements;
`endif