当前位置: 首页 > article >正文

Testbench仿真脚本编写指北

[!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; //参数化时钟周期
initial
  begin
    clk_i=0;
    forever#(ClockPeriod/2) clk_i = ~clk_i;
end


/*----------------------------------------------------------------
时钟激励产生方法二:50%占空比时钟
----------------------------------------------------------------*/
initial
begin
  clk_i=0;
end
always #(ClockPeriod/2) clk_i=~clk_i;


/*----------------------------------------------------------------
时钟激励产生方法三:产生固定数量的时钟脉冲
----------------------------------------------------------------*/
parameter ClockPeriod=10; //参数化时钟周期
initial
begin
  clk_i=0;
  repeat(6)
  #(ClockPeriod/2) clk_i=~clk_i;
end


/*----------------------------------------------------------------
时钟激励产生方法四:产生非占空比为 50%的时钟
----------------------------------------------------------------*/
parameter ClockPeriod=10; //参数化时钟周期
initial
begin
clk_i=0;
forever
  begin
    #((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
begin
  rst_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; //复位方式可调,低电平或高电平
  begin
    rst_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.kler.cn/a/411721.html

相关文章:

  • <项目代码>YOLOv8 航拍行人识别<目标检测>
  • K8s的水平自动扩容和缩容HPA
  • Http 请求协议
  • Vue.Draggable使用nested-with-vmodel进行拖拽
  • VOLO实战:使用VOLO实现图像分类任务(二)
  • [每日一氵] 拆分 pip install git+https://github.com/xxx/xx.git@bece3d4
  • 机器学习周报(11.18-11.24)
  • C++:final 关键字用于阻止类被继承或阻止虚函数被进一步重写
  • Node.js笔记(三)局域网聊天室构建1
  • 在 Taro 中实现系统主题适配:亮/暗模式
  • 自动驾驶系统研发系列—智能驾驶倒车盲区终结者:智能侧向警告与制动技术解析
  • MATLAB支持的距离度量
  • 【大数据技术基础】 课程 第8章 数据仓库Hive的安装和使用 大数据基础编程、实验和案例教程(第2版)
  • uniapp定义new plus.nativeObj.View实现APP端全局弹窗
  • MDETR - Modulated Detection for End-to-End Multi-Modal Understanding
  • STM32的AFIO讲解
  • Java 爬虫深度解析销量和商品详情数据获取
  • MongoDB 和 Redis 是两种不同类型的数据库比较
  • 探索Python的HTTP之旅:揭秘Requests库的神秘面纱
  • 【leetcode】全排列 回溯法
  • 高效制作定期Excel报表:自动化与模板化的策略
  • OpenCV 计算图像清晰度
  • 2024年第15届蓝桥杯C/C++组蓝桥杯JAVA实现
  • JavaApi.JDBC( 重点 )
  • 数据结构——用数组实现栈和队列
  • 鸿蒙操作系统(HarmonyOS)