verilog之testbench的写法
为什么要编写testbench?
编写Testbench的目的是把RTL代码在Modsim中进行仿真验证,通过查看仿真波形和打印信息验证代码逻辑是否正确。
testbench在这里做的就是给输入进行激励
具体逻辑为:
1.使用testbench给模块喂入输入信号(一般在testbench中定义为reg
型)
2.通过实例化模块(注意实例化模块时带partameter
的写法)把模拟输入信号传入功能模块中
testbench的基本模块
module写法
-
测试模块的命名:tb_<功能模块名> 或 <功能模块名>_tb
功能模块名为:delay_clap , 则对应测试模块名为:delay_clap_tb
需要定义模拟的输入/输出信号: -
输入/输出信号与功能模块中定义的输入/输出信号保持一致
输入信号一般定义为 reg 型信号,因为后面需要在always/initial语句块中被赋值
输出信号一般为 wire型即可
以边沿检测器为例
//原边沿检测器module部分
module delay_clap (
input sig,//异步信号
input clk1,//异步慢时钟
input rstn,//复位信号
input clk2,//目标快时钟
output sig_rise,//上升沿的信号
output sig_down,//下降沿的信号
output sig_out);//直接输出的信号
//具体内容
endmodule
//对应的testbench
module delay_clap_tb;
reg rstn;
reg clk1;
reg clk2;
reg sig;
wire sig_rise;
wire sig_down;
wire sig_out;
//具体内容
endmodule
显然:在定义端口时,testbench中对所有输入都定义为reg
型,所有输出都定义为wire
型。
生成时钟
特定频率的时钟
对于生成特定频率的时钟,一般会在testbench的最开始设定时间单位和时间精度,例如:
`timescale <时间单位>/<时间精度>
`timescale 1ns/1ps
通过规定timescale,来确定生成信号的时间单位,从而确定具体频率
- 时间单位:时间尺度预编译指令 时间单位 / 时间精度
- 定义时间单位: `timescale 1ns/1ns 表示时间单位为1ns,时间精度为1ns
- 时间单位和时间精度由值 1、10、和 100 以及单位 s、ms、us、ns、ps 和 fs 组成
- 时间单位不能比时间精度小
- 仿真过程所有与时间相关量的单位(即1单位的时间)
- 时间精度:决定时间相关量的精度及仿真显示的最小刻度 1ns/1ps 精度为.0.01ns
比如:要产生250MHZ的时钟信号的计算过程如下:
250MHZ的时钟信号一个周期的时长为: 1 / ( 250 × 1 0 6 ) = 4 n s 1/(250\times10^6)=4ns 1/(250×