使用modelsim进行Verilog仿真(包含testbench编写)

系列文章目录

在这里插入图片描述
那啥书接上回
FPGA verilog入门


前言

上一次在FPGA verilog入门中说到使用quartus II 对开发板进行操作点亮LED,在这个过程中实现了Verilog的编写以及在quartus II 中完成了功能性仿真,这回使用modelsim进行仿真。


提示:以下是本篇文章正文内容。

一、Modelsim工程新建

与所有工程一样,File->New->Project,这就不多说了,然后就是需要新建程序,然后把程序文件添加进工程中。
仍然以点LED为例,需要使用到的文件有led0_module.v和led_tb.vt,后者为testbench文件,类似于quartus II中的波形文件。在这里插入图片描述

led0_module.v文件和上一次一样,如下所示,就不多说了。

module led0_module
(
    CLK, RSTn, LED_Out
);

    input CLK;
    input RSTn;
    output LED_Out;
    
    /*************************************/
    
    parameter T1S = 26'd50;//外部晶振50M
    
    /*************************************/
    
    reg [25:0]Count1;
    
    always @ ( posedge CLK or negedge RSTn )
	    if( !RSTn )	
	        Count1 <= 26'd0;
	    else if( Count1 == T1S )
	        Count1 <= 26'd0;
	    else
	        Count1 <= Count1 + 1'b1;
	        
	/*************************************/
	
	reg rLED_Out;
	
	always @ ( posedge CLK or negedge RSTn )
        if( !RSTn ) 
            rLED_Out <= 1'b0;
        else if( Count1 >= 26'd0 && Count1 < 26'd25 )
            rLED_Out <= 1'b1;
        else 
            rLED_Out <= 1'b0;
            
     /***************************************/
     
     assign LED_Out = rLED_Out;
     
     /***************************************/
              
 endmodule

二、Testbench脚本编写

先放代码

`timescale 1 ns/ 1 ns//仿真的单位时间为1ns,精度为1ps
module led_tb;
	reg clk,rstn;
	wire led0_out;
	initial
	begin
		rstn=0;
		#10 rstn=1;
		clk=0;
		forever #1 clk=~clk;
	end
led0_module U1
	(
		.CLK(clk),
		.RSTn(rstn),
		.LED_Out(led0_out)
	);

endmodule

第一句timescale是对时间进行约束,第一个1ns为单位时间,可以理解为一个最基本的时钟周期的时间为1ns,第二个1ns为精度,也就是时间分辨精度,设置为1ns那么在仿真时时间坐标的单位就为1ns。

`timescale 1 ns/ 1 ns//仿真的单位时间为1ns,精度为1ps

下面这句就是对变量的声明,clk和rstn为led0_module的输入,led0_out为输出。led0_out只能为wire类型,因为在led0_module中输出变量LED_Out是使用assign被赋值,所以testbench中的led0_out只能为wire类型。

	reg clk,rstn;
	wire led0_out;

在下面这段代码中,对rstn和clk的行为进行了描述,forever为循环,通常用于时钟的产生,在这里为每1ns时钟电平翻转一次。

	initial
	begin
		rstn=0;
		#10 rstn=1;
		clk=0;
		forever #1 clk=~clk;
	end

最后,下面这段代码用于对模块的实例化。我的理解是这段代码也顺便完成了信号线的pin map功能。即,将上面rstn和clk以及led0_out分别与CLK、RSTn和LED_Out相连接

led0_module U1
	(
		.CLK(clk),
		.RSTn(rstn),
		.LED_Out(led0_out)
	);

三、仿真

如下图所示,全部编译完成后,在led_tb上右键simulate
在这里插入图片描述
然后弹出如下图所示的窗口
在这里插入图片描述
将几个信号拖到波形窗口,然后点击右边红圈中的按钮,多来几次,就能看到波形了
在这里插入图片描述
波形如下图所示
在这里插入图片描述

总结

本文脱离quartus II完成了对testbench的编写,并使用modelsim实现了对模块的仿真。
PS:本人写作水平比较渣,有啥不妥的地方还请及时指出。

  • 25
    点赞
  • 144
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
### 回答1: modelsim testbench是一种用于验证硬件设计的工具。它可以模拟设计的行为,并生成仿真波形,以便验证设计是否符合预期。在使用modelsim testbench时,需要编写测试代码来测试设计的各个方面,例如输入输出接口、时序、状态转换等。通过不断调试和优化测试代码,可以提高设计的可靠性和性能。 ### 回答2: ModelSim是一种功能强大的硬件描述语言(HDL)仿真和调试工具。而testbench(测试台)是一种在仿真环境中用于模拟被测试设计的方法或模块的例程。 在ModelSim中,testbench是一个独立于被测试设计单元的代码文件。它可以用来驱动设计单元的输入信号,并将其输出进行监测和验证。通过创建一个完整的仿真环境,testbench可以对设计单元进行全面的功能验证和性能评估,从而确保设计的正确性和可靠性。 要编写一个有效的testbench,首先需要了解被测试设计单元的规范和功能。然后,在testbench中创建适当的输入信号和时钟,并将其传递给设计单元。通过检查设计单元的输出信号,可以验证其正确性,并与预期结果进行比较。testbench还可以控制、配置仿真环境和记录仿真结果,以便进行验证和调试操作。 在ModelSim中,testbench编写语言可以使用Verilog、VHDL等硬件描述语言。这些语言提供了丰富的语法和特性,可以方便地创建复杂的测试台,并对设计单元进行全面的仿真测试。 总之,ModelSimtestbench是一种用于对硬件设计进行仿真和验证的方法,它是设计验证过程中不可或缺的一部分。通过编写合适的testbench,我们可以确保设计的正确性和可靠性,从而提高设计的质量。 ### 回答3: ModelSim是一种用于硬件描述语言(HDL)仿真的工具,它提供了创建和运行测试台以测试设计的能力。测试台是一个独立的模块,用于为设计提供输入信号,并检查设计输出的正确性。 在ModelSim中,测试台是使用HDL编写的,并与设计模块进行交互。测试台充当仿真环境中的控制单元,可以发送输入向量给设计模块,并通过监测输出来验证设计的行为是否正确。 测试台的编写包括以下几个关键步骤: 1. 定义输入信号:根据设计的需求,定义输入信号的数据类型和格式。 2. 生成输入向量:使用合适的方法生成输入向量,可以是具体的值或者随机生成的值。 3. 将输入信号连接到设计模块:将生成的输入向量连接到设计模块的输入端口,以便输入信号可以流入设计模块。 4. 监测输出信号:定义输出信号的预期值,并监测设计模块的输出是否与预期一致。 5. 运行仿真:将测试台和设计模块一起编译并运行仿真,以验证设计的功能和行为。 通过编写测试台,可以提供多种测试用例来验证设计的正确性和稳定性。测试台可帮助开发人员发现并修复设计中的错误,并确保设计在不同情况下都能正常工作。 总之,ModelSim中的测试台是一个重要的工具,用于验证和确认设计的正确性。通过编写合适的测试台,可以提高设计的可靠性和性能。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值