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
原文地址:https://www.cnblogs.com/caiya/p/9876950.html