前一节已经叙述过,要仿真设计的功能,必须为其建立一个testbench 也叫仿真平台。为了验证设计模块功能的正确性,我们通常需要在testbench中编写一些激励给设计模块,同时观察这些激励在设计模块(DUV)中的响应是否与我们的期望值一致。
要充分验证一个设计,需要模拟各种外部的可能情况,特别是一些边界情况,因为往往是这些边界情况最容易出问题。
下图显示了一个DUV。我们不仅需要产生时钟信号和复位信号,而且还需要编写一系列的仿真向量,同时观察DUV的响应,确认仿真结果。
一、仿真激励与被测对象的连接
在testbench中需要实例化被测试模块(DUV),DUV的端口与testbench中的信号互连需要遵循一定的规则
这里需要提醒的是,驱动双向信号的也一定是一个三态的线网,而不能是寄存器类型,否则就会发生冲突。
二、使用initial语句和always语句
initial和always是两种基本的过程结构语句,在仿真开始时就相互并行执行。通常来说,被动地检测响应时使用always语句,而主动地产生激励时则使用initial语句。
initial和always的区别是initial语句只执行一次,而always语句则不断地重复执行。但是,如果希望在initial里多次运行一个语句块,可以在initial里嵌入循环语句(如while、repeat、for和forever等),比如
initial
begin
forever永远执行
begin
...
end
end
而always语句通常只有在一些条件发生时才能执行,比如
always@(posedge clock)
begin
siga=sigb;
...
end
当发生clock上升沿时,执行always操作,begjn...end中的语句顺序执行
三、时钟、复位的写法
用initial语句产生时钟的方法如下
产生一个周期为10的时钟
parameter FAST_PERIOD=10;
reg clock;
initial
begin
clock=0;
forever
#(FAST_PERIOD/2) clock=~clock;
end
用always语句产生时钟的方法如下
parameter FAST_PERIOD=10;
reg clock;
initial
clock=0;
always
#(FAST_PERIOD/2) clock=~clock;
以上写法产生的波形如图所示