Added counter mechanism for wild jumps
This commit is contained in:
@@ -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);
|
||||
|
||||
@@ -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 {
|
||||
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user