Testbench仿真脚本编写指北

server/2024/11/28 5:58:13/

[!note]
由于 Quartus 的 VWF 仿真只能仿真很短的时间,而且 Vivado 仿真的时候也需要添加激励信号,因此需要编写 testbench 文件进行激励仿真。

Testbench 文件结构

编写 testbench 的目的是为了测试 module 的功能、性能是否符合设计的预期。验证设计的功能包括以下步骤:

  1. 产生合适的激励波形:该激励通常要覆盖被测 HDL 模块所有可能产生的输入状态;
  2. 将产生的激励信号加入到 DUT 中并观察其响应:即将 DUT 模块例化的 Testbench 中,运行仿真测试;
  3. 将输出的响应与期望值比较。
    Testbench 的结构一般模块如下
module Test_bench_name();
// 01:信号或变量声明定义
// --逻辑设计中输入对应 reg 型
// --逻辑设计中输出对应 wire 型
// 02:使用 ini[ti](https://bbs.elecfans.com/group_715)al 或 always 语句产生激励
// 03:例化待测试DUT模块
// 04:监控和比较输出响应
endmodule

代码示例

时钟激励输入示例

/*----------------------------------------------------------------
时钟激励产生方法一:50%占空比时钟
----------------------------------------------------------------*/
parameter ClockPeriod=10; //参数化时钟周期
initialbeginclk_i=0;forever#(ClockPeriod/2) clk_i = ~clk_i;
end/*----------------------------------------------------------------
时钟激励产生方法二:50%占空比时钟
----------------------------------------------------------------*/
initial
beginclk_i=0;
end
always #(ClockPeriod/2) clk_i=~clk_i;/*----------------------------------------------------------------
时钟激励产生方法三:产生固定数量的时钟脉冲
----------------------------------------------------------------*/
parameter ClockPeriod=10; //参数化时钟周期
initial
beginclk_i=0;repeat(6)#(ClockPeriod/2) clk_i=~clk_i;
end/*----------------------------------------------------------------
时钟激励产生方法四:产生非占空比为 50%的时钟
----------------------------------------------------------------*/
parameter ClockPeriod=10; //参数化时钟周期
initial
begin
clk_i=0;
foreverbegin#((ClockPeriod/2)-2) clk_i=0;#((ClockPeriod/2)+2) clk_i=1;end
end

复位激励输入示例

/*---------------------------------------------------------------- 
复位信号产生方法一:异步复位
----------------------------------------------------------------*/
initial
begin[rs](https://www.elecfans.com/tags/rs/)t_n_i=1;#100; rst_n_i=0;#100; rst_n_i=1; 
end
/*---------------------------------------------------------------- 
复位信号产生方法二:同步复位
----------------------------------------------------------------*/
initial
beginrst_n_i=1; clk_i = 0;@(negedge clk_i)rst_n_i=0;#100; //固定时间复位repeat(10) @(negedge clk_i); //固定周期数复位@(negedge clk_i)rst_n_i=1; 
end
always #5 clk_i=~clk_i;/*---------------------------------------------------------------- 
复位信号产生方法三:复位任务封装
----------------------------------------------------------------*/
task reset;
input [31:0] reset_time; //复位时间可调,输入复位时间RST_ING=0; //复位方式可调,低电平或高电平beginrst_n=RST_ING; //复位中#reset_time; //复位时间rst_n_i=~RST_ING; //撤销复位,复位结束end
endtask

仿真控制语句和系统任务描述

``

/*---------------------------------------------------------------- 
仿真控制语句及系统任务描述
----------------------------------------------------------------*/
$stop  // 停止运行仿真,modelsim 中可继续仿真
$stop(n) //带参数系统任务,根据参数 0,1或2不同,输出仿真信息
$finish //结束运行仿真,不可继续仿真
$finish(n) //带参数系统任务,根据参数 0,1或2不同,输出仿真信息
//0:不输出任何信息
//1:输出当前仿真时刻和位置
//2:输出当前仿真时刻、位置和仿真过程中用到的 memory 以及 CPU 时间的统计
$random //产生随机数
$random % n //产生范围-n 到 n 之间的随机数
{$random} % n //产生范围 0 到 n 之间的随机数
/*----------------------------------------------------------------

文本读取

/*---------------------------------------------------------------- 
文本输入方式:$readmemb/$readmemh
----------------------------------------------------------------*/
$readmemb/$readmemh("<数据文件名>",<存储器名>);
$readmemb/$readmemh("<数据文件名>",<存储器名>,<起始地址>);
$readmemb/$readmemh("<数据文件名>",<存储器名>,<起始地址>,<结束地址>);
$readmemb:/*读取二进制数据,读取文件内容只能包含:空白位置,注释行,二进制数
数据中不能包含位宽说明和格式说明,每个数字必须是二进制数字。*/
$readmemh:/*读取十六进制数据,读取文件内容只能包含:空白位置,注释行,十六进制数
数据中不能包含位宽说明和格式说明,每个数字必须是十六进制数字。*/

http://www.ppmy.cn/server/145541.html

相关文章

健康养生:开启活力生活之门

在快节奏的现代生活中&#xff0c;人们愈发重视健康养生。它不仅是一种生活方式&#xff0c;更是对生命的尊重与呵护&#xff0c;让我们能以更佳状态迎接生活挑战&#xff0c;享受美好人生。 健康养生&#xff0c;饮食首当其冲。应秉持营养均衡的原则&#xff0c;确保每餐都有…

探索 Spring 框架核心组件:构建强大 Java 应用的基石

Spring框架作为Java企业级开发的首选框架之一&#xff0c;其强大的功能和灵活的架构深受开发者喜爱。Spring框架的核心组件共同构建了一个高效、可扩展的应用程序开发平台。本文将深入探讨Spring框架的核心组件&#xff0c;揭示它们如何在Spring框架中发挥关键作用。 一、Bean…

第三十三章 UDP 客户端 服务器通信 - IPv4 和 IPv6

文章目录 第三十三章 UDP 客户端 服务器通信 - IPv4 和 IPv6 第三十三章 UDP 客户端 服务器通信 - IPv4 和 IPv6 UDP 支持 IPv4 和 IPv6 互联网协议。由于这些协议不兼容&#xff0c;服务器和客户端都必须使用相同的Internet协议&#xff0c;否则传输将失败。 IPv4 地址具有以…

基于VMware 的 deepin 系统 学习 安装 1Panel mysql redis

基于VMware 的 deepin 系统 学习 虚拟机安装镜像 选择安装的deepin23镜像 纯粹个人使用的虚拟机配置 选择第二个选项安装 虚拟机而已 直接全盘安装 缺了几个图 都是默认 然后完成安装后重启到如下界面 填写你的主机名称 账号密码 然后就是进入到了主页面可以愉快的开始使…

AI 助力开发新篇章:云开发 Copilot 深度体验与技术解析

本文 一、引言&#xff1a;技术浪潮中的个人视角1.1 AI 和低代码的崛起1.2 为什么选择云开发 Copilot&#xff1f; 二、云开发 Copilot 的核心功能解析2.1 自然语言驱动的低代码开发2.1.1 自然语言输入示例2.1.2 代码生成的模块化支持 2.2 实时预览与调整2.2.1 实时预览窗口功能…

Python学习指南 + 谷歌浏览器如何安装插件

找往期文章包括但不限于本期文章中不懂的知识点&#xff1a; 个人主页&#xff1a;我要学编程(ಥ_ಥ)-CSDN博客 所属专栏&#xff1a; Python 目录 前言 Python 官方文档的使用 谷歌浏览器中如何安装插件 前言 在学习Python时&#xff0c;我们可能会出现这样的困惑&#x…

QT 跨平台实现 SSDP通信 支持多网卡

一.多网卡场景 在做SSDP通信的时候,客户端发出M-search命令后, 主机没有捕捉到SSDP的消息,你可以查看下,是不是局域网下,既打开了wifi,又连接了本地网络,mac os下很容易出现这种场景。此时,我们发送消息时,需要遍历所有网卡并发送M-search命令。 二.QT相关接口介绍 1…

动态定时任务在Spring Boot中集成Quartz的实践

在现代软件开发中&#xff0c;定时任务是一个常见的需求&#xff0c;比如定时备份数据、定时发送邮件等。Spring Boot提供了对Quartz定时任务的集成支持&#xff0c;使得我们可以轻松地在Spring Boot应用中实现定时任务。本文将介绍如何在Spring Boot中集成Quartz&#xff0c;并…