Testbench中的一些小问题

一些基本概念:

   UUT: Unit Under Test

   DUT:Design Under Test

两者应该是差不多的,只是DUT感觉在SV和UVM中提及比较多,而UUT在Verilog testbench中例化模块时经常提及。

刷HDLBits时,犯了个错误:

`timescale 1ps/1ps
module top_module ();
    reg clk;
    initial begin
        clk = 0;
    end
    forever begin
        #5 clk = ~clk;
    end
    dut uut
    (
        .clk(clk)
    );
endmodule

弄死过不了编译检查,跑去翻书才发现,forever循环语句与always语句的不同之处在于不能独立写在程序中,而必须写在initial块中

`timescale 1ps/1ps
module top_module ();
    reg clk;
    initial begin
        clk = 0;
    	forever begin
        	#5 clk = ~clk;
        end
    end
    dut uut
    (
        .clk(clk)
    );
endmodule

这样写就直接过编译了

其实通常用 always #half_period clk = ~clk;或者是在initial块里写 forever #half_period clk = ~clk;就可以了。

要完成上面A、B的波形输出,看似简单,其实要明白begin-end顺序块和#的延时含义,注意到该模块中#会一直暂停在这里,直达时间过去,才会进行后面的动作

module top_module ( output reg A, output reg B );

    // generate input patterns here
    initial begin//电路是并行执行的,但是begin-end是顺序块,#会导致一直阻塞在这里,等待完成以后其他部分才会跟着一起动作
	A = 0;
        B = 0;
        #10 A = 1;//经过10 A跳变为1  即 A在0 共10,经历的时间为10
        #5  B = 1;//再经过5 B跳变为1 即 B在0 共10 + 5 = 15,经历的时间为15
        #5  A = 0;//再经过5 A跳变为0 即 A在1 共 10,经历的时间为15 + 5 = 20(相对于B),也可以是10 + 10 = 20(相对于A)
        #20 B = 0; //再经过20 B跳变为0 即 B在1 共 25,经历的时间为20 + 20 = 40(相对于A), 也可以是15 + 25 = 40(相对于B)
    end

endmodule

 其实把A、B分成两个initial块会更直观!因为initial块是独立并行执行的

posted @ 2022-07-15 09:02  million_yh  阅读(277)  评论(0编辑  收藏  举报