forked from Github_Repos/cvw
Completed critical path gshare fix.
This commit is contained in:
parent
c2021927ce
commit
d030d323fd
@ -108,14 +108,14 @@ module bpred (
|
|||||||
|
|
||||||
end else if (`BPRED_TYPE == "BP_GSHARE") begin:Predictor
|
end else if (`BPRED_TYPE == "BP_GSHARE") begin:Predictor
|
||||||
gshare #(`BPRED_SIZE) DirPredictor(.clk, .reset, .StallF, .StallD, .StallE, .StallM, .StallW, .FlushD, .FlushE, .FlushM, .FlushW,
|
gshare #(`BPRED_SIZE) DirPredictor(.clk, .reset, .StallF, .StallD, .StallE, .StallM, .StallW, .FlushD, .FlushE, .FlushM, .FlushW,
|
||||||
.PCNextF, .PCF, .PCD, .PCE, .PCM, .DirPredictionF, .DirPredictionWrongE,
|
.PCNextF, .PCF, .PCD, .PCE, .PCM, .PCW, .DirPredictionF, .DirPredictionWrongE,
|
||||||
.BPBranchF, .BranchD, .BranchE, .BranchM,
|
.BPBranchF, .BranchD, .BranchE, .BranchM, .BranchW,
|
||||||
.PCSrcE);
|
.PCSrcE);
|
||||||
|
|
||||||
end else if (`BPRED_TYPE == "BP_GLOBAL") begin:Predictor
|
end else if (`BPRED_TYPE == "BP_GLOBAL") begin:Predictor
|
||||||
gshare #(`BPRED_SIZE, 0) DirPredictor(.clk, .reset, .StallF, .StallD, .StallE, .StallM, .StallW, .FlushD, .FlushE, .FlushM, .FlushW,
|
gshare #(`BPRED_SIZE, 0) DirPredictor(.clk, .reset, .StallF, .StallD, .StallE, .StallM, .StallW, .FlushD, .FlushE, .FlushM, .FlushW,
|
||||||
.PCNextF, .PCF, .PCD, .PCE, .PCM, .DirPredictionF, .DirPredictionWrongE,
|
.PCNextF, .PCF, .PCD, .PCE, .PCM, .PCW, .DirPredictionF, .DirPredictionWrongE,
|
||||||
.BPBranchF, .BranchD, .BranchE, .BranchM,
|
.BPBranchF, .BranchD, .BranchE, .BranchM, .BranchW,
|
||||||
.PCSrcE);
|
.PCSrcE);
|
||||||
|
|
||||||
end else if (`BPRED_TYPE == "BP_GSHARE_BASIC") begin:Predictor
|
end else if (`BPRED_TYPE == "BP_GSHARE_BASIC") begin:Predictor
|
||||||
|
@ -38,17 +38,17 @@ module gshare #(parameter k = 10,
|
|||||||
output logic [1:0] DirPredictionF,
|
output logic [1:0] DirPredictionF,
|
||||||
output logic DirPredictionWrongE,
|
output logic DirPredictionWrongE,
|
||||||
// update
|
// update
|
||||||
input logic [`XLEN-1:0] PCNextF, PCF, PCD, PCE, PCM,
|
input logic [`XLEN-1:0] PCNextF, PCF, PCD, PCE, PCM, PCW,
|
||||||
input logic BPBranchF, BranchD, BranchE, BranchM, PCSrcE
|
input logic BPBranchF, BranchD, BranchE, BranchM, BranchW, PCSrcE
|
||||||
);
|
);
|
||||||
|
|
||||||
logic MatchF, MatchD, MatchE, MatchM;
|
logic MatchF, MatchD, MatchE, MatchM, MatchW;
|
||||||
logic MatchNextX, MatchXF;
|
logic MatchX, MatchXF;
|
||||||
|
|
||||||
logic [1:0] TableDirPredictionF, DirPredictionD, DirPredictionE, ForwardNewDirPrediction, ForwardDirPredictionF;
|
logic [1:0] TableDirPredictionF, DirPredictionD, DirPredictionE, ForwardNewDirPredictionF, ForwardDirPredictionF;
|
||||||
logic [1:0] NewDirPredictionE, NewDirPredictionM;
|
logic [1:0] NewDirPredictionE, NewDirPredictionM, NewDirPredictionW;
|
||||||
|
|
||||||
logic [k-1:0] IndexNextF, IndexF, IndexD, IndexE, IndexM;
|
logic [k-1:0] IndexNextF, IndexF, IndexD, IndexE, IndexM, IndexW;
|
||||||
|
|
||||||
logic [k-1:0] GHRF, GHRD, GHRE, GHRM;
|
logic [k-1:0] GHRF, GHRD, GHRE, GHRM;
|
||||||
logic [k-1:0] GHRNextM, GHRNextF;
|
logic [k-1:0] GHRNextM, GHRNextF;
|
||||||
@ -68,22 +68,25 @@ module gshare #(parameter k = 10,
|
|||||||
assign IndexM = GHRM;
|
assign IndexM = GHRM;
|
||||||
end
|
end
|
||||||
|
|
||||||
assign MatchF = BPBranchF & ~FlushD & (IndexNextF == IndexF);
|
flopenrc #(k) IndexWReg(clk, reset, FlushW, ~StallW, IndexM, IndexW);
|
||||||
assign MatchD = BranchD & ~FlushE & (IndexNextF == IndexD);
|
|
||||||
assign MatchE = BranchE & ~FlushM & (IndexNextF == IndexE);
|
|
||||||
assign MatchM = BranchM & ~FlushW & (IndexNextF == IndexM);
|
|
||||||
assign MatchNextX = MatchF | MatchD | MatchE | MatchM;
|
|
||||||
|
|
||||||
flopenr #(1) MatchReg(clk, reset, ~StallF, MatchNextX, MatchXF);
|
//assign MatchF = BPBranchF & ~FlushD & (IndexNextF == IndexF);
|
||||||
|
assign MatchD = BranchD & ~FlushE & (IndexF == IndexD);
|
||||||
|
assign MatchE = BranchE & ~FlushM & (IndexF == IndexE);
|
||||||
|
assign MatchM = BranchM & ~FlushW & (IndexF == IndexM);
|
||||||
|
assign MatchW = BranchW & ~FlushW & (IndexF == IndexW);
|
||||||
|
assign MatchX = MatchD | MatchE | MatchM | MatchW;
|
||||||
|
|
||||||
assign ForwardNewDirPrediction = MatchF ? {2{DirPredictionF[1]}} :
|
// flopenr #(1) MatchReg(clk, reset, ~StallF, MatchNextX, MatchXF);
|
||||||
MatchD ? {2{DirPredictionD[1]}} :
|
|
||||||
|
assign ForwardNewDirPredictionF = MatchD ? {2{DirPredictionD[1]}} :
|
||||||
MatchE ? {NewDirPredictionE} :
|
MatchE ? {NewDirPredictionE} :
|
||||||
NewDirPredictionM ;
|
MatchM ? {NewDirPredictionM} :
|
||||||
|
NewDirPredictionW ;
|
||||||
|
|
||||||
flopenr #(2) ForwardDirPredicitonReg(clk, reset, ~StallF, ForwardNewDirPrediction, ForwardDirPredictionF);
|
//flopenr #(2) ForwardDirPredicitonReg(clk, reset, ~StallF, ForwardNewDirPrediction, ForwardDirPredictionF);
|
||||||
|
|
||||||
assign DirPredictionF = MatchXF ? ForwardDirPredictionF : TableDirPredictionF;
|
assign DirPredictionF = MatchX ? ForwardNewDirPredictionF : TableDirPredictionF;
|
||||||
|
|
||||||
ram2p1r1wbe #(2**k, 2) PHT(.clk(clk),
|
ram2p1r1wbe #(2**k, 2) PHT(.clk(clk),
|
||||||
.ce1(~StallF), .ce2(~StallM & ~FlushM),
|
.ce1(~StallF), .ce2(~StallM & ~FlushM),
|
||||||
@ -99,6 +102,7 @@ module gshare #(parameter k = 10,
|
|||||||
|
|
||||||
satCounter2 BPDirUpdateE(.BrDir(PCSrcE), .OldState(DirPredictionE), .NewState(NewDirPredictionE));
|
satCounter2 BPDirUpdateE(.BrDir(PCSrcE), .OldState(DirPredictionE), .NewState(NewDirPredictionE));
|
||||||
flopenrc #(2) NewPredictionRegM(clk, reset, FlushM, ~StallM, NewDirPredictionE, NewDirPredictionM);
|
flopenrc #(2) NewPredictionRegM(clk, reset, FlushM, ~StallM, NewDirPredictionE, NewDirPredictionM);
|
||||||
|
flopenrc #(2) NewPredictionRegW(clk, reset, FlushW, ~StallW, NewDirPredictionM, NewDirPredictionW);
|
||||||
|
|
||||||
assign DirPredictionWrongE = PCSrcE != DirPredictionE[1] & BranchE;
|
assign DirPredictionWrongE = PCSrcE != DirPredictionE[1] & BranchE;
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user