Tb/clock

这题要求给dut模块一个时钟。

module top_module ( );
reg clk;
    always #5 clk=~clk;
    initial begin
        clk = 0;
    end
    dut u0(clk);
endmodule

Tb/tb1

产生指定的波形,使用延时语句给信号赋值即可。

module top_module ( output reg A, output reg B );//
    // generate input patterns here
    initial begin
        A=0;
        B=0;
        #10 A=1;
        #5 B=1;
        #5 A=0;
        #20 B=0;
    end
endmodule

Tb/and

题目要求对一个与门进行测试,要求产生波形图中的激励向量。

module top_module();
    reg [1:0]in;
    wire out;
    initial begin
        in = 2'b00;
        #10 in = 2'b01;
        #10 in = 2'b10;
        #10 in = 2'b11;
    end
    andgate u_and(in,out);
endmodule

Tb/tb2

同样是写一个testbench,但是比上面略复杂一点。

module top_module();
    reg clk;
    reg in;
    reg [2:0]s;
    wire out;
    initial begin
           clk=0;
        in=0;
        s=2;
        #10 s=6;
        #10 in=1;s=2;
        #10 in=0;s=7;
        #10 in=1;s=0;
        #30 in=0;
    end
    always #5 clk=~clk;
    q7 u_q7(clk,in,s,out);
endmodule

Tb/tff

要求验证一个T触发器,T触发器在输入t为1时输出不断地发展。

module top_module ();
    reg clk;
    reg reset;
    reg t;
    wire q;
    always #5 clk=~clk;
    initial begin
        clk=0;
        reset=1;
        t=0;
        #10 reset=0;t=1;
    end
    tff u_t(clk,reset,t,q);
endmodule

Cs450/timer

load信号为1载入data,load为0电路为一个倒数器,当倒计数为0时tc为1。

module top_module(
    input clk, 
    input load, 
    input [9:0] data, 
    output tc
);
    reg [9:0]counter;
    always@(posedge clk)
    begin
        if(load)
            counter <= data;
        else 
            counter <= (counter!=0)?(counter - 1'b1):0;
    end
    assign tc=(counter==0);
endmodule

Cs450/counter 2bc

这道题要求实现一个分支预测器,没学过计算机体系结构,百度了一下,分支预测器在分支指令执行结束之前猜测哪一路分支将会被运行,以提高处理器的指令流水线的性能。使用分支预测器的目的,在于改善指令管线化的流程。现代使用指令管线化处理器的性能能够提高,分支预测器对于现今的指令流水线微处理器获得高性能是非常关键的技术。

这里其实也不用对分支预测器特别了解,能按照状态转换图写出代码就行了。

懒得写两个always了,直接一个always给实现了。

module top_module(
    input clk,
    input areset,
    input train_valid,
    input train_taken,
    output reg[1:0] state
);
    parameter SNT=0,WNT=1,WT=2,ST=3;
    always@(posedge clk or posedge areset)
    begin
        if(areset)
            state <= WNT;
        else if(train_valid)begin
            case(state)
                SNT:state <= train_taken?WNT:SNT;
                WNT:state <= train_taken?WT:SNT;
                WT:state <= train_taken?ST:WNT;
                ST:state <= train_taken?ST:WT;
            endcase
        end
    end
endmodule

Cs450/history shift

题目很长,看了半天也不是特别懂,要写代码的话其实直接看description就行了。

predict_valid= 1,移入predict_taken到predict_history,当train_mispredicted= 1则移入train_taken到train_history,注意misprediction优先级更高,所以放在上面的else if中。

module top_module(
    input clk,
    input areset,
    input predict_valid,
    input predict_taken,
    output reg[31:0] predict_history,
    input train_mispredicted,
    input train_taken,
    input [31:0] train_history
);
    always@(posedge clk or posedge areset)
    begin
        if(areset)
            predict_history <= 32'd0;
        else if(train_mispredicted)begin
            predict_history <= {train_history[30:0],train_taken};
        end
        else if(predict_valid)begin
            predict_history <= {predict_history[30:0],predict_taken};
        end
    end
endmodule

Cs450/gshare

这题是真的彻底看不懂了,抄了网上大佬的答案。链接:http://blog.74ls74.org/2022/03/17/20220317_HDLbits_uwaterloo_cs450/

module top_module(
    input clk,
    input areset,
    input  predict_valid,
    input  [6:0] predict_pc,
    output predict_taken,
    output reg [6:0] predict_history,
    input train_valid,
    input train_taken,
    input train_mispredicted,
    input [6:0] train_history,
    input [6:0] train_pc
);
    reg [1:0] PHT[127:0];
    integer i;
    always @(posedge clk, posedge areset) begin
        if (areset) begin
            predict_history <= 0;
            for (i=0; i<128; i=i+1) PHT[i] <= 2'b01;
        end
        else begin
            if (train_valid && train_mispredicted)
                   predict_history <= {train_history[6:0], train_taken};
            else if (predict_valid)
                predict_history <= {predict_history[6:0], predict_taken};
            if (train_valid) begin
                if (train_taken)
                    PHT[train_history ^ train_pc] <= (PHT[train_history ^ train_pc] == 2'b11) ? 2'b11 : (PHT[train_history ^ train_pc] + 1);
        else
                    PHT[train_history ^ train_pc] <= (PHT[train_history ^ train_pc] == 2'b00) ? 2'b00 : (PHT[train_history ^ train_pc] - 1);
            end
        end
    end
    assign predict_taken = PHT[predict_history ^ predict_pc][1];
endmodule

发表回复