原创 TestBench 中如何产生精确的时钟的方法

2010-10-3 18:52 9783 12 12 分类: FPGA/CPLD

  编写TestBench的目的就是将激励施加一个设计(Design),观察它的响应,并将这个响应和期望的结果进行比较。


 下面将说明如何生成精确的时钟信号。下面是用Verilog 编写的两个程序用来生成100Mhz DutyCycle为50%的Clock。


 例1 使用1 和0 显示的赋值:


 `timescale 1ns / 100ps


 reg clk;


 always


 begin


 #5;


 clk = 1'b0;


 #5;


 clk = 1'b1;


 end


 


 例2: 使用clk = ~clk的语句


 `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。


 1 整形除法可以加快时钟的产生 同时可能造成截断错误


 当使用Verilog产生正确的Clock  或者波形的时候,必须选择适当的时延单位和时延精度,这样才能将波形的边沿设置在准确的位置,当使用类似Cycle/2的表达式时,为了计算延时,必须确定整数运算不会截断变量的小数部分。如例3 我想产生的Clock的period 为15 怵,但我得到的14ns的信号,因为整数除法将小数部分截断了。


 例3: 激励产生中的截断错误


 `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


 


2 。Verilog的时延精度(timescale)会影响信号的边沿


 如果延时精度相对天当前的延时单位太低 ,延时(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


 

PARTNER CONTENT

文章评论0条评论)

登录后参与讨论
我要评论
0
12
关闭 站长推荐上一条 /1 下一条