forked from Github_Repos/cvw
Merge remote-tracking branch 'upstream/main' into main
This commit is contained in:
commit
003ad0618d
@ -124,8 +124,9 @@ def ProcessFile(fileName):
|
|||||||
benchmarks.append((testName, opt, HPMClist))
|
benchmarks.append((testName, opt, HPMClist))
|
||||||
return benchmarks
|
return benchmarks
|
||||||
|
|
||||||
def ComputeAverage(benchmarks):
|
def ComputeArithmeticAverage(benchmarks):
|
||||||
average = {}
|
average = {}
|
||||||
|
index = 0
|
||||||
for (testName, opt, HPMClist) in benchmarks:
|
for (testName, opt, HPMClist) in benchmarks:
|
||||||
for field in HPMClist:
|
for field in HPMClist:
|
||||||
value = HPMClist[field]
|
value = HPMClist[field]
|
||||||
@ -133,17 +134,40 @@ def ComputeAverage(benchmarks):
|
|||||||
average[field] = value
|
average[field] = value
|
||||||
else:
|
else:
|
||||||
average[field] += value
|
average[field] += value
|
||||||
|
index += 1
|
||||||
benchmarks.append(('All', '', average))
|
benchmarks.append(('All', '', average))
|
||||||
|
|
||||||
def FormatToPlot(currBenchmark):
|
def FormatToPlot(currBenchmark):
|
||||||
names = []
|
names = []
|
||||||
values = []
|
values = []
|
||||||
for config in currBenchmark:
|
for config in currBenchmark:
|
||||||
print ('config' , config)
|
#print ('config' , config)
|
||||||
names.append(config[0])
|
names.append(config[0])
|
||||||
values.append(config[1])
|
values.append(config[1])
|
||||||
return (names, values)
|
return (names, values)
|
||||||
|
|
||||||
|
def GeometricAverage(benchmarks, field):
|
||||||
|
Product = 1
|
||||||
|
index = 0
|
||||||
|
for (testName, opt, HPMCList) in benchmarks:
|
||||||
|
#print(HPMCList)
|
||||||
|
Product *= HPMCList[field]
|
||||||
|
index += 1
|
||||||
|
return Product ** (1.0/index)
|
||||||
|
|
||||||
|
def ComputeGeometricAverage(benchmarks):
|
||||||
|
fields = ['BDMR', 'BTMR', 'RASMPR', 'ClassMPR', 'ICacheMR', 'DCacheMR']
|
||||||
|
AllAve = {}
|
||||||
|
for field in fields:
|
||||||
|
Product = 1
|
||||||
|
index = 0
|
||||||
|
for (testName, opt, HPMCList) in benchmarks:
|
||||||
|
#print(HPMCList)
|
||||||
|
Product *= HPMCList[field]
|
||||||
|
index += 1
|
||||||
|
AllAve[field] = Product ** (1.0/index)
|
||||||
|
benchmarks.append(('All', '', AllAve))
|
||||||
|
|
||||||
if(sys.argv[1] == '-b'):
|
if(sys.argv[1] == '-b'):
|
||||||
configList = []
|
configList = []
|
||||||
summery = 0
|
summery = 0
|
||||||
@ -152,22 +176,24 @@ if(sys.argv[1] == '-b'):
|
|||||||
sys.argv = sys.argv[1::]
|
sys.argv = sys.argv[1::]
|
||||||
for config in sys.argv[2::]:
|
for config in sys.argv[2::]:
|
||||||
benchmarks = ProcessFile(config)
|
benchmarks = ProcessFile(config)
|
||||||
ComputeAverage(benchmarks)
|
#ComputeArithmeticAverage(benchmarks)
|
||||||
ComputeAll(benchmarks)
|
ComputeAll(benchmarks)
|
||||||
|
ComputeGeometricAverage(benchmarks)
|
||||||
|
#print('CONFIG: %s GEO MEAN: %f' % (config, GeometricAverage(benchmarks, 'BDMR')))
|
||||||
configList.append((config.split('.')[0], benchmarks))
|
configList.append((config.split('.')[0], benchmarks))
|
||||||
|
|
||||||
# Merge all configruations into a single list
|
# Merge all configruations into a single list
|
||||||
benchmarkAll = []
|
benchmarkAll = []
|
||||||
for (config, benchmarks) in configList:
|
for (config, benchmarks) in configList:
|
||||||
print(config)
|
#print(config)
|
||||||
for benchmark in benchmarks:
|
for benchmark in benchmarks:
|
||||||
(nameString, opt, dataDict) = benchmark
|
(nameString, opt, dataDict) = benchmark
|
||||||
print("BENCHMARK")
|
#print("BENCHMARK")
|
||||||
print(nameString)
|
#print(nameString)
|
||||||
print(opt)
|
#print(opt)
|
||||||
print(dataDict)
|
#print(dataDict)
|
||||||
benchmarkAll.append((nameString, opt, config, dataDict))
|
benchmarkAll.append((nameString, opt, config, dataDict))
|
||||||
print('ALL!!!!!!!!!!')
|
#print('ALL!!!!!!!!!!')
|
||||||
#for bench in benchmarkAll:
|
#for bench in benchmarkAll:
|
||||||
# print('BENCHMARK')
|
# print('BENCHMARK')
|
||||||
# print(bench)
|
# print(bench)
|
||||||
@ -186,7 +212,7 @@ if(sys.argv[1] == '-b'):
|
|||||||
size = len(benchmarkDict)
|
size = len(benchmarkDict)
|
||||||
index = 1
|
index = 1
|
||||||
if(summery == 0):
|
if(summery == 0):
|
||||||
print('Number of plots', size)
|
#print('Number of plots', size)
|
||||||
for benchmarkName in benchmarkDict:
|
for benchmarkName in benchmarkDict:
|
||||||
currBenchmark = benchmarkDict[benchmarkName]
|
currBenchmark = benchmarkDict[benchmarkName]
|
||||||
(names, values) = FormatToPlot(currBenchmark)
|
(names, values) = FormatToPlot(currBenchmark)
|
||||||
@ -223,7 +249,7 @@ if(sys.argv[1] == '-b'):
|
|||||||
print(dct)
|
print(dct)
|
||||||
for cat in dct:
|
for cat in dct:
|
||||||
(x, y) = dct[cat]
|
(x, y) = dct[cat]
|
||||||
plt.scatter(x, y, label=cat)
|
plt.scatter(x, y, label='k')
|
||||||
plt.plot(x, y)
|
plt.plot(x, y)
|
||||||
plt.ylabel('Prediction Accuracy')
|
plt.ylabel('Prediction Accuracy')
|
||||||
plt.xlabel('Size (b or k)')
|
plt.xlabel('Size (b or k)')
|
||||||
|
@ -73,12 +73,12 @@ module bpred (
|
|||||||
logic [1:0] DirPredictionF;
|
logic [1:0] DirPredictionF;
|
||||||
|
|
||||||
logic [3:0] BTBPredInstrClassF, PredInstrClassF, PredInstrClassD;
|
logic [3:0] BTBPredInstrClassF, PredInstrClassF, PredInstrClassD;
|
||||||
logic [`XLEN-1:0] PredPCF, RASPCF;
|
logic [`XLEN-1:0] BTAF, RASPCF;
|
||||||
logic PredictionPCWrongE;
|
logic PredictionPCWrongE;
|
||||||
logic AnyWrongPredInstrClassD, AnyWrongPredInstrClassE;
|
logic AnyWrongPredInstrClassD, AnyWrongPredInstrClassE;
|
||||||
logic [3:0] InstrClassD;
|
logic [3:0] InstrClassD;
|
||||||
logic [3:0] InstrClassE;
|
logic [3:0] InstrClassE;
|
||||||
logic DirPredictionWrongE, BTBPredPCWrongE, RASPredPCWrongE;
|
logic DirPredictionWrongE;
|
||||||
|
|
||||||
logic SelBPPredF;
|
logic SelBPPredF;
|
||||||
logic [`XLEN-1:0] BPPredPCF;
|
logic [`XLEN-1:0] BPPredPCF;
|
||||||
@ -88,9 +88,8 @@ module bpred (
|
|||||||
|
|
||||||
logic BTBTargetWrongE;
|
logic BTBTargetWrongE;
|
||||||
logic RASTargetWrongE;
|
logic RASTargetWrongE;
|
||||||
logic JumpOrTakenBranchE;
|
|
||||||
|
|
||||||
logic [`XLEN-1:0] PredPCD, PredPCE, RASPCD, RASPCE;
|
logic [`XLEN-1:0] BTAD;
|
||||||
|
|
||||||
// Part 1 branch direction prediction
|
// Part 1 branch direction prediction
|
||||||
// look into the 2 port Sram model. something is wrong.
|
// look into the 2 port Sram model. something is wrong.
|
||||||
@ -142,7 +141,7 @@ module bpred (
|
|||||||
btb #(`BTB_SIZE)
|
btb #(`BTB_SIZE)
|
||||||
TargetPredictor(.clk, .reset, .StallF, .StallD, .StallE, .StallM, .StallW, .FlushD, .FlushE, .FlushM, .FlushW,
|
TargetPredictor(.clk, .reset, .StallF, .StallD, .StallE, .StallM, .StallW, .FlushD, .FlushE, .FlushM, .FlushW,
|
||||||
.PCNextF, .PCF, .PCD, .PCE, .PCM,
|
.PCNextF, .PCF, .PCD, .PCE, .PCM,
|
||||||
.PredPCF,
|
.BTAF, .BTAD,
|
||||||
.BTBPredInstrClassF,
|
.BTBPredInstrClassF,
|
||||||
.PredictionInstrClassWrongM,
|
.PredictionInstrClassWrongM,
|
||||||
.IEUAdrE, .IEUAdrM,
|
.IEUAdrE, .IEUAdrM,
|
||||||
@ -150,25 +149,28 @@ module bpred (
|
|||||||
|
|
||||||
// the branch predictor needs a compact decoding of the instruction class.
|
// the branch predictor needs a compact decoding of the instruction class.
|
||||||
if (`INSTR_CLASS_PRED == 0) begin : DirectClassDecode
|
if (`INSTR_CLASS_PRED == 0) begin : DirectClassDecode
|
||||||
logic [4:0] CompressedOpcF;
|
|
||||||
logic [3:0] InstrClassF;
|
logic [3:0] InstrClassF;
|
||||||
logic cjal, cj, cjr, cjalr, CJumpF, CBranchF;
|
logic cjal, cj, cjr, cjalr, CJumpF, CBranchF;
|
||||||
logic JumpF, BranchF;
|
logic JumpF, BranchF;
|
||||||
|
|
||||||
|
if(`C_SUPPORTED) begin
|
||||||
|
logic [4:0] CompressedOpcF;
|
||||||
assign CompressedOpcF = {PostSpillInstrRawF[1:0], PostSpillInstrRawF[15:13]};
|
assign CompressedOpcF = {PostSpillInstrRawF[1:0], PostSpillInstrRawF[15:13]};
|
||||||
|
|
||||||
assign cjal = CompressedOpcF == 5'h09 & `XLEN == 32;
|
assign cjal = CompressedOpcF == 5'h09 & `XLEN == 32;
|
||||||
assign cj = CompressedOpcF == 5'h0d;
|
assign cj = CompressedOpcF == 5'h0d;
|
||||||
assign cjr = CompressedOpcF == 5'h14 & ~PostSpillInstrRawF[12] & PostSpillInstrRawF[6:2] == 5'b0 & PostSpillInstrRawF[11:7] != 5'b0;
|
assign cjr = CompressedOpcF == 5'h14 & ~PostSpillInstrRawF[12] & PostSpillInstrRawF[6:2] == 5'b0 & PostSpillInstrRawF[11:7] != 5'b0;
|
||||||
assign cjalr = CompressedOpcF == 5'h14 & PostSpillInstrRawF[12] & PostSpillInstrRawF[6:2] == 5'b0 & PostSpillInstrRawF[11:7] != 5'b0;
|
assign cjalr = CompressedOpcF == 5'h14 & PostSpillInstrRawF[12] & PostSpillInstrRawF[6:2] == 5'b0 & PostSpillInstrRawF[11:7] != 5'b0;
|
||||||
assign CJumpF = cjal | cj | cjr | cjalr;
|
assign CJumpF = cjal | cj | cjr | cjalr;
|
||||||
assign CBranchF = CompressedOpcF[4:1] == 4'h7;
|
assign CBranchF = CompressedOpcF[4:1] == 4'h7;
|
||||||
|
end else begin
|
||||||
|
assign {cjal, cj, cjr, cjalr, CJumpF, CBranchF} = '0;
|
||||||
|
end
|
||||||
|
|
||||||
assign JumpF = PostSpillInstrRawF[6:0] == 7'h67 | PostSpillInstrRawF[6:0] == 7'h6F;
|
assign JumpF = PostSpillInstrRawF[6:0] == 7'h67 | PostSpillInstrRawF[6:0] == 7'h6F;
|
||||||
assign BranchF = PostSpillInstrRawF[6:0] == 7'h63;
|
assign BranchF = PostSpillInstrRawF[6:0] == 7'h63;
|
||||||
|
|
||||||
assign InstrClassF[0] = BranchF | (`C_SUPPORTED & CBranchF);
|
assign InstrClassF[0] = BranchF | (`C_SUPPORTED & CBranchF);
|
||||||
assign InstrClassF[1] = JumpF | (`C_SUPPORTED & (cjal | cj | cj | cjalr));
|
assign InstrClassF[1] = JumpF | (`C_SUPPORTED & (CJumpF));
|
||||||
assign InstrClassF[2] = (JumpF & (PostSpillInstrRawF[19:15] & 5'h1B) == 5'h01) | // return must return to ra or r5
|
assign InstrClassF[2] = (JumpF & (PostSpillInstrRawF[19:15] & 5'h1B) == 5'h01) | // return must return to ra or r5
|
||||||
(`C_SUPPORTED & (cjalr | cjr) & ((PostSpillInstrRawF[11:7] & 5'h1B) == 5'h01));
|
(`C_SUPPORTED & (cjalr | cjr) & ((PostSpillInstrRawF[11:7] & 5'h1B) == 5'h01));
|
||||||
|
|
||||||
@ -189,7 +191,7 @@ module bpred (
|
|||||||
.PredInstrClassF, .InstrClassD, .InstrClassE,
|
.PredInstrClassF, .InstrClassD, .InstrClassE,
|
||||||
.WrongPredInstrClassD, .RASPCF, .PCLinkE);
|
.WrongPredInstrClassD, .RASPCF, .PCLinkE);
|
||||||
|
|
||||||
assign BPPredPCF = PredInstrClassF[2] ? RASPCF : PredPCF;
|
assign BPPredPCF = PredInstrClassF[2] ? RASPCF : BTAF;
|
||||||
|
|
||||||
assign InstrClassD[0] = BranchD;
|
assign InstrClassD[0] = BranchD;
|
||||||
assign InstrClassD[1] = JumpD ;
|
assign InstrClassD[1] = JumpD ;
|
||||||
@ -201,9 +203,7 @@ module bpred (
|
|||||||
flopenrc #(1) BPPredWrongMReg(clk, reset, FlushM, ~StallM, BPPredWrongE, BPPredWrongM);
|
flopenrc #(1) BPPredWrongMReg(clk, reset, FlushM, ~StallM, BPPredWrongE, BPPredWrongM);
|
||||||
|
|
||||||
// branch predictor
|
// branch predictor
|
||||||
flopenrc #(4) BPPredWrongRegM(clk, reset, FlushM, ~StallM,
|
flopenrc #(1) BPClassWrongRegM(clk, reset, FlushM, ~StallM, AnyWrongPredInstrClassE, PredictionInstrClassWrongM);
|
||||||
{DirPredictionWrongE, BTBPredPCWrongE, RASPredPCWrongE, AnyWrongPredInstrClassE},
|
|
||||||
{DirPredictionWrongM, BTBPredPCWrongM, RASPredPCWrongM, PredictionInstrClassWrongM});
|
|
||||||
|
|
||||||
// pipeline the class
|
// pipeline the class
|
||||||
flopenrc #(4) PredInstrClassRegD(clk, reset, FlushD, ~StallD, PredInstrClassF, PredInstrClassD);
|
flopenrc #(4) PredInstrClassRegD(clk, reset, FlushD, ~StallD, PredInstrClassF, PredInstrClassD);
|
||||||
@ -243,27 +243,37 @@ module bpred (
|
|||||||
if(`INSTR_CLASS_PRED) mux2 #(`XLEN) pcmuxBPWrongInvalidateFlush(PCE, PCF, BPPredWrongM, NextValidPCE);
|
if(`INSTR_CLASS_PRED) mux2 #(`XLEN) pcmuxBPWrongInvalidateFlush(PCE, PCF, BPPredWrongM, NextValidPCE);
|
||||||
else assign NextValidPCE = PCE;
|
else assign NextValidPCE = PCE;
|
||||||
|
|
||||||
|
if(`ZICOUNTERS_SUPPORTED) begin
|
||||||
|
logic JumpOrTakenBranchE;
|
||||||
|
logic [`XLEN-1:0] BTAE, RASPCD, RASPCE;
|
||||||
|
logic BTBPredPCWrongE, RASPredPCWrongE;
|
||||||
// performance counters
|
// performance counters
|
||||||
// 1. class (class wrong / minstret) (PredictionInstrClassWrongM / csr) // Correct now
|
// 1. class (class wrong / minstret) (PredictionInstrClassWrongM / csr) // Correct now
|
||||||
// 2. target btb (btb target wrong / class[0,1,3]) (btb target wrong / (br + j + jal)
|
// 2. target btb (btb target wrong / class[0,1,3]) (btb target wrong / (br + j + jal)
|
||||||
// 3. target ras (ras target wrong / class[2])
|
// 3. target ras (ras target wrong / class[2])
|
||||||
// 4. direction (br dir wrong / class[0])
|
// 4. direction (br dir wrong / class[0])
|
||||||
|
|
||||||
// Unforuantely we can't relay on PCD to infer the correctness of the BTB or RAS because the class prediction
|
// Unforuantely we can't use PCD to infer the correctness of the BTB or RAS because the class prediction
|
||||||
// could be wrong or the fall through address selected for branch predict not taken.
|
// could be wrong or the fall through address selected for branch predict not taken.
|
||||||
// By pipeline the BTB's PC and RAS address through the pipeline we can measure the accuracy of
|
// By pipeline the BTB's PC and RAS address through the pipeline we can measure the accuracy of
|
||||||
// both without the above inaccuracies.
|
// both without the above inaccuracies.
|
||||||
assign BTBPredPCWrongE = (PredPCE != IEUAdrE) & (InstrClassE[0] | InstrClassE[1] & ~InstrClassE[2]) & PCSrcE;
|
assign BTBPredPCWrongE = (BTAE != IEUAdrE) & (InstrClassE[0] | InstrClassE[1] & ~InstrClassE[2]) & PCSrcE;
|
||||||
assign RASPredPCWrongE = (RASPCE != IEUAdrE) & InstrClassE[2] & PCSrcE;
|
assign RASPredPCWrongE = (RASPCE != IEUAdrE) & InstrClassE[2] & PCSrcE;
|
||||||
|
|
||||||
assign JumpOrTakenBranchE = (InstrClassE[0] & PCSrcE) | InstrClassE[1];
|
assign JumpOrTakenBranchE = (InstrClassE[0] & PCSrcE) | InstrClassE[1];
|
||||||
|
|
||||||
flopenrc #(1) JumpOrTakenBranchMReg(clk, reset, FlushM, ~StallM, JumpOrTakenBranchE, JumpOrTakenBranchM);
|
flopenrc #(1) JumpOrTakenBranchMReg(clk, reset, FlushM, ~StallM, JumpOrTakenBranchE, JumpOrTakenBranchM);
|
||||||
|
|
||||||
flopenrc #(`XLEN) BTBTargetDReg(clk, reset, FlushD, ~StallD, PredPCF, PredPCD);
|
flopenrc #(`XLEN) BTBTargetEReg(clk, reset, FlushE, ~StallE, BTAD, BTAE);
|
||||||
flopenrc #(`XLEN) BTBTargetEReg(clk, reset, FlushE, ~StallE, PredPCD, PredPCE);
|
|
||||||
|
|
||||||
flopenrc #(`XLEN) RASTargetDReg(clk, reset, FlushD, ~StallD, RASPCF, RASPCD);
|
flopenrc #(`XLEN) RASTargetDReg(clk, reset, FlushD, ~StallD, RASPCF, RASPCD);
|
||||||
flopenrc #(`XLEN) RASTargetEReg(clk, reset, FlushE, ~StallE, RASPCD, RASPCE);
|
flopenrc #(`XLEN) RASTargetEReg(clk, reset, FlushE, ~StallE, RASPCD, RASPCE);
|
||||||
|
flopenrc #(3) BPPredWrongRegM(clk, reset, FlushM, ~StallM,
|
||||||
|
{DirPredictionWrongE, BTBPredPCWrongE, RASPredPCWrongE},
|
||||||
|
{DirPredictionWrongM, BTBPredPCWrongM, RASPredPCWrongM});
|
||||||
|
|
||||||
|
end else begin
|
||||||
|
assign {BTBPredPCWrongM, RASPredPCWrongM, JumpOrTakenBranchM} = '0;
|
||||||
|
end
|
||||||
|
|
||||||
endmodule
|
endmodule
|
||||||
|
@ -35,7 +35,8 @@ module btb #(parameter Depth = 10 ) (
|
|||||||
input logic reset,
|
input logic reset,
|
||||||
input logic StallF, StallD, StallE, StallM, StallW, FlushD, FlushE, FlushM, FlushW,
|
input logic StallF, StallD, StallE, StallM, StallW, FlushD, FlushE, FlushM, FlushW,
|
||||||
input logic [`XLEN-1:0] PCNextF, PCF, PCD, PCE, PCM, // PC at various stages
|
input logic [`XLEN-1:0] PCNextF, PCF, PCD, PCE, PCM, // PC at various stages
|
||||||
output logic [`XLEN-1:0] PredPCF, // BTB's guess at PC
|
output logic [`XLEN-1:0] BTAF, // BTB's guess at PC
|
||||||
|
output logic [`XLEN-1:0] BTAD,
|
||||||
output logic [3:0] BTBPredInstrClassF, // BTB's guess at instruction class
|
output logic [3:0] BTBPredInstrClassF, // BTB's guess at instruction class
|
||||||
// update
|
// update
|
||||||
input logic PredictionInstrClassWrongM, // BTB's instruction class guess was wrong
|
input logic PredictionInstrClassWrongM, // BTB's instruction class guess was wrong
|
||||||
@ -51,7 +52,6 @@ module btb #(parameter Depth = 10 ) (
|
|||||||
logic MatchF, MatchD, MatchE, MatchM, MatchNextX, MatchXF;
|
logic MatchF, MatchD, MatchE, MatchM, MatchNextX, MatchXF;
|
||||||
logic [`XLEN+3:0] ForwardBTBPrediction, ForwardBTBPredictionF;
|
logic [`XLEN+3:0] ForwardBTBPrediction, ForwardBTBPredictionF;
|
||||||
logic [`XLEN+3:0] TableBTBPredictionF;
|
logic [`XLEN+3:0] TableBTBPredictionF;
|
||||||
logic [`XLEN-1:0] PredPCD;
|
|
||||||
logic UpdateEn;
|
logic UpdateEn;
|
||||||
|
|
||||||
// hashing function for indexing the PC
|
// hashing function for indexing the PC
|
||||||
@ -78,14 +78,14 @@ module btb #(parameter Depth = 10 ) (
|
|||||||
|
|
||||||
flopenr #(1) MatchReg(clk, reset, ~StallF, MatchNextX, MatchXF);
|
flopenr #(1) MatchReg(clk, reset, ~StallF, MatchNextX, MatchXF);
|
||||||
|
|
||||||
assign ForwardBTBPrediction = MatchF ? {BTBPredInstrClassF, PredPCF} :
|
assign ForwardBTBPrediction = MatchF ? {BTBPredInstrClassF, BTAF} :
|
||||||
MatchD ? {InstrClassD, PredPCD} :
|
MatchD ? {InstrClassD, BTAD} :
|
||||||
MatchE ? {InstrClassE, IEUAdrE} :
|
MatchE ? {InstrClassE, IEUAdrE} :
|
||||||
{InstrClassM, IEUAdrM} ;
|
{InstrClassM, IEUAdrM} ;
|
||||||
|
|
||||||
flopenr #(`XLEN+4) ForwardBTBPredicitonReg(clk, reset, ~StallF, ForwardBTBPrediction, ForwardBTBPredictionF);
|
flopenr #(`XLEN+4) ForwardBTBPredicitonReg(clk, reset, ~StallF, ForwardBTBPrediction, ForwardBTBPredictionF);
|
||||||
|
|
||||||
assign {BTBPredInstrClassF, PredPCF} = MatchXF ? ForwardBTBPredictionF : {TableBTBPredictionF};
|
assign {BTBPredInstrClassF, BTAF} = MatchXF ? ForwardBTBPredictionF : {TableBTBPredictionF};
|
||||||
|
|
||||||
|
|
||||||
assign UpdateEn = |InstrClassM | PredictionInstrClassWrongM;
|
assign UpdateEn = |InstrClassM | PredictionInstrClassWrongM;
|
||||||
@ -95,6 +95,6 @@ module btb #(parameter Depth = 10 ) (
|
|||||||
.clk, .ce1(~StallF | reset), .ra1(PCNextFIndex), .rd1(TableBTBPredictionF),
|
.clk, .ce1(~StallF | reset), .ra1(PCNextFIndex), .rd1(TableBTBPredictionF),
|
||||||
.ce2(~StallW & ~FlushW), .wa2(PCMIndex), .wd2({InstrClassM, IEUAdrM}), .we2(UpdateEn), .bwe2('1));
|
.ce2(~StallW & ~FlushW), .wa2(PCMIndex), .wd2({InstrClassM, IEUAdrM}), .we2(UpdateEn), .bwe2('1));
|
||||||
|
|
||||||
flopenrc #(`XLEN) BTBD(clk, reset, FlushD, ~StallD, PredPCF, PredPCD);
|
flopenrc #(`XLEN) BTBD(clk, reset, FlushD, ~StallD, BTAF, BTAD);
|
||||||
|
|
||||||
endmodule
|
endmodule
|
||||||
|
@ -42,7 +42,7 @@ module gsharebasic #(parameter k = 10,
|
|||||||
input logic BranchInstrE, BranchInstrM, PCSrcE
|
input logic BranchInstrE, BranchInstrM, PCSrcE
|
||||||
);
|
);
|
||||||
|
|
||||||
logic [k-1:0] IndexNextF, IndexE;
|
logic [k-1:0] IndexNextF, IndexM;
|
||||||
logic [1:0] DirPredictionD, DirPredictionE;
|
logic [1:0] DirPredictionD, DirPredictionE;
|
||||||
logic [1:0] NewDirPredictionE, NewDirPredictionM;
|
logic [1:0] NewDirPredictionE, NewDirPredictionM;
|
||||||
|
|
||||||
@ -52,19 +52,19 @@ module gsharebasic #(parameter k = 10,
|
|||||||
|
|
||||||
if(TYPE == 1) begin
|
if(TYPE == 1) begin
|
||||||
assign IndexNextF = GHR ^ {PCNextF[k+1] ^ PCNextF[1], PCNextF[k:2]};
|
assign IndexNextF = GHR ^ {PCNextF[k+1] ^ PCNextF[1], PCNextF[k:2]};
|
||||||
assign IndexE = GHRM ^ {PCM[k+1] ^ PCM[1], PCM[k:2]};
|
assign IndexM = GHRM ^ {PCM[k+1] ^ PCM[1], PCM[k:2]};
|
||||||
end else if(TYPE == 0) begin
|
end else if(TYPE == 0) begin
|
||||||
assign IndexNextF = GHRNext;
|
assign IndexNextF = GHRNext;
|
||||||
assign IndexE = GHRE;
|
assign IndexM = GHRM;
|
||||||
end
|
end
|
||||||
|
|
||||||
ram2p1r1wbe #(2**k, 2) PHT(.clk(clk),
|
ram2p1r1wbe #(2**k, 2) PHT(.clk(clk),
|
||||||
.ce1(~StallF), .ce2(~StallM & ~FlushM),
|
.ce1(~StallF), .ce2(~StallW & ~FlushW),
|
||||||
.ra1(IndexNextF),
|
.ra1(IndexNextF),
|
||||||
.rd1(DirPredictionF),
|
.rd1(DirPredictionF),
|
||||||
.wa2(IndexE),
|
.wa2(IndexM),
|
||||||
.wd2(NewDirPredictionM),
|
.wd2(NewDirPredictionM),
|
||||||
.we2(BranchInstrM & ~StallW & ~FlushW),
|
.we2(BranchInstrM),
|
||||||
.bwe2(1'b1));
|
.bwe2(1'b1));
|
||||||
|
|
||||||
flopenrc #(2) PredictionRegD(clk, reset, FlushD, ~StallD, DirPredictionF, DirPredictionD);
|
flopenrc #(2) PredictionRegD(clk, reset, FlushD, ~StallD, DirPredictionF, DirPredictionD);
|
||||||
|
Loading…
Reference in New Issue
Block a user