fork join并行块
Tb/tff
Cs450/gshare
train_taken决定PTH里的值加或者减。//2‘b11 taken 2‘b10 weak-taken 2‘b01 weak-not-taken 2‘b00 not-taken;
train_valid决定用train_history[5:0],train_taken;
predict_valid决定用predict_history[5:0],PHT高位;
原文链接:https://blog.csdn.net/weixin_43475286/article/details/132048112
//11 taken 10 weak-taken 01 weak-not-taken 00 not-taken
reg pht1[127:0];//taken
reg pht0[127:0];//w-taken
wire [6:0]ad,ad2;
assign ad=train_history^train_pc;
assign ad2=predict_history^predict_pc;
integer i;
always@(posedge clk or posedge areset)
if(areset)
for (i=0; i<128; i=i+1) begin
pht1[i] <= 1'b0;
pht0[i] <= 1'b1;
end
else if(train_valid & train_taken)begin
if({pht1[ad],pht0[ad]}==2'b11)
{pht1[ad],pht0[ad]}<=2'b11;
else
{pht1[ad],pht0[ad]}<={pht1[ad],pht0[ad]}+2'b1; //拿了很多次
end
else if(train_valid & ~train_taken)begin
if({pht1[ad],pht0[ad]}==0)
{pht1[ad],pht0[ad]}<=0;
else
{pht1[ad],pht0[ad]}<={pht1[ad],pht0[ad]}-2'b1; //拿了次数减少
end
assign predict_taken=pht1[ad2]; //根据pht1[], hash概率taken
always@(posedge clk or posedge areset)
if(areset)
predict_history<=7'b0;
else if(train_valid&train_mispredicted)
predict_history<={train_history[5:0],train_taken};//用计算结果
else if(predict_valid)
predict_history<={predict_history[5:0],predict_taken};//用预测结果