以前总是用ise,它会自动编写仿真文件,所以用了vivado以后就有点生疏。留一个备份,万一以后用到了方便找。
1. Testbench的概念
Testbench 是一种用任意语言编写的程序或模块,用于在模拟过程中执行和验证硬件模型的功能正确性。 Verilog 主要用于硬件建模(模拟),该语言包含各种资源,用于格式化,读取,存储,动态分配,比较和写入模拟数据,包括输入激励和输出结果。
2. Testbench的组成组件
Testbench 的主要组件如下:
-
时间表声明:指定所有延迟的时间单位
-
Module:它定义了测试文件的top模块,测试文件的top模块通常没有输入输出端口,测试是直接监控寄存器和线网这些内部信号的活动
-
内部信号:它将驱动激励信号进入 UUT 并监控 UUT 的响应,信号驱动和监控
-
UUT 实例化
-
激励生成:编写语句以创建激励和程序块
-
响应监控和比较:自我测试语句,能报告数值,错误和警告
简单来说,仿真tb文件主要包含4部分:顺序无所谓,可以打乱。
1、初始化
2、产生激励
3、仿真暂停
4、实例化
下面就以mealy型状态机,检测序列 “ 01101101 ”,编写仿真文件。
`timescale 1ns / 1ps module tb_mealy01101101; //注意分号,不加;仿真会出现未知态(红色)和高阻态(蓝色) //inputs reg clk; //在always和initial块里的变量要用reg型变量 reg rst_n; reg din; //如果输入是多位,别忘了加位宽。 reg [5:0] din; //outputs wire dout; //1、初始化 initial begin clk = 0; rst_n = 0; din = 0; end //2、产生激励 //时钟激励(写法1) always #10 clk=~clk; /*时钟激励(写法2) forever begin #10 clk=~clk; end*/ always @(posedge clk) begin #100; rst_n = 1'b1; din = 1'b1; #100; din = 1'b1; #100; //#100 din = 1'b0; din = 1'b0; //代表100ns后din由上一个状态1 变为此时的状态0 #100; din = 1'b1; end //3、仿真暂停 initial begin #600 $finish(); end //4、实例化 mealy #( .WIDTH (8 ), //宽度 模块内部的有参数,可以在外部配置 .DEPTH (16 ) //深度 ) mealy_inst ( .clk (clk ), .rst_n (rst_n ), .din (din ), .dout (dout ) ); endmodule
仿真全部报错原因: