数字电路仿真
一、测试平台(Test Bench)
测试平台的作用是给我们的设计进行验证,通过给被测试模块施加激励信号,观察其输出,然后判断其逻辑功能与时序关系正确与否来判断这个设计是否符合需求。
从图中可以看出,测试模块向待测木块施加激励信号,激励信号必须定义为reg类型,以保持其信号值。待测模块在激励作用下产生输出,输出信号必须定义为wire型。测试模块将输出信息按规定的格式以文本或图形输出,供用户检测。
1、测试程序一般结构
module 仿真模块名;//无端口列表
数据类型说明 //其中激励信号定义为reg类型,输出信号定义为wire类型
parameter、integer等定义
待测模块调用
激励向量定义(always、initial结构等,if-else/for/case/while/repeat/disable等控制语句)
显示格式定义($monitor、$display、$time等)
endmodule
- 测试模块只有模块名,没有端口列表;输入信号(激励信号)必须定义为reg型,以保持其信号值;输出信号(显示信号)必须定义为wire型;
- 在测试模块中调用待测试模块,在调用时应注意端口排列的顺序与模块定义时一致;
- 一般用always、initial等过程快来定义激励信号,使用系统任务和系统函数来定义输出格式;在激励型号的定义中,可使用如下一些控制语句:if-else, for,forever,case,while,repeat,wait,disable,force,release,begin-end,fork-join等,这些控制语句一般只用在always、initial、function、task等过程快中。
2、激励信号产生方式举例
2.1 initial语句产生激励信号
`timescale 1ns/100ps
module test1; //定义模块名
reg A,B,C; //定义输入输出端口,本例只有输入端口,声明为reg类型
initial
begin
A=0;B=1;C=0;
#10 C=1; //#n表示延迟10个时间单位,时间单位由timescale确定,本例中一个时间单位为1ns,精度为100ps。#10表示延迟10ns
#10 A=1;B=0;
#10 A=0;
#10 C=0;
end
initial $monitor($time,,,"A=%d,B=%d,C=%d",A,B,C); //显示
endmodule
2.2 always语句产生激励信号
例1:
`timescale 1ns/1ns
module always_clk;
reg clk;
parameter CYCLE=100;
always #(CYCLE/2) clk=~clk;
initial clk=1;
initial $monitor($time,,,"clk=%d",clk);
endmodule
例2:
`timescale