Testbench基本入门
1 编写testbench目的
编写testbench的主要目的是为了对使用硬件描述语言(HDL)设计的电路进行仿真验证,测试设计电路的功能、部分性能是否与预期的目标相符。
编写testbench进行测试的过程如下:
1) 产生模拟激励(波形);
2) 将产生的激励加入到被测试模块并观察其输出响应;
3) 将输出响应与期望进行比较,从而判断设计的正确性。
2 基本的testbench结构
module test_bench;
// 通常testbench没有输入与输出端口
信号或变量定义声明
使用initial或always语句来产生激励波形
例化设计模块
监控和比较输出响应
endmodule
简单的testbench的结构通常需要建立一个顶层文件,顶层文件没有输入和输出端口。在顶层文件里,把被测模块和激励产生模块实例化进来,并且把被测模块的端口与激励模块的端口进行对应连接,使得激励可以输入到被测模块。端口连接的方式有名称和位置关联两种方式,我们常常使用“名称关联”方式。
3 产生激励的一些描写方式
3.1 产生时钟的几种方式
1)使用initial方式产生占空比50﹪的时钟
initialbeginCLK = 0;#delay;forever#(period/2) CLK = ~CLK;end
注意:一定要给时钟赋初始值,因为信号的缺省值为z,如果不赋初值,则反相后还是z,时钟就一直处于高阻z状态。
产生的时钟信号如下图所示:
2)使用always方式
initial CLK = 0;always #(period/2) CLK = ~CLK;
3)使用repeat产生确定数目的时钟脉冲
initial
beginCLK = 0;repeat(6) #(period/2) CLK = ~CLK;
end
4)产生占空比非50﹪的时钟
initialCLK = 0;
always
begin#3 CLK = ~CLK;#2 CLK = ~CLK;
end
3.2 产生复位信号的几种形式
1)异步复位
initial
beginRst = 1;#100;Rst = 0;#500;Rst = 1;
end
2)同步复位1
initial
beginRst = 1;@(negedge CLK); // 等待时钟下降沿Rst = 0;#30;@(negedge CLK); // 等待时钟下降沿Rst = 1;
end
2)同步复位2
initial
beginRst = 1;@(negedge CLK); // 等待时钟下降沿repeat (3) @(negedge CLK); // 经过3个时钟下降沿Rst = 1;
end
4 testbench实例
4.1 2-4解码器实例
module dec2x4(A, B, Enable, Z);
input A, B, Enable;
output[3:0] Z;
reg [3:0] Z_o;
assign Z = Z_o;
always@(A or B or Enable)
beginif(Enable == 1'b0)Z_o = 4'b1111;elsecase({A, B})2'b00: Z_o = 4'b1110;2'b01: Z_o = 4'b1101;2'b10: Z_o = 4'b1011;2'b11: Z_o = 4'b0111;default: Z_o = 4'b1111;endcase
end
endmodule
测试模块:
`timescale 1ns/100ps
module testbench;
reg a, b, en;
wire [3:0] z;
//例化被测试模块
dec2x4 DUT(.A(a),.B(b),.Enable(en),.Z(z));
//产生输入激励
initial
beginen = 0;a = 0;b = 0;#10 en = 1;#10 b = 1;#10 a = 1;#10 b = 0;#10 a = 0;#10 $stop;
end
//显示输出结果
always@(en or a or b or z)
begin$display("At time %t, input is %b%b%b, output is %b", $time, a, b, en, z);
end
endmodule
4.2 时序检测器
下面是一个时序检测器的验证实例。被测模型用于检测数据线上连续三个1的序列。在时钟的每个上升沿检查数据。
module Count3_1s(Data, Clock, Detect3_1s);input Data, Clock;output Detect3_1s;integer Count;reg Detect3_1s;
initial
beginCount = 0;Detect3_1s = 0;
end
always@(posedge Clock)
beginif(Data == 1)Count = Count + 1;elseCount = 0;if(Count>=3)Detect3_1s = 1;elseDetect3_1s = 0;
end
endmodule
测试模块:
`timescale 1ns/100ps
module testbench;
reg Data, Clock;
wire Detect;
integer Out_file;
// 待测试模块的应用实例
Count3_1s DUT(Data,Clock,Detect); // 位置关联方式
initial
beginClock = 0;forever#5 Clock = ~Clock;
end
initial
beginData = 0;#5 Data = 1;#40 Data = 0;#10 Data = 1;#40 Data = 0;#20 $stop; // 仿真结束
end
// 创建一个记录文件:
initial
Out_file = $fopen("results.txt");
// 在文件中保存监控信息
always@(posedge Clock)
beginif(Detect == 1'b1)$fwrite(Out_file,"At time %t, Detect out is 1\n", $time);
end
endmodule
Testbench基本入门相关推荐
- 【数字IC验证快速入门】11、Verilog TestBench(VTB)入门
导读:作者有幸在中国电子信息领域的排头兵院校"电子科技大学"攻读研究生期间,接触到前沿的数字IC验证知识,旁听到诸如华为海思.清华紫光.联发科技等业界顶尖集成电路相关企业面授课程, ...
- ModelSim入门及Testbench编写——合理利用仿真才是王道
在入职之前曾自学了一段时间的Verilog,后来因为工作的缘故鲜有接触,就搁置下来了.后来因偶然的机会需要参与一个CPLD的小项目,又开始从零学起,有些讽刺的是,不知道如何入手工具的我又回到EDN上翻 ...
- HDLBits 系列(40)如何写 TestBench 文件?
目录 序言 变量定义 时钟设计 设计输入 模块例化 实战演练 序言 由于入门的测试文件很简单,所以一直以来也都是直接给出测试文件,直到今天才想着去总结一个测试文件的写法.这篇博客将根据HDLBits的 ...
- ModelSim之命令行仿真入门 (step 2)
简单得modelsim命令行仿真 PART ONE ModelSim之命令行仿真入门 用do文件进行仿真真得很方便,比写testbench方便多了,采用do文件没有那么多信号定义,管理也比较方便. 1 ...
- 如何零基础入门FPGA?这篇文章让你吃透!
01 FPGA学习重点 1. 看代码,建模型 只有在脑海中建立了一个个逻辑模型,理解FPGA内部逻辑结构实现的基础,才能明白为什么写Verilog和写C整体思路是不一样的,才能理解顺序执行语言和并行 ...
- FPGA入门学习记录(1)----自动售货机(VM_FSM)
综述 在写一个自动售货机状态机并仿真,上板的过程中遇到了各种问题.在解决这些零碎的问题后,在防止自己忘记这些经验以及用电子介质取代纸质记录的目的下,写下此文. 这些零碎的经验主要分VeilogHDl语 ...
- 【数字IC验证快速入门】45、UVM项目实践之APB_SPI(13)UVM 验证方法学总结
导读:作者有幸在中国电子信息领域的排头兵院校"电子科技大学"攻读研究生期间,接触到前沿的数字IC验证知识,旁听到诸如华为海思.清华紫光.联发科技等业界顶尖集成电路相关企业面授课程, ...
- FPGA入门经历的阶段
1 入门首先要掌握HDL(HDL=verilog+VHDL) 第一句话是:还没学数电的先学数电.然后你可以选择verilog或者VHDL,有C语言基础的,建议选择VHDL.因为verilog太像C了, ...
- 四类九种移位寄存器总结(循环(左、右、双向)移位寄存器、逻辑和算术移位寄存器、串并转换移位寄存器、线性反馈移位寄存器LFSR|verilog代码|Testbench|仿真结果)
移位寄存器总结 一.前言 二.简单循环左移/右移/双向移位寄存器 2.1 简单循环左移/右移/双向移位寄存器 2.2 verilog代码 2.3 Testbench 2.4 仿真结果 三.逻辑移位与算 ...
- FPGA入门到实战-学习笔记
ref:腾讯教育 FPGA入门到实战-录播课-上海V3学院 https://ke.qq.com/course/66019 老师:尤恺元 第1课 掌握Verilog HDL的高级编码知识 授课日期: 老 ...
最新文章
- 深度学习中的注意力机制(三)
- ​MEMS在未来面临的挑战
- golang 中string和int类型相互转换
- python处理流程-Python文件处理流程
- 为了帮视障人士“看见”,阿里工程师做了哪些努力?
- linux 源码包安装mysql_LINUX下源码包安装mysql
- 工业以太网交换机的接口知识详解
- VMware vSAN 6.7实战(六)配置vSAN存储策略
- java9 变化_Java 9 ← 2017,2019 → Java 13,来看看Java两年来的变化
- [转载]java中try 与catch的使用
- 【原创】大数据基础之Spark(1)Spark Submit即Spark任务提交过程
- 从“卡脖子”到人有我优,数字孪生盾构机施工流程可视化
- 第 25 章 基于小波变换的数字水印技术
- 用R语言理解圆周率、自然对数和欧拉常数
- Spring AOP基础组件 Advised
- K2P刷机教程转自恩山磨人的小妖精
- 四年程序员的常用工具清单
- 苹果iCloud服务疑遭中国黑客攻击
- 牛客 BL1 扭蛋机
- 使用IPMI安装操作系统--超微服务器为例,以及ipmivier安装与使用