编写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
文章评论(0条评论)
登录后参与讨论