Merge branch 'cheri-perfmon' into CHERI

This commit is contained in:
jon
2020-12-04 16:29:51 +00:00
7 changed files with 322 additions and 16 deletions

View File

@@ -43,6 +43,7 @@ import Vector::*;
import GetPut::*;
import Cntrs::*;
import ConfigReg::*;
import DReg::*;
import FIFO::*;
import FIFOF::*;
import Types::*;
@@ -161,6 +162,9 @@ interface CommitStage;
method Bool is_debug_halted;
method Action debug_resume;
`endif
`ifdef PERFORMANCE_MONITORING
method EventsCore events;
`endif
`ifdef DEBUG_WEDGE
(* always_enabled *)
method Tuple2#(CapMem, Bit#(32)) debugLastInst;
@@ -410,6 +414,10 @@ module mkCommitStage#(CommitInput inIfc)(CommitStage);
Count#(Data) flushCacheCnt <- mkCount(0);
`endif
`ifdef PERFORMANCE_MONITORING
Reg#(EventsCore) events_reg <- mkDReg(unpack(0));
`endif
`ifdef RVFI
// RVFI trace report. Not an input?
FIFO#(Rvfi_Traces) rvfiQ <- mkFIFO;
@@ -988,6 +996,13 @@ module mkCommitStage#(CommitInput inIfc)(CommitStage);
end
end
`endif
`ifdef PERFORMANCE_MONITORING
EventsCore events = unpack(0);
case(x.iType)
Fence, FenceI, SFence: events.evt_FENCE = 1;
endcase
events_reg <= events;
`endif
`ifdef CHECK_DEADLOCK
commitInst.send;
if(csrf.decodeInfo.prv == 0) begin
@@ -1060,7 +1075,6 @@ module mkCommitStage#(CommitInput inIfc)(CommitStage);
// incr committed inst cnt at the end of rule
SupCnt comInstCnt = 0;
SupCnt comUserInstCnt = 0;
`ifdef PERF_COUNT
// incr some performance counter at the end of rule
SupCnt brCnt = 0;
SupCnt jmpCnt = 0;
@@ -1070,7 +1084,10 @@ module mkCommitStage#(CommitInput inIfc)(CommitStage);
SupCnt lrCnt = 0;
SupCnt scCnt = 0;
SupCnt amoCnt = 0;
`endif
SupCnt shiftCnt = 0;
SupCnt muldivCnt = 0;
SupCnt auipcCnt = 0;
SupCnt fenceCnt = 0;
`ifdef RVFI
Rvfi_Traces rvfis = replicate(tagged Invalid);
@@ -1170,9 +1187,24 @@ module mkCommitStage#(CommitInput inIfc)(CommitStage);
comUserInstCnt = comUserInstCnt + 1; // user space inst
end
`ifdef PERF_COUNT
// performance counter
// performance counters
// Some fields of the original instruction to help with classification.
let inst = x.orig_inst;
Opcode opcode = unpackOpcode(inst[ 6 : 0 ]);
let funct3 = inst[ 14 : 12 ];
let funct7 = inst[ 31 : 25 ];
// For "F" and "D" ISA extensions
let funct5 = inst[ 31 : 27 ];
let fmt = inst[ 26 : 25 ];
let rs3 = inst[ 31 : 27 ];
let funct2 = inst[ 26 : 25 ];
// For "A" ISA extension
Bool aq = unpack(inst[ 26 ]);
Bool rl = unpack(inst[ 25 ]);
// For "xCHERI" ISA extension
let funct5rs2 = inst[ 24 : 20 ];
case(x.iType)
Auipc, Auipcc: auipcCnt = auipcCnt + 1;
Br: brCnt = brCnt + 1;
J : jmpCnt = jmpCnt + 1;
Jr: jrCnt = jrCnt + 1;
@@ -1181,8 +1213,14 @@ module mkCommitStage#(CommitInput inIfc)(CommitStage);
Lr: lrCnt = lrCnt + 1;
Sc: scCnt = scCnt + 1;
Amo: amoCnt = amoCnt + 1;
Alu: begin
if (((opcode == opcOpImm) || (opcode == opcOpImm32) || (opcode == opcOp)) && ((funct3 == fnSLL) || (funct3 == fnSR)))
shiftCnt = shiftCnt + 1;
if ((opcode == opcOp || opcode == opcOp32) && funct7 == opMULDIV)
muldivCnt = muldivCnt + 1;
end
endcase
`endif
if (opcode == opcMiscMem && funct3 == fnFENCE) fenceCnt = fenceCnt + 1;
end
end
end
@@ -1235,6 +1273,22 @@ module mkCommitStage#(CommitInput inIfc)(CommitStage);
end
end
`endif
`ifdef PERFORMANCE_MONITORING
EventsCore events = unpack(0);
events.evt_BRANCH = brCnt;
events.evt_JAL = jmpCnt;
events.evt_JALR = jrCnt;
events.evt_AUIPC = auipcCnt; // XXX
events.evt_LOAD = ldCnt;
events.evt_STORE = stCnt;
events.evt_LR = lrCnt;
events.evt_SC = scCnt;
events.evt_AMO = amoCnt;
events.evt_SERIAL_SHIFT = shiftCnt;
events.evt_INT_MUL_DIV_REM = muldivCnt;
events.evt_FENCE = fenceCnt;
events_reg <= events;
`endif
`ifdef RVFI
rvfiQ.enq(rvfis);
traceCnt <= traceCnt + zeroExtend(whichTrace);
@@ -1309,6 +1363,10 @@ module mkCommitStage#(CommitInput inIfc)(CommitStage);
endmethod
`endif
`ifdef PERFORMANCE_MONITORING
method events = events_reg;
`endif
`ifdef DEBUG_WEDGE
method Tuple2#(CapMem, Bit#(32)) debugLastInst;
return tuple2(rg_last_pcc, rg_last_inst);

View File

@@ -37,6 +37,101 @@
`CSR(MIP, 12'h344)
`CSR(MCYCLE, 12'hb00)
`CSR(MINSTRET, 12'hb02)
`ifdef PERFORMANCE_MONITORING
`CSR(HPMCOUNTER3, 12'hc03)
`CSR(HPMCOUNTER4, 12'hc04)
`CSR(HPMCOUNTER5, 12'hc05)
`CSR(HPMCOUNTER6, 12'hc06)
`CSR(HPMCOUNTER7, 12'hc07)
`CSR(HPMCOUNTER8, 12'hc08)
`CSR(HPMCOUNTER9, 12'hc09)
`CSR(HPMCOUNTER10, 12'hc0a)
`CSR(HPMCOUNTER11, 12'hc0b)
`CSR(HPMCOUNTER12, 12'hc0c)
`CSR(HPMCOUNTER13, 12'hc0d)
`CSR(HPMCOUNTER14, 12'hc0e)
`CSR(HPMCOUNTER15, 12'hc0f)
`CSR(HPMCOUNTER16, 12'hc10)
`CSR(HPMCOUNTER17, 12'hc11)
`CSR(HPMCOUNTER18, 12'hc12)
`CSR(HPMCOUNTER19, 12'hc13)
`CSR(HPMCOUNTER20, 12'hc14)
`CSR(HPMCOUNTER21, 12'hc15)
`CSR(HPMCOUNTER22, 12'hc16)
`CSR(HPMCOUNTER23, 12'hc17)
`CSR(HPMCOUNTER24, 12'hc18)
`CSR(HPMCOUNTER25, 12'hc19)
`CSR(HPMCOUNTER26, 12'hc1a)
`CSR(HPMCOUNTER27, 12'hc1b)
`CSR(HPMCOUNTER28, 12'hc1c)
`CSR(HPMCOUNTER29, 12'hc1d)
`CSR(HPMCOUNTER30, 12'hc1e)
`CSR(HPMCOUNTER31, 12'hc1f)
`CSR(MHPMCOUNTER3, 12'hb03)
`CSR(MHPMCOUNTER4, 12'hb04)
`CSR(MHPMCOUNTER5, 12'hb05)
`CSR(MHPMCOUNTER6, 12'hb06)
`CSR(MHPMCOUNTER7, 12'hb07)
`CSR(MHPMCOUNTER8, 12'hb08)
`CSR(MHPMCOUNTER9, 12'hb09)
`CSR(MHPMCOUNTER10, 12'hb0a)
`CSR(MHPMCOUNTER11, 12'hb0b)
`CSR(MHPMCOUNTER12, 12'hb0c)
`CSR(MHPMCOUNTER13, 12'hb0d)
`CSR(MHPMCOUNTER14, 12'hb0e)
`CSR(MHPMCOUNTER15, 12'hb0f)
`CSR(MHPMCOUNTER16, 12'hb10)
`CSR(MHPMCOUNTER17, 12'hb11)
`CSR(MHPMCOUNTER18, 12'hb12)
`CSR(MHPMCOUNTER19, 12'hb13)
`CSR(MHPMCOUNTER20, 12'hb14)
`CSR(MHPMCOUNTER21, 12'hb15)
`CSR(MHPMCOUNTER22, 12'hb16)
`CSR(MHPMCOUNTER23, 12'hb17)
`CSR(MHPMCOUNTER24, 12'hb18)
`CSR(MHPMCOUNTER25, 12'hb19)
`CSR(MHPMCOUNTER26, 12'hb1a)
`CSR(MHPMCOUNTER27, 12'hb1b)
`CSR(MHPMCOUNTER28, 12'hb1c)
`CSR(MHPMCOUNTER29, 12'hb1d)
`CSR(MHPMCOUNTER30, 12'hb1e)
`CSR(MHPMCOUNTER31, 12'hb1f)
`CSR(MCOUNTERINHIBIT, 12'h320) // Machine Counter-Inhibit
`CSR(MHPMEVENT3, 12'h323)
`CSR(MHPMEVENT4, 12'h324)
`CSR(MHPMEVENT5, 12'h325)
`CSR(MHPMEVENT6, 12'h326)
`CSR(MHPMEVENT7, 12'h327)
`CSR(MHPMEVENT8, 12'h328)
`CSR(MHPMEVENT9, 12'h329)
`CSR(MHPMEVENT10, 12'h32a)
`CSR(MHPMEVENT11, 12'h32b)
`CSR(MHPMEVENT12, 12'h32c)
`CSR(MHPMEVENT13, 12'h32d)
`CSR(MHPMEVENT14, 12'h32e)
`CSR(MHPMEVENT15, 12'h32f)
`CSR(MHPMEVENT16, 12'h330)
`CSR(MHPMEVENT17, 12'h331)
`CSR(MHPMEVENT18, 12'h332)
`CSR(MHPMEVENT19, 12'h333)
`CSR(MHPMEVENT20, 12'h334)
`CSR(MHPMEVENT21, 12'h335)
`CSR(MHPMEVENT22, 12'h336)
`CSR(MHPMEVENT23, 12'h337)
`CSR(MHPMEVENT24, 12'h338)
`CSR(MHPMEVENT25, 12'h339)
`CSR(MHPMEVENT26, 12'h33a)
`CSR(MHPMEVENT27, 12'h33b)
`CSR(MHPMEVENT28, 12'h33c)
`CSR(MHPMEVENT29, 12'h33d)
`CSR(MHPMEVENT30, 12'h33e)
`CSR(MHPMEVENT31, 12'h33f)
`endif // PERFORMANCE_MONITORING
`CSR(MVENDORID, 12'hf11)
`CSR(MARCHID, 12'hf12)
`CSR(MIMPID, 12'hf13)

View File

@@ -1040,3 +1040,43 @@ function Fmt showInst(Instruction inst);
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 96 No_Of_Evts;
typedef 8 Report_Width;
typedef 64 Counter_Width;
typedef 29 No_Of_Ctrs;
typedef struct {
SupCnt evt_REDIRECT;
SupCnt evt_TLB_EXC; // TODO: Misleading name
SupCnt evt_BRANCH;
SupCnt evt_JAL;
SupCnt evt_JALR;
SupCnt evt_AUIPC;
SupCnt evt_LOAD;
SupCnt evt_STORE;
SupCnt evt_LR;
SupCnt evt_SC;
SupCnt evt_AMO;
SupCnt evt_SERIAL_SHIFT;
SupCnt evt_INT_MUL_DIV_REM;
SupCnt evt_FP;
SupCnt evt_SC_SUCCESS;
SupCnt evt_LOAD_WAIT;
SupCnt evt_STORE_WAIT;
SupCnt evt_FENCE;
SupCnt evt_F_BUSY_NO_CONSUME;
SupCnt evt_D_BUSY_NO_CONSUME;
SupCnt evt_1_BUSY_NO_CONSUME;
SupCnt evt_2_BUSY_NO_CONSUME;
SupCnt evt_3_BUSY_NO_CONSUME;
SupCnt evt_IMPRECISE_SETBOUND;
SupCnt evt_UNREPRESENTABLE_CAP;
SupCnt evt_MEM_CAP_LOAD;
SupCnt evt_MEM_CAP_STORE;
SupCnt evt_MEM_CAP_LOAD_TAG_SET;
SupCnt evt_MEM_CAP_STORE_TAG_SET;
} EventsCore deriving (Bits, FShow);
typedef TDiv#(SizeOf#(EventsCore),SizeOf#(SupCnt)) EventsCoreElements;
`endif