PC counts branch instructions

This commit is contained in:
Shreya Sanghai 2021-03-23 14:25:51 -04:00
parent 789c189260
commit 09b90557f7
5 changed files with 28 additions and 6 deletions

View File

@ -47,6 +47,8 @@ module ifu (
input logic [`XLEN-1:0] PrivilegedNextPCM,
output logic [31:0] InstrD, InstrM,
output logic [`XLEN-1:0] PCM,
output logic [3:0] InstrClassM,
output logic BPPredWrongM,
// Writeback
// output logic [`XLEN-1:0] PCLinkW,
// Faults
@ -206,6 +208,20 @@ module ifu (
.d(InstrClassD),
.q(InstrClassE));
flopenrc #(4) InstrClassRegM(.clk(clk),
.reset(reset),
.en(~StallM),
.clear(FlushM),
.d(InstrClassE),
.q(InstrClassM));
flopenrc #(1) BPPredWrongRegM(.clk(clk),
.reset(reset),
.en(~StallM),
.clear(FlushM),
.d(BPPredWrongE),
.q(BPPredWrongM));
// seems like there should be a lower-cost way of doing this PC+2 or PC+4 for JAL.
// either have ALU compute PC+2/4 and feed into ALUResult input of ResultMux or
// have dedicated adder in Mem stage based on PCM + 2 or 4

View File

@ -33,7 +33,8 @@ module csr (
input logic [`XLEN-1:0] PCM, SrcAM,
input logic CSRReadM, CSRWriteM, TrapM, MTrapM, STrapM, UTrapM, mretM, sretM, uretM,
input logic TimerIntM, ExtIntM, SwIntM,
input logic InstrValidW, FloatRegWriteW, LoadStallD, BPPredWrongE,
input logic InstrValidW, FloatRegWriteW, LoadStallD, BPPredWrongM,
input logic [3:0] InstrClassM,
input logic [1:0] NextPrivilegeModeM, PrivilegeModeW,
input logic [`XLEN-1:0] CauseM, NextFaultMtvalM,
output logic [1:0] STATUS_MPP,

View File

@ -29,7 +29,8 @@
module csrc (
input logic clk, reset,
input logic InstrValidW, LoadStallD, CSRMWriteM, BPPredWrongE,
input logic InstrValidW, LoadStallD, CSRMWriteM, BPPredWrongM,
input logic [3:0] InstrClassM,
input logic [11:0] CSRAdrM,
input logic [1:0] PrivilegeModeW,
input logic [`XLEN-1:0] CSRWriteValM,
@ -62,8 +63,9 @@ module csrc (
assign MCOUNTEN[1] = 1'b0;
assign MCOUNTEN[2] = InstrValidW;
assign MCOUNTEN[3] = LoadStallD;
assign MCOUNTEN[4] = BPPredWrongE;
assign MCOUNTEN[`COUNTERS:5] = 0;
assign MCOUNTEN[4] = BPPredWrongM;
assign MCOUNTEN[5] = InstrClassM[0];
assign MCOUNTEN[`COUNTERS:6] = 0;
genvar j;
generate

View File

@ -36,7 +36,8 @@ module privileged (
output logic [`XLEN-1:0] CSRReadValW,
output logic [`XLEN-1:0] PrivilegedNextPCM,
output logic RetM, TrapM,
input logic InstrValidW, FloatRegWriteW, LoadStallD, BPPredWrongE,
input logic InstrValidW, FloatRegWriteW, LoadStallD, BPPredWrongM,
input logic [3:0] InstrClassM,
input logic PrivilegedM,
input logic InstrMisalignedFaultM, InstrAccessFaultF, IllegalIEUInstrFaultD,
input logic LoadMisalignedFaultM, LoadAccessFaultM,

View File

@ -110,7 +110,9 @@ module wallypipelinedhart (
logic InstrReadF;
logic DataStall, InstrStall;
logic InstrAckD, MemAckW;
logic BPPredWrongE;
logic BPPredWrongE, BPPredWrongM;
logic [3:0] InstrClassM;
ifu ifu(.InstrInF(InstrRData), .*); // instruction fetch unit: PC, branch prediction, instruction cache