本原创文章由深圳市小眼睛科技有限公司创作,版权归本公司所有,如需转载,需授权并注明出处(www.meyesemi.com)
一:实验简介
实验目的:
了解Modelsim的基本使用方法,完成do文件的编写,提高仿真效率。
实验环境:
Window11
PDS2022.2-SP6.4
Modelsim10.6rc
二:实验原理
将Modelsim的命令编写到一个do文件中,这样每次仿真时,只需运行这个do文件脚本即可自动执行其中的所有命令,从而显著提高重复仿真的效率。
三:接口列表
暂无
四:Testbench文件的编写
Testbench文件其实就是模拟信号的生成,给我们所设计的模块提供输入,以便测试。因为我们上板去生成比特流,尤其是比较复杂的算法,往往是需要耗很多时间的。所以要快速验证我们的设计逻辑是否正常,还得是用仿真来验证,不管是模拟图像的生成还是信号的生成,都可以通过Testbench来完成,但是,要注意一点,仿真通过了只能说明百分之80上板没问题,剩下的可能就要看实际的时序了,毕竟仿真是理想状态,实际总是不太理想。
接下来介绍Testbench的基本编写方法:
`timescale 1ns/1ns 该语句 第一个1ns表示时间单位为1ns,第二个1ns表示时间精度为1ns。注意的是,时间单位不能比时间精度还小。时间单位表示运行一次仿真所用的时间。时间精度表示仿真显示的最小刻度。
#10 表示延时10个单位时间,比如`timescale 1ns/1ns,#10表示延时10ns。
initial 对信号进行初始化,只会执行一次。
{$random}%x,表示随机取[0,x-1]之间的数字。x为正整数。如果是$random%x,则是[-(x-1),x-1]的数。
$display 打印信息,会自动换行。
$stop 暂停仿真。
$readmemb读取文件函数。
$monitor 为监测任务,用于变量的持续监测。只要变量发生了变化,$monitor 就会打印显示出对应的信息。
输入信号一般用reg定义,方便后续用always块生成想要模拟的值,输出一般直接wire引出即可。
例如生成时钟,always#10 sys_clk = ~sysclk; 表示每10个单位时间就翻转一次,如果时间单位是ns,那就是每10ns翻转一次,就是生成了50MHZ的时钟。周期是20ns。
接下来给出一个参考的testbench,如下所示:
`timescale 1ns / 1ns
`define UD #1
module tb_led_test();
reg clk ;
reg rst_n ;
wire[7:0] led ;
reg [7:0] data ;
initial begin