您当前的位置:首页 >> 业界 >  >> 
关于HDLBITS最后一题(Cs450/gshare)-天天速讯
来源: 哔哩哔哩      时间:2023-03-26 14:17:10

该题链接:https://hdlbits.01xz.net/wiki/Cs450/gshare


(相关资料图)

这题主要是看不懂题目,没法理解题目意思,而且对cpu的gshare预测分支不了解,所以做不出来。

当train_valid=1时,PHT的位置由train_pc与train_history异或得到,而PHT的值则是由状态机或者说由train_taken来决定。状态机是之前题目中的饱和计数器,当状态是11或10时,会决定predict_taken为1. predict_taken的值有PHT的状态决定。

其中寄存器代码编写与上题差不多。

module top_module(

input clk,

input areset,

input  predict_valid,

input  [6:0] predict_pc,

output predict_taken,

output [6:0] predict_history,

input train_valid,

input train_taken,

input train_mispredicted,

input [6:0] train_history,

input [6:0] train_pc

);

reg pht1[127:0],pht0[127:0];//定义128个1位寄存器pht1

wire [6:0]ad,ad2;

assign predict_taken=pht1[ad2];

assign ad=train_history^train_pc;

assign ad2=predict_history^predict_pc;

always@(posedge clk or posedge areset)begin

if(areset)

for(int i=0;i<128;i++)begin

pht1[i]=0;pht0[i]=1;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]}+1;

end

else if(train_valid&~train_taken)begin

if({pht1[ad],pht0[ad]}==2'b00)

{pht1[ad],pht0[ad]}<=2'b00;

else

{pht1[ad],pht0[ad]}<={pht1[ad],pht0[ad]}-1;

end//之前的饱和计数器

end

always@(posedge clk or posedge areset)begin

if(areset)

predict_history<=0;

else if(train_mispredicted & train_valid)

predict_history <= {train_history[5:0],train_taken};

else if(predict_valid )

predict_history <= {predict_history[5:0],predict_taken}; 

end

endmodule

标签:

X 关闭

X 关闭