Loading [MathJax]/jax/input/TeX/jax.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >FPGA 高手养成记-Test bench文件结构一览无余

FPGA 高手养成记-Test bench文件结构一览无余

作者头像
碎碎思
发布于 2020-06-30 03:25:35
发布于 2020-06-30 03:25:35
97600
代码可运行
举报
文章被收录于专栏:OpenFPGAOpenFPGA
运行总次数:0
代码可运行

文章目录

01. 前言

02. 完成的 Test bench 文件结构

03. 时钟激励设计

  • 时钟激励产生方法一
  • 时钟激励产生方法二
  • 时钟激励产生方法三
  • 时钟激励产生方法四

04. 复位信号设计

  • 复位信号产生方法一
  • 复位信号产生方法二
  • 复位信号产生方法三

05. 双向信号设计

  • 双向信号描述一
  • 双向信号描述二

06. 特殊信号设计

  • 特殊激励信号产生描述一
  • 特殊激励信号产生描述二
  • 特殊激励信号产生描述三

07. 仿真控制语句及系统任务描述

  • 仿真控制语句及系统任务描述
  • 仿真终端显示描述
  • 文本输入方式

08. 总结

01,前言

Verilog测试平台是一个例化的待测(MUT)模块,重要的是给它施加激励并观测其输出。逻辑模块与其对应的测试平台共同组成仿真模型,应用这个模型可以测试该模块能否符合自己的设计要求。

编写TESTBENCH的目的是为了对使用硬件描述语言设计的电路进行仿真验证,测试设计电路的功能、性能与设计的预期是否相符。通常,编写测试文件的过程如下:

  • 产生模拟激励(波形);
  • 将产生的激励加入到被测试模块中并观察其响应;
  • 将输出响应与期望值相比较。

02,完成的Test bench文件结构

通常,一个完整的测试文件其结构为

  • module Test_bench();//通常无输入无输出
  • 信号或变量声明定义
  • 逻辑设计中输入对应reg型
  • 逻辑设计中输出对应wire型
  • 使用initial或always语句产生激励
  • 例化待测试模块
  • 监控和比较输出响应
  • endmodule

03,时钟激励设计

下面列举出一些常用的封装子程序, 这些是常用的写法, 在很多应用中都能用到。

3.1,时钟激励产生方法一

50%占空比时钟

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
parameter ClockPeriod=10;

initial

begin

clk_i=0;

forever

#(ClockPeriod/2) clk_i=~clk_i;

end

3.2,时钟激励产生方法二

50%占空比时钟

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
initial

begin

clk_i=0;

always #(ClockPeriod/2) clk_i=~clk_i;

end

3.3,时钟激励产生方法三:

产生固定数量的时钟脉冲

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
initial

begin

clk_i=0;

repeat(6)

#(ClockPeriod/2) clk_i=~clk_i;

end

3.4,时钟激励产生方法四

产生非占空比为50%的时钟

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
initial

begin

clk_i=0;

forever

begin

#((ClockPeriod/2)-2) clk_i=0;

#((ClockPeriod/2)+2) clk_i=1;

end

end

04,复位信号设计

4.1,复位信号产生方法一

异步复位

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制

begin

rst_n_i=1;

#100;

rst_n_i=0;

#100;

rst_n_i=1;

end

4.2,复位信号产生方法二

同步复位

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制

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

4.3复位信号产生方法三

复位任务封装

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制

input [31:0] reset_time; //复位时间可调,输入复位时间

RST_ING=0; //复位方式可调,低电平或高电平

begin

rst_n=RST_ING; //复位中

#reset_time; //复位时间

rst_n_i=~RST_ING; //撤销复位,复位结束

end

endtask

05,双向信号设计

5.1,双向信号描述一

inout在testbench中定义为wire型变量

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
//为双向端口设置中间变量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;

5.2双向信号描述二

强制force

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
//当双向端口作为输出口时,不需要对其进行初始化,而只需开通三态门

//当双向端口作为输入时,只需要对其初始化并关闭三态门,初始化赋值需

//使用wire型数据,通过force命令来对双向端口进行输入赋值

//assign dinout=(!en) din :16'hz; 完成双向赋值

initial

begin

force dinout=20;

#200

force dinout=dinout-1;

end

06,特殊信号设计

6.1特殊激励信号产生描述一

输入信号任务封装

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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);

6.2特殊激励信号产生描述二

多输入信号任务封装

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制

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);  //按声明顺序

6.3,特殊激励信号产生描述三

输入信号产生,一次SRAM写信号产生

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制

//wait语句都是使用电平触发

initial

begin

start=1'b1;

wait(en=1'b1);

#10;

start=1'b0;

end

07,仿真控制语句及系统任务描述

7.1,仿真控制语句及系统任务描述

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制

$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之间的随机数

7.2,仿真终端显示描述

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制

/*

$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 //实行实型模拟时间

7.3文本输入方式

readmemb/readmemh

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
//激励具有复杂的数据结构

//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;

08,总结

一个完整的设计,除了好的功能描述代码,对于程序的仿真验证是必不可少的。学会如何去验证自己所写的程序,即如何调试自己的程序是一件非常重要的事情。而RTL逻辑设计中,学会根据硬件逻辑来写测试程序,即Testbench是尤其重要的。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-01-19,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 OpenFPGA 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
R语言实现加权共表达网络分析
WGCNA(Weighted GeneCo-Expression Network Analysis,加权共表达网络分析)分析方法旨在寻找协同表达的基因模块(module),并探索基因网络与关注的表型之间的关联关系,以及网络中的核心基因。我们今天介绍下在R语言如何实现WGCNA,此包还有一个限制那就是样本总数必须大于15。
一粒沙
2019/08/08
7K2
R语言实现加权共表达网络分析
GEO_加权共表达网络WGCNA
WGCNA(Weighted Gene Co-Expression Network Analysis,即加权基因共表达网络分析)是一种用于分析基因表达数据的系统生物学方法。WGCNA的主要目的是识别基因表达数据中的共表达模块,并研究这些模块与外部样本特征(例如,疾病状态、临床特征等)之间的关系。
sheldor没耳朵
2024/07/25
3900
GEO_加权共表达网络WGCNA
WGCNA加权基因共表达网络多步法分析学习
之前笔者介绍过一步法的分析的流程: WGCNA加权基因共表达网络一步法分析学习 https://mp.weixin.qq.com/s/2Q37RcJ1pBy_WO1Es8upIg
凑齐六个字吧
2024/10/10
1370
WGCNA加权基因共表达网络多步法分析学习
RNA-seq入门实战(十一):WGCNA加权基因共表达网络分析——关联基因模块与表型
连续两次求贤令:曾经我给你带来了十万用户,但现在祝你倒闭,以及 生信技能树知识整理实习生招募,让我走大运结识了几位优秀小伙伴!大家开始根据我的ngs组学视频进行一系列公共数据集分析实战,其中几个小伙伴让我非常惊喜,不需要怎么沟通和指导,就默默的完成了一个实战!
生信技能树
2022/07/26
14K3
RNA-seq入门实战(十一):WGCNA加权基因共表达网络分析——关联基因模块与表型
WGCNA实战:识别免疫相关lncRNA
前面的推文给大家介绍了3种识别免疫相关lncRNA的方法:免疫相关lncRNA的识别
医学和生信笔记
2023/08/30
6640
WGCNA实战:识别免疫相关lncRNA
从原始芯片.cel数据到权重基因共表达网络(WGCNA)详细流程
看这个之前,可以先看WGCNA的一些理论背景知识 看完整个之后可以去看WGCNA关键模块和hub基因筛选
Y大宽
2018/10/11
3.4K1
从原始芯片.cel数据到权重基因共表达网络(WGCNA)详细流程
一文看懂WGCNA 分析(2019更新版)
不过,我这点战绩根本就算不上什么,其实这个WGCNA包已经是十多年前发表的了,仍然是广受好评及引用量一直在增加,破万也是指日可待。
生信技能树
2019/09/30
30.6K2
一文看懂WGCNA 分析(2019更新版)
lncRNA实战项目-第六步-WGCNA相关性分析
WGCNA将lncRNA分成18个模块(3635个lncRNA),空间模块中lncRNA表达呈现明显的组织区域特异性,如:CB (M1, 794个lncRNAs),DG/CA1 (M2, 443个lncRNAs), CA1 (M4, 369个lncRNAs),neocortex (M7, 123个lncRNAs)和OC (M10,57个lncRNAs)。时间模块中lncRNA表达与年龄有关,而与组织区域不明显;性别模块中lncRNA表达与性别和年龄都相关。每个模块就必须做pathway/go等数据库的注释分
生信技能树
2018/03/05
5.2K0
lncRNA实战项目-第六步-WGCNA相关性分析
RNAseq|WGCNA-组学数据黏合剂,代码实战-一(尽)文(力)解决文献中常见的可视化图
WGCNA (weighted gene co-expression network analysis)权重基因共表达网络分析(流程模块见下图),可将表达模式相似的基因进行聚类,并分析模块与特定性状或表型之间的关联,常用于筛选关键表型的hub基因 ,是RNAseq分析中的一块很重要的拼图。而之所以叫组学数据黏合剂是因为表型可以是患者的临床信息(生存信息,分期信息,基线信息等),可以是重测序信息肿瘤(驱动基因的变异与否,signature ,CNV信息等),可以是转录组结果(免疫浸润,risk score ,GSVA ,分子分型结果),可以是单细胞数据(celltype ,AUCell 打分)等等 。注:这些在公众号之前的文章中大多都有涉及,文末有部分链接。
生信补给站
2023/08/25
1.1K1
RNAseq|WGCNA-组学数据黏合剂,代码实战-一(尽)文(力)解决文献中常见的可视化图
加权基因共表达网络分析(WGCNA)实例
这里运行R语言包GDCRNATools的帮助文档中的例子获得胆管癌的rna表达矩阵
用户7010445
2020/03/23
2.5K0
加权基因共表达网络分析(WGCNA)实例
WGCNA实战练习
本文采用WGCNA官网的Tutirial 1的数据,对加权基因共表达网络分析和后续的数据挖掘的具体操作进行梳理, 数据可以从官网下载,示意图如下
生信修炼手册
2020/05/08
1.4K0
WGCNA实战练习
WGCNA仅仅是划分基因模块,其它都是附加分析
曾老师给我分享了一篇数据挖掘的文章,里面的WGCNA非常奇怪,我之前没见过这样的模块与表型的相关性热图
生信技能树
2023/09/04
1.3K0
WGCNA仅仅是划分基因模块,其它都是附加分析
WGCNA
加权基因共表达网络分析 (WGCNA, Weighted correlation network analysis)是用来描述不同样品之间基因关联模式的系统生物学方法,可以用来鉴定高度协同变化的基因集, 测试数据下载地址:https://horvath.genetics.ucla.edu/html/CoexpressionNetwork/Rpackages/WGCNA/Tutorials/FemaleLiver-Data.zip
生信编程日常
2020/04/01
1.5K0
WGCNA
生信小课堂(4) R中轻松进行WGCNA分析
R语言数据分析指南
2023/10/24
8290
生信小课堂(4) R中轻松进行WGCNA分析
WGCNA分析,简单全面的最新教程
本文应该是第二全的WGCNA分析教程,参考了最新的文档。第一全的还在路上,会出现于生信宝典和宏基因组公众号组织的二代三代转录组测序分析实战班上,欢迎点击链接了解更多。 WGCNA基本概念 加权基因共表达网络分析 (WGCNA, Weighted correlation network analysis)是用来描述不同样品之间基因关联模式的系统生物学方法,可以用来鉴定高度协同变化的基因集, 并根据基因集的内连性和基因集与表型之间的关联鉴定候补生物标记基因或治疗靶点。 相比于只关注差异表达的基因,WGCNA利用
生信宝典
2018/06/26
5.6K0
🤩 WGCNA | 值得你深入学习的生信分析方法!~(网状分析-第三步-模块与特征分析)
1写在前面 之前我们完成了WGCNA输入数据的清洗,网络构建和模块识别。😘 而且还介绍了如何对大型数据分级处理,有效地减少了内存的负担。😷 ---- 接着就是最重要的环节了,将不同module与表型或者临床特征相联系,进一步鉴定出有意义的module,并进行module内部的分析,筛选重要基因。🤒 不得不说,东西还是挺多的,而且非常重要,我们一起来试一下吧。🥰 2用到的包 rm(list = ls()) library(WGCNA) library(tidyverse) 3示例数据 load("Femal
生信漫卷
2023/02/24
5400
🤩 WGCNA | 值得你深入学习的生信分析方法!~(网状分析-第三步-模块与特征分析)
🤩 WGCNA | 值得你深入学习的生信分析方法!~(网状分析-第一步-数据整理)
1写在前面 最近实在是忙的不行,根本没时间更新,一到家就只想睡觉。🥹 今天写个最近用到的分析方法,Weighted correlation network analysis (WGCNA),是非常经典的生信分析方法了,现在被引有9913次了,马上就要破万啦。😘 网上相关的教程也是不胜枚举,但多多少少是有些不尽人意的地方,有的少步骤,有的代码不全。😅 这里在仔细阅读了官方手册后,在这里和大家一起认真地step by step研究一下,查缺补漏吧。🥰 2用到的包 rm(list = ls()) librar
生信漫卷
2023/02/24
7640
🤩 WGCNA | 值得你深入学习的生信分析方法!~(网状分析-第一步-数据整理)
WGCNA原理及实操
部分极其优秀的学徒会把自己项目过程慢慢补齐的生物信息学技能一点一滴记录并且分享,我们择优发布到公众号借花献佛给大家
生信技能树
2022/06/08
2.9K0
WGCNA原理及实操
跟着Nature Plants学数据分析:R语言WGCNA分析完整示例
https://www.nature.com/articles/s41477-021-00897-y#data-availability
用户7010445
2023/01/06
9670
跟着Nature Plants学数据分析:R语言WGCNA分析完整示例
这个WGCNA作业终于有学徒完成了!
共画了3张热图,最后一张热图展示如下图,与原文对比'Ligamentocyte'和'Chondrocyte'相比较其他组是高表达的。
生信技能树
2019/11/10
2.3K0
推荐阅读
相关推荐
R语言实现加权共表达网络分析
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验