forked from Github_Repos/cvw
Possible improvement to gshare.
This commit is contained in:
parent
76a9e7d963
commit
4c78bcade8
@ -108,7 +108,7 @@ module bpred (
|
|||||||
speculativegshare DirPredictor(.clk, .reset, .StallF, .StallD, .StallE, .StallM, .StallW, .FlushD, .FlushE, .FlushM, .FlushW,
|
speculativegshare DirPredictor(.clk, .reset, .StallF, .StallD, .StallE, .StallM, .StallW, .FlushD, .FlushE, .FlushM, .FlushW,
|
||||||
.PCNextF, .PCF, .PCD, .PCE, .PCM, .DirPredictionF, .DirPredictionWrongE,
|
.PCNextF, .PCF, .PCD, .PCE, .PCM, .DirPredictionF, .DirPredictionWrongE,
|
||||||
.BranchInstrF(PredInstrClassF[0]), .BranchInstrD(InstrClassD[0]), .BranchInstrE(InstrClassE[0]), .BranchInstrM(InstrClassM[0]),
|
.BranchInstrF(PredInstrClassF[0]), .BranchInstrD(InstrClassD[0]), .BranchInstrE(InstrClassE[0]), .BranchInstrM(InstrClassM[0]),
|
||||||
.BranchInstrW(InstrClassW[0]), .PCSrcE);
|
.BranchInstrW(InstrClassW[0]), .WrongPredInstrClassD, .PCSrcE);
|
||||||
|
|
||||||
end else if (`BPTYPE == "BPLOCALPAg") begin:Predictor
|
end else if (`BPTYPE == "BPLOCALPAg") begin:Predictor
|
||||||
// *** Fix me
|
// *** Fix me
|
||||||
|
@ -41,6 +41,7 @@ module speculativegshare
|
|||||||
// update
|
// update
|
||||||
input logic [`XLEN-1:0] PCNextF, PCF, PCD, PCE, PCM,
|
input logic [`XLEN-1:0] PCNextF, PCF, PCD, PCE, PCM,
|
||||||
input logic BranchInstrF, BranchInstrD, BranchInstrE, BranchInstrM, BranchInstrW,
|
input logic BranchInstrF, BranchInstrD, BranchInstrE, BranchInstrM, BranchInstrW,
|
||||||
|
input logic [3:0] WrongPredInstrClassD,
|
||||||
input logic PCSrcE
|
input logic PCSrcE
|
||||||
);
|
);
|
||||||
|
|
||||||
@ -53,7 +54,8 @@ module speculativegshare
|
|||||||
logic [k-1:0] GHRF;
|
logic [k-1:0] GHRF;
|
||||||
logic [k:0] GHRD, OldGHRE, GHRE, GHRM, GHRW;
|
logic [k:0] GHRD, OldGHRE, GHRE, GHRM, GHRW;
|
||||||
logic [k-1:0] GHRNextF;
|
logic [k-1:0] GHRNextF;
|
||||||
logic [k:0] GHRNextD, GHRNextE, GHRNextM, GHRNextW;
|
logic [k:-1] GHRNextD, OldGHRD;
|
||||||
|
logic [k:0] GHRNextE, GHRNextM, GHRNextW;
|
||||||
logic [k-1:0] IndexNextF, IndexF;
|
logic [k-1:0] IndexNextF, IndexF;
|
||||||
logic [k-1:0] IndexD, IndexE, IndexM;
|
logic [k-1:0] IndexD, IndexE, IndexM;
|
||||||
|
|
||||||
@ -118,8 +120,11 @@ module speculativegshare
|
|||||||
|
|
||||||
flopenr #(k) GHRFReg(clk, reset, (~StallF) | FlushD, GHRNextF, GHRF);
|
flopenr #(k) GHRFReg(clk, reset, (~StallF) | FlushD, GHRNextF, GHRF);
|
||||||
|
|
||||||
assign GHRNextD = FlushD ? GHRNextE : {DirPredictionF[1], GHRF};
|
assign GHRNextD = FlushD ? {GHRNextE, GHRNextE[0]} : {DirPredictionF[1], GHRF, GHRF[0]};
|
||||||
flopenr #(k+1) GHRDReg(clk, reset, (~StallD) | FlushD, GHRNextD, GHRD);
|
flopenr #(k+2) GHRDReg(clk, reset, (~StallD) | FlushD, GHRNextD, OldGHRD);
|
||||||
|
assign GHRD = WrongPredInstrClassD[0] & BranchInstrD ? {DirPredictionD[1], OldGHRD[k:1]} : // shift right
|
||||||
|
WrongPredInstrClassD[0] & ~BranchInstrD ? OldGHRD[k-2:-1] : // shift left
|
||||||
|
OldGHRD;
|
||||||
|
|
||||||
assign GHRNextE = FlushE ? GHRNextM : GHRD;
|
assign GHRNextE = FlushE ? GHRNextM : GHRD;
|
||||||
flopenr #(k+1) GHREReg(clk, reset, (~StallE) | FlushE, GHRNextE, OldGHRE);
|
flopenr #(k+1) GHREReg(clk, reset, (~StallE) | FlushE, GHRNextE, OldGHRE);
|
||||||
|
Loading…
Reference in New Issue
Block a user