编写TestBench的目的就是将激励施加一个设计(Design),观察它的响应,并将这个响应和期望的结果进行比较。下面将说明如何生成精确的时钟信号。下面是用Verilog 编写的两个程序用来生成100Mhz DutyCycle为50%的Clock。
`timescale 1ns / 100ps reg clk; always begin #5; clk = 1'b0; #5; clk = 1'b1; end
`timescale 1ns / 100ps reg clk; initial begin clk = 1'b0; end always begin # 5 clk = ~clk; end
例1和例2 都生成正确的Clock,例1的方法使用1和0 显示赋值会更可靠,另外可以更好地控制Clock的初始相位,同样可以用来设计出不同DutyCycle的Clock。例2使用clk = ~clk的语句时,将依赖Clock信号的初始值,而不是默认的1‘bx,如何没有给clk赋初值,试想将1’bx取反 得到的是什么?将不能产生Clock。
当使用Verilog产生正确的Clock 或者波形的时候,必须选择适当的时延单位和时延精度,这样才能将波形的边沿设置在准确的位置,当使用类似Cycle/2的表达式时,为了计算延时,必须确定整数运算不会截断变量的小数部分。如例3 我想产生的Clock的period 为15ns,但我得到的14ns的信号,因为整数除法将小数部分截断了。
`timescale 1ns / 1ns module TestBench; ....... reg clk; parameter Cycle = 15; always begin #(Cycle/2) ; // Interger division clk = 1'b0; #(Cycle/2) ; // Interger division clk = 1'b1; end endmodule
如果延时精度相对天当前的延时单位太低 ,延时(delay)的值和预期值相比会变大或变小,当这种情况发生时钟信号上时,它会改变时钟沿的相对位置。例如例4中的Module会生产生一个的period为16ns的时钟信号,因为是由实数除法得到的值再经过舍入得到的整形值。
`timescale 1ns / 1ns module TestBench; ....... reg clk; parameter Cycle = 15; always begin #(Cycle/2.0) ; // Real division clk = 1'b0; #(Cycle/2.0) ; // Real division clk = 1'b1; end endmodule
综上所述 想产生一个精确的波形,必须根据需要 选择恰当的时延单位 时间精度 ,同时明白整形除法和实数除法 区别。例5提供了能够保证实现7.5ns的半周期长度的时延精度,因此可以产生周期为15ns的Clock。
例5:
`timescale 1ns / 100ps module TestBench; ....... reg clk; arameter Cycle = 15; always begin #(Cycle/2.0) ; // Real division clk = 1'b0; #(Cycle/2.0) ; // Real division clk = 1'b1; end endmodule
未经允许不得转载:TacuLee » Testbench中如何产生精确的时钟