Verilog测试(仿真)文件TestBench如何编写

一、哪些步骤需要进行仿真

下图是FPGA开发的整个流程,先看一下仿真都出现在哪里。在这里插入图片描述
流程图中绿色的步骤是要进行测试仿真的,即有三个步骤是要进行仿真操作的(有时会省略“综合后仿真”这一步)

1.RTL仿真
也称为综合前仿真、前仿真和功能仿真。
这一步只验证在顶层模块和功能子模块的设计输入完成后,其电路的逻辑功能是否符合设计要求,不考虑门延时和线延时。

2.综合后仿真
综合后仿真加入了门延时。

3.时序仿真
也称为后仿真,在门延时的基础上又加入了线延时。

二、如何编写仿真测试文件

下面以功能仿真为例子,说明测试仿真文件如何编写。

1.首先准备好需要被测模块的Verilog代码

module led_twinkle( 
	input 		 sys_clk ,  //系统时钟
	input 		 sys_rst_n, //系统复位,低电平有效

	output [1:0] led //LED 灯
);

	......          //省略功能部分
	
endmodule

2.编写TestBench测试仿真文件

在Vivado软件中,在左侧的 Flow Navigator 窗口点击 Add Source, 选择 Add or create simulation sources,点击 Next,点击 Create File, 给测试文件命名,通常格式为 “tb_被测试模块名”,点击OK,点击Finish。

在 Source 栏中的 Simulation Sources 中双击生成的 “tb_被测试模块名” 文件,进行编写。

~timescale 1ns / 1ps  //测试时间基本单位为1ns,精度为1ps
 
module tb_led_twinkle(); //通常起名格式为 tb_被测试模块名

//输入
	reg sys_clk; 
	reg sys_rst_n; 
//输出
	wire [1:0] led;

//信号初始化,必须有这一步,容易被忽略
initial begin
	sys_clk = 1'b0; 
	sys_rst_n = 1'b0;
	#200  //延时200ns
	sys_rst_n = 1'b1;
end

//生成时钟,模拟晶振实际的周期时序
always #10 sys_clk = ~sys_clk; //每10ns,sys_clk进行翻转,达到模拟晶振周期为20ns
 
//例化待测模块(模块例化可点击文章最后附上的网址)
led_twinkle u_led_twinkle(   
	.sys_clk (sys_clk),      //注意语句后面为逗号
	.sys_rst_n (sys_rst_n),
	.led (led)              //最后一步无逗号
);

endmodule

在ISE中软件操作方式会有所不同,但测试文件代码编写不变。

模块例化说明链接

  • 96
    点赞
  • 571
    收藏
    觉得还不错? 一键收藏
  • 8
    评论
好的,那我来介绍一下如何编写testbench.v文件进行仿真。 首先,testbench.v文件需要包含被测试的模块以及相应的输入输出。然后,我们需要对输入进行初始化,以便在仿真期间使用。接着,我们需要在仿真过程中不断地向模块输入数据并观察输出结果。最后,我们需要添加一些断言语句,确保输出结果符合预期。 以下是一个简单的testbench.v文件示例,用于测试一个简单的加法模块: ```verilog module testbench; // 定义时钟和复位信号 reg clk; reg rst; // 定义被测试模块的输入输出 reg [7:0] a; reg [7:0] b; wire [7:0] sum; // 实例化被测试模块 adder dut(.clk(clk), .rst(rst), .a(a), .b(b), .sum(sum)); // 初始化时钟和复位信号 initial begin clk = 0; forever #10 clk = ~clk; end initial begin rst = 1; #5 rst = 0; end // 输入数据 initial begin a = 8'h01; b = 8'h02; #10 a = 8'h03; b = 8'h04; #10 a = 8'h05; b = 8'h06; #10 a = 8'h07; b = 8'h08; #10 $finish; end // 监测输出并添加断言语句 always @(posedge clk) begin $display("sum = %d", sum); assert(sum == a + b); end endmodule ``` 在上面的示例中,我们定义了一个加法模块和一个testbench模块。testbench模块实例化了加法模块,并对其进行了测试。在初始化阶段,我们设置了时钟和复位信号,并对输入进行了初始化。在仿真过程中,我们不断地向加法模块输入数据并观察输出结果。我们还添加了一个always块来监测输出并添加断言语句,确保输出结果符合预期。 通过编写类似的testbench.v文件,我们可以对Verilog模块进行仿真,并确保其功能正确。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值