0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

在模块化设计过程中编写testbench并仿真的方法介绍

FPGA之家 来源:FPGA之家 2023-09-04 09:54 次阅读

仿真第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”进行行为仿真,仿真结果如下图:

2cfa69ee-49f6-11ee-97a6-92fbcf53809c.jpg

  仿真结果正确(即功能与预期相符),则表明该子模块设计正确,可以开始下一个子模块的设计和仿真。

加入第N个子模块

  和上节一样,设计好一个子模块,则添加一个仿真激励testbench文件,在仿真中确认功能正确性。最终的仿真文件清单如下所示:

2d0eb99e-49f6-11ee-97a6-92fbcf53809c.jpg

  Vivado对多模块、多文件的仿真提供了很好的特性支持。上面有多个testbench文件,分别对不同的模块进行仿真。当仿真好第一个模块后,需要仿真第二个模块时,对第一个模块对应的testbench点右键->“Disable File”,并将第二个模块对应的testbench点右键->“Set as Top”(当状态为Enable的仿真文件只有一个时会自动设置为Top),如下图所示:

2d1d493c-49f6-11ee-97a6-92fbcf53809c.jpg

  如果想要重新仿真先前的模块,在testbench文件上点右键->“Enable File”即可重新将其置为有效。通过这样的方法可以完成所有模块的仿真。

多模块联合仿真

  我们知道,模块化设计的代码,各个模块之间的联系是非常紧密的。对于简单的设计还比较好,可以像上节一样每个模块单独测试,各自编写testbench也并不复杂。而更多的设计在仿真时我们期望能直接使用第一个模块产生的信号,作为第二个模块的测试激励,即多模块联合仿真。比如在“FPGA综合系统设计(七)基于DDC的两路信号相位差检测”中,在仿真DDC模块(数字下变频)时显然更希望直接使用信号生成模块(signal_gen)中产生的信号作为激励,而不是另外在testbench中生成一个信号作为激励。否则不仅费时费力,也没有测试到模块之间连接的正确性。

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

1. 第一种方法

  Vivado可以观察模块的内部信号,在运行顶层模块的仿真后,Scope窗口内显示了顶层模块内包含的所有子模块。如下图所示:

2d394fb0-49f6-11ee-97a6-92fbcf53809c.jpg

  仿真波形窗口内默认只显示顶层模块的接口和在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窗口中,如下图所示:
2d571b58-49f6-11ee-97a6-92fbcf53809c.jpg

  点击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”重新运行仿真,新添加信号的波形便会显示出来。

2d744016-49f6-11ee-97a6-92fbcf53809c.jpg








审核编辑:刘清

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 锁相环
    +关注

    关注

    35

    文章

    551

    浏览量

    87250
  • FPGA设计
    +关注

    关注

    9

    文章

    425

    浏览量

    26273
  • 仿真器
    +关注

    关注

    14

    文章

    988

    浏览量

    82997
  • DDC
    DDC
    +关注

    关注

    2

    文章

    83

    浏览量

    36865
  • Vivado
    +关注

    关注

    18

    文章

    790

    浏览量

    65103

原文标题:Testbench编写指南(3)模块化工程的仿真方法

文章出处:【微信号:zhuyandz,微信公众号:FPGA之家】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    Perl语言电路设计的应用

    设计,电路仿真是设计的关键。而一个完备而准确的测试文件,则是电路仿真的基础。Perl语言电路设计的应用语言
    发表于 01-11 15:19

    KEil C 模块化程序的编写

    本帖最后由 默默地努力 于 2014-1-19 21:50 编辑 如果哪里没看懂,请直接回帖,24小时之内必回!!!KEil C 模块化程序的编写前言:我们学习C语言的时候,
    发表于 11-16 17:01

    怎么ISE中进行模块化设计?

    你好: 我想在ISE中进行模块化设计,但是TCL脚本方法,还有其他方法可以进行模块化设计吗?
    发表于 10-10 11:46

    单片机编写程序如何模块化

    单片机编写程序如何模块化啊?
    发表于 05-20 11:18

    嵌入式软件开发过程中模块化

    对很多人来,嵌入式软件开发过程中模块化(Modularization)是一个海市蜃楼、是一个书面词汇、是一个过气的时尚——模块化似乎从未真正的实现过。吹牛时人们常不屑的说:没吃...
    发表于 12-20 07:22

    浅析模块化编程思路

    放开手脚,代码写着写着就乱了。不仅后续维护不方便,就是自己也不知道当初为啥这么写。低内聚高耦合的代码需要遵循以下原则:降低耦合度的方法1、 多使用模块化编程的思想,在编写之初,模块需要
    发表于 12-20 06:52

    介绍一下机电暂态开源工具使用过程中的一些体会

    )作者:一一数二三这个工具箱所有代码开源,且提供了图形仿真界面,单元模块化,易于添加新的模块仿真器件。
    发表于 12-30 08:33

    分享两个组合逻辑模块化设计实例以及仿真和上板演示过程

    1、基于FPGA开发板的组合逻辑模块化设计实验设计复杂数字系统时,根据整个系统也就是顶层的功能需求进行分析,将复杂的系统功能分解为多个必要的子功能,依据这些子功能分别对各个功能模块进行设计,这些
    发表于 07-22 15:12

    组合逻辑模块化设计之静态数码管显示一

    小的功能模块模块化设计可以令整个设计的思路更清晰,便于大型设计的分工合作和仿真测试,而且有助于设计文件的维护和复用。在这篇文章,将会分享两个组合逻辑的
    发表于 07-29 15:50

    编写高效率的testbench

    编写高效率的testbench,学习编写测试文件的小伙伴们。
    发表于 05-11 16:40 16次下载

    介绍FPGA中testbench编写技巧

    原来模块中的输入信号,定义成reg 类型,原来模块中的输出信号,定义为wire类型,但这里有个问题,如果在testbench中本身有一个模块需要,如用来产生时钟,送给要
    发表于 01-06 14:52 1761次阅读
    <b class='flag-5'>介绍</b>FPGA中<b class='flag-5'>testbench</b>的<b class='flag-5'>编写</b>技巧

    模块化设计过程中编写testbench仿真的方法

    在开始设计前,根据设计划分好各功能模块(为了叙述方便,这里以对“FPGA数字信号处理(十三)锁相环位同步技术的实现”中设计的系统仿真为例)。编写好第一个子模块(本例中为双相时钟生成
    的头像 发表于 11-20 11:29 3526次阅读

    FPGA仿真的学习课件和工程文件免费下载

    本文档的主要内容详细介绍的是FPGA仿真的学习课件和工程文件免费下载包括了:1、testbench编写,2、仿真工具使用,2、
    发表于 12-10 15:28 30次下载

    使用matlab产生待滤波信号并编写testbench进行仿真分析

    本讲使用matlab产生待滤波信号,并编写testbench进行仿真分析,在Vivado中调用FIR滤波器的IP核进行滤波测试,下一讲使用两个DDS产生待滤波的信号,第五讲或第六讲开始编写
    的头像 发表于 04-27 18:18 3982次阅读
    使用matlab产生待滤波信号并<b class='flag-5'>编写</b><b class='flag-5'>testbench</b>进行<b class='flag-5'>仿真</b>分析

    Verilog Testbench怎么写 Verilog Testbench文件的编写要点

    熟练了一点、但是整体编写下来比较零碎不成体系,所以在这里简要记录一下一般情况下、针对小型的verilog模块进行测试时所需要使用到的testbench文件的编写要点。
    的头像 发表于 08-01 12:44 1505次阅读
    Verilog <b class='flag-5'>Testbench</b>怎么写 Verilog <b class='flag-5'>Testbench</b>文件的<b class='flag-5'>编写</b>要点