zoukankan      html  css  js  c++  java
  • 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
  • 相关阅读:
    2020年全国安全生产月活动主题、挂图、招贴、标语、宣教用书等系列产品
    2020年安全生产月主题挂图指定宣教用品目录
    LNMP分离式部署步骤详解
    FTP文件传输服务
    DNS域名解析服务配置与测试
    DHCP服务搭建测试流程
    mysql数据库的操作
    mysql源码编译安装及其配置
    生产环境中ansible的安全处理
    http网页返回码详解
  • 原文地址:https://www.cnblogs.com/caiya/p/9876950.html
Copyright © 2011-2022 走看看