设计的仿真与测试
一个设计一旦完成就应当对它进行测试。通过编写激励块,输入激励信号然后检测结果可以检测一个设计功能的正确性。将激励块和设计块分离开来是设计者应该养成的一个好习惯。通常测试块也被称为测试凳(Test Bench),应用不同的测试凳可以对一个设计块进行全方位的测试。激励信号的应用方式大致被分为两种。
第一种,在激励块内调用设计块,并且直接驱动设计块的信号。在图中,激励块成为顶层模块,对输入信号clk 和reset 进行操作,检测并显示输出信号q。
第二种,在顶层的假模块内同时调用激励块和设计块,激励块和设计块仅通过接口相互作用,如下图所示。激励模块驱动信号d_clk 和d_reset,这两个信号与设计块的两个端口clk 和 reset分别相连。它也检测并显示输出信号c_q,该信号与设计块的输出端口q相连。顶层假模块的功能仅仅是为了调用设计块和激励块。
下面对昨天学习的行波计数器进行仿真测试。
昨天行为级描述的代码为
module cnt_4bit (q,clear,clock);
output [3:0] q;
input clear,clock;
reg [3:0] q;
always @(posedge clear or negedge clock)
begin
if (clear)
q=4'd0;
else
q=(q+1) % 16;
end
endmodule
现在改为
module cnt_4bit (q,clear,clock);
output [3:0] q;
input clear,clock;
reg [3:0] q;
always @(posedge clear or negedge clock)
begin
if (clear)
q=4'd0;
else
q=(q+1) % 16;
end
endmodule
现在必须写出激励块以检测行波计数器功能是否正确。在此,必须控制信号clk和reset以检测行波计数器的计数功能和异步复位机制是否都正确。我们将使用下图所示的波形来检测设计块。图中显示了输入信号clk,reset以及4bit的输出信号q。时钟信号clk的时钟周期为10个时间单位;复位信号 reset从0到15保持为高,然后变低,直到195再次变高,至205后变低,输出信号q的范围是从0到15。
下面就准备写出激励块,生成上图中的波形。我们将使用如最开始的图所示的激励方式。在此不要过多考虑Verilog 的语法,将精力集中在激励模块是如何调用设计模块上。
编写激励块
module stimulusl;
reg clk;
reg reset;
wire [3:0] q;
cnt_4bit r1(q,reset,clk); //调用设计块cnt_4bit生成实例r1
//控制信号clk以驱动设计块,时钟周期设为10个时间单位
initial
clk=1'b0; //设置clk到0
always
#5 clk=~clk;
//控制复位信号reset以驱动设计块,0~15为高,15~195为低,195~205为高,然后变低
initial
begin
reset=1'b1;
#15 reset=1'b0;
#180 reset=1'b1;
#10 reset=1'b0;
#20 $finish;
end
//监视输出
initial
$monitor($time,"output q=%d,q);
endmodule
下面就可以运行仿真器了,以检测设计块功能的正确性。仿真的输出结果如图所示。