对设计进行功能仿真和时序仿真时,需要给待测模块提供激励输入。对于由Verilog语言描述的设计模块,最好的方法自然同样是用Verilog语言对待测模块施加激励和检测模块的输出响应。实际应用中,Verilog测试平台(testbench)就是用来提供上述功能的。Verilog测试平台是一个例化的待测(MUT)Verilog模块,给它施加激励并观测其输出。由于测试平台是用Verilog语言描述 的,因此可以应用到不同的仿真环境中。待测模块和与之对应的测试平台组成一个仿真模型,应用这个模型可以在不同的测试环境中用相同的激励对待测模块进行调试。下面就对不同电路类型分别介绍verilog测试平台的语言结构。
一、测试平台
1.组合电路测试
设计组合电路的测试平台时,待测模块及其功能决定了激烈的选择与测试次数。
对于一个已有的待测模块,测试平台中需要声明与待测模块输入输出端口对应的变量。与输入端口相连接的变量定义为reg,与输出端口相连接的变量定义为wire,例化时将测试平台中声明的变量与待测模块的输入输出端口相关联。使用initial语句控制程序运行,initial语句是一种过程结构,在initial块中可使用延迟控制语句来控制initial块中的程序流动。
这里对一个简单的算术逻辑单元(ALU)为例进行测试,下面是该单元Verilog描述。
/*************************************************************************/
//多动能ALU的Verilog代码
'timescale 1ns/100ps
module alu_4bit(a,b,f,oe,y,p,ov,a_gt_b,a_eg_b,a_lt_b);
input [3:0] a,b;
input [1:0] f;
input oe;
input [3:0] y;
output p,ov,a_gt_b,a_eg_b,a_lt_b;
reg [4:0] im_y;
always @(a or b or f)
begin
ov=1'b0;
im_y=0;
case(f)
2'b00:
begin
im_y=a+b;
if(im_y>5'b01111)
ov=1'b1;
end
2'b01:
begin
im_y=a-b;
if(im_y>5'b01111)
ov=1'b1;
end
2'b10:
im_y[3:0]=a&b;
2'b11:
im_y[3:0]=a^b;
default:
im_y[3:0]=4'b0000;
endcase
end
always @(a or b)
begin
if(a>b)
{a_gt_b,a_ge_b,a_lt_b}=3'b100;
else if(a
{a_gt_b,a_ge_b,a_lt_b}=3'b001;
else
{a_gt_b,a_ge_b,a_lt_b}=3'b010;
end
assign p=^im_y[3:0];
assign y=oe?im_y[3:0]:4'bz;
endmodule
/*************************************************************************/
模块alu_4bit是四功能的算术逻辑单元,输入包括数据信号a、b和功能信号f,输出包括数据信号y和ALU生成的奇偶校验信号p、溢出信号ov及比较信号。
下面代码描述了alu_4bit模块的测试平台。
/*************************************************************************/
module test_alu_4bit;
reg [3:0] a=4'b1011,b=4'b0110;
reg [1:0] f=2'b00;
reg oe=1;
wire [3:0] y;
wire p,ov,a_gt_b,a_eg_b,a_lt_b;
alu_4bit cut(a,b,f,oe,y,p,ov,a_gt_b,a_eg_b,a_lt_b);
initial
begin
#20 b=4'b1011;
#20 b=4'b1110;
#20 b=4'b1110;
#80 oe=1'b0;
#20 $finish;
end
always #23 f=f+1;
endmodule
/*************************************************************************/
与alu_4bit模块相连的变量在声明时被赋初值。用一个initial语句对ALU的输入数据b和输出使能oe赋值,在前60ns,每隔20n给b赋一个新值然后等待80ns,给oe赋0值来禁止ALU的输出,再等待20ns后结束仿真。最终等待20ns后,显示的仿真结果里包含最后一个输入数据产生的输出。
用always语句对alu_4bit的输入数据f赋值,f的初值为0,以后每隔23ns它的值加1.initial块的$finish语句在160ns时被执行,此时所有正在运行的过程语句都停止,仿真结束。
下图所示是仿真后的波形曲线。