veri HDL modeisim仿真:test bench文件编写
预编译指令:
verilog HDL预编译指令是以" ' "字符开头,而且不需要以";"结尾。
作用:指示在编译verilog hdl源代码前,需要执行哪些操作。
'timescale的使用方法:
verilog hdl的时序分析是以时间先后为顺序的,时延用'timescale定义的时间单位来表示。
一般一个代码文件就用一个'timescale预编译指令,一般放在文件的开头。
格式:'timescale 时间单位/时间精度
时间单位由数字+单位组成,其中数字只能是1,10,100.单位是s,ms,us,ns,ps,fs.
时间精度也是由数字与单位组成,后面的单位是前面单位的下一级。
test bench:
test bench与设计模块有相同点,也有不同点。
相同点是:他们都是verilog hdl代码;都是module开头,endmodule结束。
不同点是:该模块不需要输入输出端口的定义,但是要实例化被测试模块。(实例化类似于c语言的函数调用)
基本格式:
module module_tb
//变量声明
//产生相应激励信号
//实例化被测试模块
//监视输入输出信号
//保存被监视信号的信息
endmodule
备注:
模块名字一般为被测试模块模块名+_tb(test bench缩写)
产生相应的激励信号是根据被测试模块的功能产生完备的输入激励
实例化被测试模块是对被测试模块进行端口映射,把产生的输入激励连接到被测试模块的输入端口中,同时连接输出端口以便观察分析
引脚映射要求:
输入引脚映射用reg或者wire型变量;
输出与双向引脚只能用wire型变量。
**************************************************************************************************************************************************************************************************
自定义模块实例化格式:
module_name instance_name(port_connection);
module_name 是模块名
instance_name是实例化名
port_connection是端口连接关系
一种端口连接方式举例:
比如一个比较大小模块,其端口声明是:
module is_big(
input[7:0] a,
input[7:0] b,
output y
);
那么按端口名称连接的方式如下:
is_big u1_is_big(
.a(d_one),
.b(d_two),
.y(result)
);
**************************************************************************************************************************************************************************************************
initial初始化语句:
该语句在仿真运行中只运行一次,在仿真0时刻开始执行,执行完成后就挂起不再执行;同一个文件可以有多个initial初始化语句。
initial赋初值,initial语句只用于读取初始化存储文件的时候才被综合。
语法格式:
initial
【时序控制】顺序语句;
其中时序控制可以是以时间刻度为单位的时间延时数字,也可以是信号变量。
当顺序语句多于一条时,可以使用begin-end 字符对进行组织。
*************************************************************************************************************************************************************************************************
赋值延时:
赋值延时类似于硬件中的连线,是对赋值操作符右边的值送到赋值操作符左边的信号的连线进行延时建模。
格式:
#delay 赋值语句
#是延时符号,delay是时间单位的数量
************************************************************************************************************************************************************************************************
ok 学完上面的东西 就可以了看懂下面的程序了
1 `timescale 1ns / 1ps 2 module led_test_tb; 3 // Inputs 4 reg clk; 5 reg rst_n; 6 // Outputs 7 wire [3:0] led; 8 // Instantiate the Unit Under Test (UUT) 9 led_test uut ( 10 .clk(clk), 11 .rst_n(rst_n), 12 .led(led) 13 ); 14 initial begin 15 // Initialize Inputs 16 clk = 0; 17 rst_n = 0; 18 // Wait 100 ns for global reset to finish 19 #100; 20 rst_n = 1; 21 // Add stimulus here 22 #2000; 23 $stop;//仿真停止 24 end 25 always #10 clk = ~ clk; //产生 50MHz 时钟源 26 27 endmodule
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?