欢迎光临散文网 会员登陆 & 注册

关于HDLBITS最后一题(Cs450/gshare)

2023-03-26 14:17 作者:绿酒初尝人易醉  | 我要投稿

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

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

PHT示意图

当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


关于HDLBITS最后一题(Cs450/gshare)的评论 (共 条)

分享到微博请遵守国家法律