FPGA设计之Test bench介绍

Verilog 测试平台是一个例化的待测( MUT )模块,重要的是给它施加激励并观测其输出。
逻辑模块与其对应的测试平台共同组成仿真模型,应用这个模型可以测试该模块能否符合自己的设计要求。 编写 TESTBENCH 的目的是为了对使用硬件描述语言设计的电路进行仿真验证,测试设计电路的功能、性能与设计的预期是否相符。通常,编写测试文件的过程如下:
• 产生模拟激励(波形);
• 将产生的激励加入到被测试模块中并观察其响应;
• 将输出响应与期望值相比较。
通常,一个完整的测试文件其结构为
module Test_bench();// 通常无输入无输出
信号或变量声明定义
逻辑设计中输入对应 reg
逻辑设计中输出对应 wire
使用 initial always 语句产生激励
例化待测试模块
监控和比较输出响应
endmodule
1、时钟激励设计
时钟激励产生方法一: 50% 占空比时钟
parameter ClockPeriod=10;
initial
begin
clk_i=0;
forever
#(ClockPeriod/2) clk_i=~clk_i;
end
时钟激励产生方法二: 50% 占空比时钟
initial
begin
clk_i=0;
always #(ClockPeriod/2) clk_i=~clk_i;
end
时钟激励产生方法3:产生固定数量的时钟脉冲
initial
begin
clk_i=0;
repeat(6)
#(ClockPeriod/2) clk_i=~clk_i;
end
时钟激励产生方法4:产生非占空比为 50% 的时钟
initial
begin
clk_i=0;
forever
begin
#((ClockPeriod/2)-2) clk_i=0;
#((ClockPeriod/2)+2) clk_i=1;
end
end
2、复位信号设计
复位信号产生方法一:异步复位
initial
begin
rst_n_i=1;
#100;
rst_n_i=0;
#100;
rst_n_i=1;
end
复位信号产生方法二:同步复位
initial
begin
rst_n_i=1;
@ negedge clk_i)
rst_n_i=0;
#100;
// 固定时间复位
repeat(10) @ negedge clk_i);
// 固定周期数复位
@ negedge clk_i)
rst_n_i=1;
end
复位信号产生方法三:复位任务封装
task reset;
input [31:0] reset_time;
// 复位时间可调,输入复位时间
RST_ING=0;
// 复位方式可调,低电平或高电平
begin
rst_n=RST_ING;
// 复位中
#reset_time;
// 复位时间
rst_n_i=~RST_ING;
// 撤销复位,复位结束
end
endtask
3、双向信号设计
双向信号描述一: inout testbench 中定义为 wire 型变量
// 为双向端口设置中间变量 inout_reg 作为 inout 的输出寄存,其中 inout
// 量定义为 wire 型,使用输出使能控制传输方向
//inout bir_port;
wire bir_port;
reg bir_port_reg;
reg bi_port_oe;
assign bi_port=bi_port_oe ? bir_port_reg : 1'bz;
双向信号描述二:强制 force
// 当双向端口作为输出口时,不需要对其进行初始化,而只需开通三态门
// 当双向端口作为输入时,只需要对其初始化并关闭三态门,初始化赋值需
// 使用 wire 型数据,通过 force 命令来对双向端口进行输入赋值
//assign dinout=(!en) din :16'hz; 完成双向赋值
initial
begin
force dinout=20;
#200
force dinout=dinout-1;
end
4、特殊信号设计
特殊激励信号产生描述一:输入信号任务封装
task i_data;
input [7:0] dut_data;
begin
@(posedge data_en); send_data=0;
@(posedge data_en); send_data=dut_data[0];
@(posedge data_en); send_data=dut_data[1];
@(posedge data_en); send_data=dut_data[2];
@(posedge data_en); send_data=dut_data[3];
@(posedge data_en); send_data=dut_data[4];
@(posedge data_en); send_data=dut_data[5];
@(posedge data_en); send_data=dut_data[6];
@(posedge data_en); send_data=dut_data[7];
@(posedge data_en); send_data=1;
#100;
end
endtask
// 调用方法: i_data(8'hXX);
特殊激励信号产生描述二:多输入信号任务封装
task more_input;
input [7:0] a;
input [7:0] b;
input [31:0] times;
output [8:0] c;
begin
repeat(times)
// 等待 times 个时钟上升沿
@(posedge clk_i)
c=a+b;
// 时钟上升沿 a b 相加
end
endtask
// 调用方法: more_input(x,y,t,z); // 按声明顺序
特殊激励信号产生描述三:输入信号产生 , 一次 SRAM 写信号产生
initial
begin
cs_n=1;
// 片选无效
wr_n=1;
// 写使能无效
rd_n=1;
// 读使能无效
addr=8'hxx;
// 地址无效
data=8'hzz;
// 数据无效
#100;
cs_n=0;
// 片选有效
wr_n=0;
// 写使能有效
addr=8'hF1;
// 写入地址
data=8'h2C;
// 写入数据
#100;
cs_n=1;
wr_n=1;
#10;
addr=8'hxx;
data=8'hzz;
end
Testbench @ wait
//@ 使用沿触发
//wait 语句都是使用电平触发
initial
begin
start=1'b1;
wait(en=1'b1);
#10;
start=1'b0;
end
5、仿真控制语句及系统任务描述
仿真控制语句及系统任务描述
$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 之间的随机数
/*----------------------------------------------------------------
仿真终端显示描述
----------------------------------------------------------------*/
$monitor
// 仿真打印输出 , 大印出仿真过程中的变量,使其终端显示
/*
$monitor($time,,,"clk=%d reset=%d out=%d",clk,reset,out);
*/
$display
// 终端打印字符串 , 显示仿真结果等
/*
$display(” Simulation start ! ");
$display(” At time %t,input is %b%b%b,output is %b",$time,a,b,en,z);
$time
// 返回 64 位整型时间
$stime
// 返回 32 位整型时间
$realtime
// 实行实型模拟时间
/*----------------------------------------------------------------
文本输入方式: $readmemb/$readmemh
----------------------------------------------------------------*/
// 激励具有复杂的数据结构
//verilog 提供了读入文本的系统函数
$readmemb/$readmemh("< 数据文件名 >",< 存储器名 >);
$readmemb/$readmemh("< 数据文件名 >",< 存储器名 >,< 起始地址 >);
$readmemb/$readmemh("< 数据文件名 >",< 存储器名 >,< 起始地址 >,< 结束地址 >);
$readmemb:/* 读取二进制数据,读取文件内容只能包含:空白位置,注释行,二进制数
数据中不能包含位宽说明和格式说明,每个数字必须是二进制数字。 */
$readmemh:/* 读取十六进制数据,读取文件内容只能包含:空白位置,注释行,十六进制数
数据中不能包含位宽说明和格式说明,每个数字必须是十六进制数字。 */
/* 当地址出现在数据文件中,格式为 @hh...h, 地址与数字之间不允许空白位置,
可出现多个地址 */
module
reg [7:0] memory[0:3];// 声明 8 8 位存储单元
integer i;
initial
begin
$readmemh("mem.dat",memory);// 读取系统文件到存储器中的给定地址
// 显示此时存储器内容
for(i=0;i<4;i=i+1)
$display("Memory[%d]=%h",i,memory[i]);
end
endmodule
/*mem.dat 文件内容
@001
AB CD
@003
A1
*/
// 仿真输出为
Memory[0] = xx;
Memory[1] = AB;
Memory[2] = CD;
Memory[3] = A1;

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/812853.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

LLMs之Morphic:Morphic(一款具有生成式用户界面的人工智能答案引擎)的简介、安装、使用方法之详细攻略

LLMs之Morphic&#xff1a;Morphic(一款具有生成式用户界面的人工智能答案引擎)的简介、安装、使用方法之详细攻略 目录 Morphic的简介 1、技术栈 Morphic的安装和使用方法 1、克隆仓库 2、安装依赖 3、填写密钥 4、本地运行应用 部署 Morphic的简介 2024年4月初发布&#xff…

P8715 [蓝桥杯 2020 省 AB2] 子串分值 (双边检测)

# [蓝桥杯 2020 省 AB2] 子串分值 ## 题目描述 对于一个字符串 $S$, 我们定义 $S$ 的分值 $f(S)$ 为 $S$ 中恰好出现一次的字符个数。例如 $f\left({ }^{\prime \prime} \mathrm{aba}{ }^{\prime \prime}\right)1$&#xff0c;$f\left({ }^{\prime \prime} \mathrm{abc}{ }^{…

2.c++常见的特殊语法情况

1.const数据类型和constexpr的运用 const定义的值不能被改变&#xff0c;在整个作用域中都保持固定&#xff0c;当然&#xff0c;可以通过函数以形参的形式输入函数。代码如下&#xff1a; #include <iostream> using namespace std;constexpr int fibonacci(const int …

【算法刷题day24】Leetcode:77. 组合

文章目录 Leetcode 77. 组合解题思路代码总结 草稿图网站 java的Deque Leetcode 77. 组合 题目&#xff1a;77. 组合 解析&#xff1a;代码随想录解析 解题思路 递归三部曲&#xff1a;递归函数的返回值以及参数&#xff1b;回溯函数终止条件&#xff1b;单层搜索的过程 代码…

Docker 镜像推送到docker hub

查看容器 #sudo docker ps -a commit容器为镜像 $ sudo docker commit d7b5e8d56a75 ubuntu_pytorch39_v4 #sha256: ********** 查看镜像信息 $ sudo docker images 登录 docker hub $ sudo docker login --username用户名 registry.cn-beijing.aliyuncs.com #密码 为…

AIGC的崛起:定义未来内容创作的新纪元

&#x1f31f;文章目录 &#x1f31f;AIGC简介&#x1f31f; AIGC的相关技术与特点&#x1f31f;AIGC有哪些应用场景&#xff1f;&#x1f31f;AIGC对其他行业影响&#x1f31f;面临的挑战与问题&#x1f31f;AIGC未来发展 &#x1f31f;AIGC十大热门网站推荐&#xff1a; 文心…

华为OD-C卷-按身高和体重排队[100分]

题目描述 某学校举行运动会&#xff0c;学生们按编号(1、2、3…n)进行标识&#xff0c;现需要按照身高由低到高排列&#xff0c;对身高相同的人&#xff0c;按体重由轻到重排列&#xff1b;对于身高体重都相同的人&#xff0c;维持原有的编号顺序关系。请输出排列后的学生编号…

芯科科技xG26系列产品为多协议无线设备性能树立新标准

提供业界最高容量的闪存、RAM和GPIO组合&#xff0c;支持Matter over Thread 2024年4月9日 – 致力于以安全、智能无线连接技术&#xff0c;建立更互联世界的全球领导厂商Silicon Labs&#xff08;亦称“芯科科技”&#xff0c;NASDAQ&#xff1a;SLAB&#xff09;&#xff0c…

Java基础知识(包装类和Math类)

包装类 1.包装类的定义 包装类是将基本数据类型转换为对象&#xff0c;满足了Java的面向对象编程 2.包装类的作用 2.1方便与对象的操作 2.2提供了一系列实用的方法 2.3使用集合泛型存储基本数据类型数据时必须使用包装类型 2.4当作参数传递 3.包装类的对应 Java有8种基本…

.NET ManagedThreadId用法

在.NET中&#xff0c;ManagedThreadId 是一个属性&#xff0c;它属于 System.Threading.Thread 类。这个属性用于获取当前托管线程的唯一标识符。在.NET应用程序中&#xff0c;当你需要识别或跟踪特定的线程时&#xff0c;ManagedThreadId 可以非常有用。 下面是一些使用 Mana…

先过我这一关 - signal

先过我这一关 - signal 在运行程序的时候&#xff0c;一般都知道运行 CtrlC 八成就会把程序给中断&#xff0c;类似于应用程序里面的CLOSE &#xff0c;但是如果有些数据在运行过程中没有保存&#xff0c;就会比较尴尬&#xff0c;此时就需要借助signal同学&#xff0c;让他对…

Transformer详细介绍

目录 前言 一、背景 传统序列模型的问题 Transformer的动机 二、组成部分 自注意力机制&#xff08;Self-Attention&#xff09; 编码器和解码器 位置编码 前馈神经网络 三、训练和推理 训练过程 推理过程 四、应用 自然语言处理任务 图像处理和其他领域 BERT和…

吴恩达机器学习-实践实验室:协同过滤推荐系统(Collaborative Filtering Recommender Systems)

在本练习中&#xff0c;您将实现协作过滤&#xff0c;以构建电影推荐系统。 文章目录 1-概念2-推荐系统3-电影评分数据集4-协作过滤学习算法4.1协同过滤成本函数 5-学习电影推荐6-建议7-祝贺 软件包 我们将使用现在熟悉的NumPy和Tensorflow软件包。 import numpy as np import…

调用nltk分词库时出现nltk_data Error loading averaged_perceptron_tagger问题的解决办法

问题描述&#xff1a;运行时出现[nltk_data] Error loading averaged_perceptron_tagger&#xff0c;Name or service not known问题&#xff0c;详见下图。 由于这个问题最近总是困扰开发和调试工作&#xff0c;因此将彻底的解决办法记录如下&#xff0c;如下设置好就不需要漫…

【数据结构】07查找

查找 1. 基本概念2. 顺序表查找2.1 顺序查找2.2 顺序查找优化-哨兵 3. 有序表查找3.1 折半查找&#xff08;二分查找&#xff09; 4. 分块查找&#xff08;索引顺序查找&#xff09;5. Hash表&#xff08;散列表&#xff09;5.1 散列函数的设计5.2 代码实现5.2.1 初始化Hash表5…

netcat检测工具

1.下载&#xff1a; windows下载地址&#xff1a;netcat-windows linux下载地址&#xff1a;netcat-linux 2. 安装&#xff1a; windows&#xff1a;打开上方链接下载后解压至桌面即可 centos&#xff1a; ① 可以使用yum install nc -y安装 ② 也可以打开上方链接下载rpm包…

装修后快速入住指南,除甲醛的10个小妙招。福州中宅装饰,福州装修

装修后除甲醛的方法有很多种&#xff0c;以下是一些常见的方法&#xff1a; 1. 通风 通风是最基本的除甲醛方法之一&#xff0c;打开窗户让空气流通&#xff0c;可以将室内的甲醛排出。可以在早晨和晚上空气质量较好的时候进行通风。 2. 植物吸收 一些植物如吊兰、常春藤、虎…

李廉洋;4.13黄金,原油最新资讯,下周一盘走势分析及策略。

美国杜克大学大宗商品研究教授Harvey表示&#xff0c;目前除了避险情绪外&#xff0c;“上涨惯性”也是促使黄金“疯涨”的原因。他表示&#xff1a;“目前不断涌入黄金市场的资金实际上在增加风险敞口&#xff0c;除了散户&#xff0c;对冲基金和其他机构投资者也加入了黄金热…

MongoDB 按照某个字段分组,并按照分组的记录数降序排列

以下是一个示例查询&#xff1a; db.collection.aggregate([{$group: {_id: "$quoteId", // 按照quoteId字段进行分组count: { $sum: 1 } // 统计每个分组的记录数}},{$sort: {count: -1 // 按照记录数降序排序}} ]) 在这个查询中&#xff1a; $group阶段将文档按照q…

黑龙江等保测评Linux服务器的三种配置 IP方法

方法一&#xff1a;使用nmcli命令 说明&#xff1a; 使用nmcli命令配置的网络配置可以立即生效且系统重启后配置也不会丢失。 nmcli介绍 nmcli是NetworkManager的一个命令行工具&#xff0c;它提供了使用命令行配置由NetworkManager管理网络连接的方法。nmcli命令的基本格式为…