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

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

3天内不再提示

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

OpenFPGA 来源:OpenFPGA 作者:OpenFPGA 2020-11-20 11:29 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

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

文章目录

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

仿真第1个子模块

加入第N个子模块

多模块联合仿真

1. 第一种方法

2. 第二种方法

使用Quartus+ModelSim

第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的两路信号相位差检测”中,在仿真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”重新运行仿真,新添加信号的波形便会显示出来。

责任编辑:lq

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

    关注

    16

    文章

    580

    浏览量

    47896
  • 仿真
    +关注

    关注

    55

    文章

    4535

    浏览量

    138659
  • 模块化
    +关注

    关注

    0

    文章

    359

    浏览量

    22792

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

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

收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    金属光纤封装技术商业航天的应用:低成本模块化整体测控方案详解

    商业航天高速发展背景下,箭体/卫星结构健康监测面临测控系统成本高、重量重、缺乏整套方案等痛点。本文从电子硬件工程师视角,系统拆解光纤光栅传感系统商业航天应用的三大关键技术——模块化可重构传感架构、微型
    的头像 发表于 04-22 16:40 248次阅读
    金属<b class='flag-5'>化</b>光纤封装技术<b class='flag-5'>在</b>商业航天<b class='flag-5'>中</b>的应用:低成本<b class='flag-5'>模块化</b>整体测控方案详解

    美的与吉宝携手推出AI智能模块化制冷解决方案,覆盖亚洲市场

    。   Signing Ceremony 本次合作为非排他性合作。美的楼宇科技暖通空调制造及智能楼宇系统领域的技术能力,将与吉宝"制冷即服务"(Cooling-as-a-Service, CaaS)及数字优化方面的优势深度
    的头像 发表于 04-15 16:39 113次阅读
    美的与吉宝携手推出AI智能<b class='flag-5'>模块化</b>制冷解决方案,覆盖亚洲市场

    即插即用 DAQ 设备与模块化 DAQ 系统的概念解析

    设备和模块化DAQ系统的概念,分析它们的特点、优势与应用场景。1.即插即用的DAQ设备的概念即插即用(PlugandPlay,简称PnP)是一种允许用户使用计算
    的头像 发表于 03-30 17:31 141次阅读
    即插即用 DAQ 设备与<b class='flag-5'>模块化</b> DAQ 系统的概念解析

    LuatOS 系统框架的模块化设计原理

     LuatOS 的设计核心在于高度模块化与松耦合架构。系统将硬件驱动、通信协议、定时任务等封装为独立模块,通过统一的注册与回调机制接入主事件循环。这种设计不仅提升了代码复用率,也使得开发者可以按需
    的头像 发表于 02-03 15:56 281次阅读
    LuatOS 系统框架的<b class='flag-5'>模块化</b>设计原理

    模块化高精度铷原子钟存在的意义

    时频计量领域,铷原子钟以其稳定性和可靠性成为通信、导航、科研等领域的核心设备。西安同步电子科技有限公司的SYN3306型高性能铷原子钟,通过将10MHz输出设计为模块化结构,实现了从“单一功能设备
    的头像 发表于 01-21 19:09 259次阅读

    鼎阳科技推PXIe模块化示波器、PXIe模块化矢量网络分析仪产品组合,构建新一代模块化、软件定义的测试平台

    新品发布 2026年1月12日,鼎阳科技全新推出PXIe模块化示波器、PXIe模块化矢量网络分析仪和USB矢量网络分析仪三款新品,并同步推出三款PXIe嵌入式控制器与PXIe混合机箱。基于模块化架构
    的头像 发表于 01-14 10:35 6.6w次阅读
    鼎阳科技推PXIe<b class='flag-5'>模块化</b>示波器、PXIe<b class='flag-5'>模块化</b>矢量网络分析仪产品组合,构建新一代<b class='flag-5'>模块化</b>、软件定义的测试平台

    开发过程中如何利用CW32L083系列微控制器的官方固件库进行程序编写和调试?

    开发过程中,如何利用CW32L083系列微控制器的官方固件库进行程序编写和调试?
    发表于 12-15 07:23

    模块化开关电源组合特性测试研究

    模块化开关电源产品被广泛应用于工业自动控制、高可靠设备、科研设备、半导体制冷制热、工控设备、通讯设备、电力设备、仪器仪表、医疗设备等领域。电华星作为国内目前销售规模较大的模块化电源
    的头像 发表于 11-19 14:31 1.2w次阅读
    <b class='flag-5'>模块化</b>开关电源组合特性测试研究

    求助,关于testbench仿真的问题求解

    我用c 写了一段加密算法,其中包含了S盒替换表和密钥等参数,现在想用vcs和testbench仿真这个程序,c 编译成机器码后怎么区分哪段数据是写入ITCM哪段是写入DTCM的,又应该怎么写入DTCM
    发表于 11-05 08:56

    语法纠错和testbench的自动生成

    编写Verilog代码时,我一般都是先在编辑器上写完,因为编辑器vscode或者notepad++可以提供语法高亮和自动补全等功能,然后用仿真器跑仿真,但是在编写过程中不可避免的会有
    发表于 10-27 07:07

    新品发布|LRM模块化高速连接器

    LRM连接器系列随着电子技术的快速发展,电力传输、工业自动、航空航天等领域,对高效、稳定、可靠的电气连接解决方案的需求日益增长。因此日晟万晟自主研发了新一代综合式航电模块标准连接器,
    的头像 发表于 10-20 17:02 2332次阅读
    新品发布|LRM<b class='flag-5'>模块化</b>高速连接器

    【老法师】多核异构处理器M核程序的启动、编写仿真

    文章,小编就将以飞凌嵌入式的OKMX8MP-C开发板为例,为大家介绍多核异构处理器M核程序的启动配置、程序编写和实时仿真的过程
    的头像 发表于 08-13 09:05 4198次阅读
    【老法师】多核异构处理器<b class='flag-5'>中</b>M核程序的启动、<b class='flag-5'>编写</b>和<b class='flag-5'>仿真</b>

    新品推荐|模块化集成式高速连接器

    LRM连接器随着电子技术的快速发展,电力传输、工业自动、航空航天等领域,对高效、稳定、可靠的电气连接解决方案的需求日益增长。因此日晟万晟开发了新一代模块化集成式高速连接器-LRM系列,该款连接器
    的头像 发表于 07-07 18:15 1741次阅读
    新品推荐|<b class='flag-5'>模块化</b>集成式高速连接器

    鸿蒙5开发宝藏案例分享---模块化设计案例分享

    “动态共享库” → 获取HSP性能优化Demo “应用组件” → 学习Ability拆分技巧 最后说两句 模块化设计就像搭积木,用对方法能让开发效率翻倍!建议大家动手试试: 小型应用:单HAP
    发表于 06-12 16:17

    原理图模块化,BOM 物料位号处理

    原理图模块化,把常用的模块保存成一个PART(TOOL 菜单下 选择 Generate Part)。保存成OLB格式。使用的时候,就像使用元器件一样,从库里面拖出来直接放到原理图上即可。 问题是
    发表于 06-09 19:27