Testbench编写指南(3)模块化工程的仿真方法

4 篇文章 36 订阅

第3篇的题材是模块化工程的仿真方法。现在只要是功能比较完善、规模比较大的FPGA设计都会采用模块化设计的方法。本文介绍在模块化设计过程中编写testbench并仿真的方法,Vivado对此有很好的特性支持,使用Quartus+ModelSim也可以达到同样的效果。


仿真第1个子模块

在开始设计前,根据设计划分好各功能模块(为了叙述方便,这里以对“FPGA数字信号处理(十三)锁相环位同步技术的实现”中设计的系统仿真为例)。编写好第一个子模块(本例中为双相时钟生成模块),在Vivado中添加仿真sim文件,编写testbench:

`timescale 1ns / 1ps
//-----------------------------------------------------
//   双相时钟信号生成模块测试
//-----------------------------------------------------
module clk_gen_sim;

reg clk, rst;
wire clk_d1, clk_d2;
clk_gen i1
(
    .clk(clk),      //32MHz系统时钟
    .rst(rst),      //高电平有效复位信号
    .clk_d1(clk_d1),  //时钟1
    .clk_d2(clk_d2)   //时钟2
);

always #10 clk = ~clk;

initial begin
    clk = 1'b1;
    rst = 1'b1;
    #50;
    rst = 1'b0;
    #1000; $stop;
end

endmodule

综合正确后,点击“Run Simulation”->“Run Behavioral Simulation”进行行为仿真,仿真结果如下图:
这里写图片描述
仿真结果正确(即功能与预期相符),则表明该子模块设计正确,可以开始下一个子模块的设计和仿真。


加入第N个子模块

和上节一样,设计好一个子模块,则添加一个仿真激励testbench文件,在仿真中确认功能正确性。最终的仿真文件清单如下所示:
这里写图片描述
Vivado对多模块、多文件的仿真提供了很好的特性支持。上面有多个testbench文件,分别对不同的模块进行仿真。当仿真好第一个模块后,需要仿真第二个模块时,对第一个模块对应的testbench点右键->“Disable File”,并将第二个模块对应的testbench点右键->“Set as Top”(当状态为Enable的仿真文件只有一个时会自动设置为Top),如下图所示:
这里写图片描述
如果想要重新仿真先前的模块,在testbench文件上点右键->“Enable File”即可重新将其置为有效。通过这样的方法可以完成所有模块的仿真。


多模块联合仿真

我们知道,模块化设计的代码,各个模块之间的联系是非常紧密的。对于简单的设计还比较好,可以像上节一样每个模块单独测试,各自编写testbench也并不复杂。而更多的设计在仿真时我们期望能直接使用第一个模块产生的信号,作为第二个模块的测试激励,即多模块联合仿真。

比如在“FPGA综合系统设计(七)基于DDC的两路信号相位差检测https://blog.csdn.net/fpgadesigner/article/details/80785174 ”中,在仿真DDC模块(数字下变频)时显然更希望直接使用信号生成模块(signal_gen)中产生的信号作为激励,而不是另外在testbench中生成一个信号作为激励。否则不仅费时费力,也没有测试到模块之间连接的正确性。

方法有两个:第一个是先编写好设计的顶层模块,不断的将子模块实例化到顶层模块中,只对顶层模块做仿真;第二个是在testbench中把需要的子模块都实例化好。

1. 第一种方法

Vivado可以观察模块的内部信号,在运行顶层模块的仿真后,Scope窗口内显示了顶层模块内包含的所有子模块。如下图所示:
这里写图片描述
仿真波形窗口内默认只显示顶层模块的接口和在testbench文件中定义的变量。如果要观察子模块内部的信号,在子模块上右键->“Add to Wave Window”,即可将相关信号添加到波形窗口。

借助于Vivado的这个特性,可以在设计过程中不断在顶层模块中实例化子模块,达到多模块联合仿真的目的。这样做的优点是在编写testbench代码上更省力,缺点是只有一个顶层模块的testbench,无法对各个子模块进行单独测试。

2. 第二种方法

在仿真一个子模块时希望用到其它子模块的输出信号,将两者都在testbench中实例化即可。和下面testbench代码类似:

`timescale 1ns / 1ps
module clk_iq_sim;

reg clk, rst;
wire clk_d1, clk_d2;
wire clk_i, clk_q;
clk_gen i1
(
    .clk(clk),      //32MHz系统时钟
    .rst(rst),      //高电平有效复位信号
    .clk_d1(clk_d1),  //时钟1
    .clk_d2(clk_d2)   //时钟2
);
/*使用clk_gen模块的输出信号作为该模块的输入激励*/
clk_iq i2
(
    .clk(clk),      //32MHz系统时钟
    .rst(rst),      //高电平有效复位信号
    .clk_d1(clk_d1),  //时钟1
    .clk_d2(clk_d2),  //时钟2
    .clk_i(clk_i),
    .clk_q(clk_q)
);

always #10 clk = ~clk;

initial begin
    clk = 1'b1;
    rst = 1'b1;
    #50;
    rst = 1'b0;
    #1000; $stop;
end

endmodule

这样做的好处是仍然可以保持每一个子模块都有一个对应的仿真激励文件,更方便功能测试和文件管理。尤其在经常需要修改和运行仿真的设计中,单独测试一个模块的运行时间比运行总体的顶层模块仿真要节省不少时间。


使用Quartus+ModelSim

Vivado自带的仿真(Vivado Simulation)已经足够好用,而使用Quartus时,由于其自带的波形仿真工具并不方便,经常需要调用ModelSim来仿真。使用Quartus+ModelSim也可以达到上面的效果。

多仿真文件的管理在Quartus主界面的Assignments菜单->Settings窗口中,如下图所示:
这里写图片描述
点击EDA Tool Settings下的Simulation,在Test Benches窗口中可以添加和管理多个testbench文件。在Compile test bench的下拉菜单里选择指定的一个testbench,调用ModelSim仿真时会读取相应的文件。

ModelSim仿真过程中也可以观察到顶层模块内部子模块的信号。在sim-Default窗口下可以看到顶层模块和子模块之间的实例化信息,选中相应的子模块,在Objects窗口(如果没有则在ModelSim主界面的View菜单中选中打开)下会显示出该子模块的相关信号。

对需要显示的信号点右键->“Add to”->“Wave”->“Selected Signals”,即可添加到波形窗口。点击“Run-All”重新运行仿真,新添加信号的波形便会显示出来。
这里写图片描述

  • 13
    点赞
  • 78
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
TestBench编写是验证设计正确性的重要步骤。以下是一些编写TestBench指南: 1. 了解仿真器特性:不同的仿真器具有不同的特性和性能差异,可能会导致不同的仿真结果。了解仿真器的工作原理和特点对于编写高效的TestBench很重要。 2. 设计时钟信号:时钟信号是设计中最重要的信号之一,需要在TestBench中生成一个稳定的时钟信号。这可以通过使用initial块和一些逻辑来实现。 3. 提供激励:TestBench需要提供适当的激励来测试设计。这可以通过调用设计的输入端口或使用测试向量来完成。 4. 终端显示:为了方便观察和验证结果,TestBench可以将设计的输出结果显示在终端或波形窗口上。这可以使用$display或$monitor命令来实现。 5. 遵循设计规则:编写TestBench时,需要遵循一些设计规则。例如,了解仿真器的特性和性能差异,避免使用无限循环等。 6. 分散激励:为了提高编写、维护和更新TestBench代码的效率,可以将不相关的激励分散到独立的逻辑块中。 7. 避免显示不重要的数据:对于大型设计,显示大量的数据会拖慢仿真速度。建议只显示重要的信号数据,并且可以设置显示间隔以保持足够的仿真速度。 以上是编写TestBench的一些基本指南,根据实际情况可能还会有其他特定的要求。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [Testbench编写指南(1)基本组成与示例](https://blog.csdn.net/FPGADesigner/article/details/82021647)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值