mirror of
https://github.com/openhwgroup/cvw
synced 2025-02-11 06:05:49 +00:00
Merge branch 'main' of github.com:ross144/cvw
This commit is contained in:
commit
911023f441
@ -107,7 +107,7 @@ module bpred (
|
|||||||
end else if (`BPRED_TYPE == "BPSPECULATIVEGLOBAL") begin:Predictor
|
end else if (`BPRED_TYPE == "BPSPECULATIVEGLOBAL") begin:Predictor
|
||||||
speculativeglobalhistory #(`BPRED_SIZE) DirPredictor(.clk, .reset, .StallF, .StallD, .StallE, .StallM, .StallW, .FlushD, .FlushE, .FlushM, .FlushW,
|
speculativeglobalhistory #(`BPRED_SIZE) DirPredictor(.clk, .reset, .StallF, .StallD, .StallE, .StallM, .StallW, .FlushD, .FlushE, .FlushM, .FlushW,
|
||||||
.DirPredictionF, .DirPredictionWrongE,
|
.DirPredictionF, .DirPredictionWrongE,
|
||||||
.PredInstrClassF, .InstrClassD, .InstrClassE, .WrongPredInstrClassD, .PCSrcE);
|
.PredInstrClassF, .InstrClassD, .InstrClassE, .InstrClassM, .WrongPredInstrClassD, .PCSrcE);
|
||||||
|
|
||||||
end else if (`BPRED_TYPE == "BPGSHARE") begin:Predictor
|
end else if (`BPRED_TYPE == "BPGSHARE") 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,
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
///////////////////////////////////////////
|
///////////////////////////////////////////
|
||||||
// speculativeglobalhistory.sv
|
// gsharePredictor.sv
|
||||||
//
|
//
|
||||||
// Written: Shreya Sanghai
|
// Written: Shreya Sanghai
|
||||||
// Email: ssanghai@hmc.edu
|
// Email: ssanghai@hmc.edu
|
||||||
@ -36,8 +36,9 @@ module speculativeglobalhistory #(parameter int k = 10 ) (
|
|||||||
output logic [1:0] DirPredictionF,
|
output logic [1:0] DirPredictionF,
|
||||||
output logic DirPredictionWrongE,
|
output logic DirPredictionWrongE,
|
||||||
// update
|
// update
|
||||||
input logic [3:0] InstrClassD, InstrClassE,
|
input logic [3:0] PredInstrClassF,
|
||||||
input logic [2:0] PredInstrClassF, WrongPredInstrClassD,
|
input logic [3:0] InstrClassD, InstrClassE, InstrClassM,
|
||||||
|
input logic [3:0] WrongPredInstrClassD,
|
||||||
input logic PCSrcE
|
input logic PCSrcE
|
||||||
);
|
);
|
||||||
|
|
||||||
@ -47,9 +48,9 @@ module speculativeglobalhistory #(parameter int k = 10 ) (
|
|||||||
logic [1:0] TableDirPredictionF, DirPredictionD, DirPredictionE;
|
logic [1:0] TableDirPredictionF, DirPredictionD, DirPredictionE;
|
||||||
logic [1:0] NewDirPredictionE;
|
logic [1:0] NewDirPredictionE;
|
||||||
|
|
||||||
logic [k-1:0] GHRF, GHRD, GHRE;
|
logic [k-1:0] GHRF, GHRD, GHRE, GHRM;
|
||||||
logic GHRLastF;
|
logic GHRLastF;
|
||||||
logic [k-1:0] GHRNextF, GHRNextD, GHRNextE;
|
logic [k-1:0] GHRNextF, GHRNextD, GHRNextE, GHRNextM;
|
||||||
logic [k-1:0] IndexNextF, IndexF, IndexD, IndexE;
|
logic [k-1:0] IndexNextF, IndexF, IndexD, IndexE;
|
||||||
logic [1:0] ForwardNewDirPrediction, ForwardDirPredictionF;
|
logic [1:0] ForwardNewDirPrediction, ForwardDirPredictionF;
|
||||||
|
|
||||||
@ -57,8 +58,8 @@ module speculativeglobalhistory #(parameter int k = 10 ) (
|
|||||||
|
|
||||||
assign IndexNextF = GHRNextF;
|
assign IndexNextF = GHRNextF;
|
||||||
assign IndexF = GHRF;
|
assign IndexF = GHRF;
|
||||||
assign IndexD = GHRD[k-1:0];
|
assign IndexD = GHRD;
|
||||||
assign IndexE = GHRE[k-1:0];
|
assign IndexE = GHRE;
|
||||||
|
|
||||||
ram2p1r1wbe #(2**k, 2) PHT(.clk(clk),
|
ram2p1r1wbe #(2**k, 2) PHT(.clk(clk),
|
||||||
.ce1(~StallF | reset), .ce2(~StallM & ~FlushM),
|
.ce1(~StallF | reset), .ce2(~StallM & ~FlushM),
|
||||||
@ -111,15 +112,18 @@ module speculativeglobalhistory #(parameter int k = 10 ) (
|
|||||||
// If it is wrong and branch does exist then shift right and insert the prediction.
|
// If it is wrong and branch does exist then shift right and insert the prediction.
|
||||||
// If the branch does not exist then shift left and use GHRLastF to restore the LSB.
|
// If the branch does not exist then shift left and use GHRLastF to restore the LSB.
|
||||||
logic [k-1:0] GHRClassWrong;
|
logic [k-1:0] GHRClassWrong;
|
||||||
mux2 #(k) GHRClassWrongMux({DirPredictionD[1], GHRF[k-1:1]}, {GHRF[k-2:0], GHRLastF}, InstrClassD[0], GHRClassWrong);
|
mux2 #(k) GHRClassWrongMux({DirPredictionD[1], GHRF[k-1:1]}, {GHRF[k-2:0], GHRLastF}, ~InstrClassD[0], GHRClassWrong);
|
||||||
// As with GHRF FlushD and wrong direction prediction flushes the pipeline and restores to GHRNextE.
|
// As with GHRF FlushD and wrong direction prediction flushes the pipeline and restores to GHRNextE.
|
||||||
mux3 #(k) GHRDMux(GHRF, GHRClassWrong, GHRNextE, {FlushDOrDirWrong, WrongPredInstrClassD[0]}, GHRNextD);
|
mux3 #(k) GHRDMux(GHRF, GHRClassWrong, GHRNextE, {FlushDOrDirWrong, WrongPredInstrClassD[0]}, GHRNextD);
|
||||||
|
|
||||||
flopenr #(k) GHRDReg(clk, reset, ~StallD | FlushDOrDirWrong, GHRNextD, GHRD);
|
flopenr #(k) GHRDReg(clk, reset, ~StallD | FlushDOrDirWrong, GHRNextD, GHRD);
|
||||||
|
|
||||||
mux3 #(k) GHREMux(GHRD, GHRE, {PCSrcE, GHRD[k-2:0]}, {InstrClassE[0] & ~FlushM, FlushE}, GHRNextE);
|
mux3 #(k) GHREMux(GHRD, GHRNextM, {PCSrcE, GHRD[k-2:0]}, {InstrClassE[0] & ~FlushM, FlushE}, GHRNextE);
|
||||||
|
|
||||||
flopenr #(k) GHREReg(clk, reset, ((InstrClassE[0] & ~FlushM) & ~StallE) | FlushE, GHRNextE, GHRE);
|
flopenr #(k) GHREReg(clk, reset, (~StallE) | FlushE, GHRNextE, GHRE);
|
||||||
|
|
||||||
|
assign GHRNextM = FlushM ? GHRM : GHRE;
|
||||||
|
flopenr #(k) GHRMReg(clk, reset, (InstrClassM[0] & ~StallM) | FlushM, GHRNextM, GHRM);
|
||||||
|
|
||||||
assign DirPredictionWrongE = PCSrcE != DirPredictionE[1] & InstrClassE[0];
|
assign DirPredictionWrongE = PCSrcE != DirPredictionE[1] & InstrClassE[0];
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user