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基本入门相关推荐

  1. 【数字IC验证快速入门】11、Verilog TestBench(VTB)入门

    导读:作者有幸在中国电子信息领域的排头兵院校"电子科技大学"攻读研究生期间,接触到前沿的数字IC验证知识,旁听到诸如华为海思.清华紫光.联发科技等业界顶尖集成电路相关企业面授课程, ...

  2. ModelSim入门及Testbench编写——合理利用仿真才是王道

    在入职之前曾自学了一段时间的Verilog,后来因为工作的缘故鲜有接触,就搁置下来了.后来因偶然的机会需要参与一个CPLD的小项目,又开始从零学起,有些讽刺的是,不知道如何入手工具的我又回到EDN上翻 ...

  3. HDLBits 系列(40)如何写 TestBench 文件?

    目录 序言 变量定义 时钟设计 设计输入 模块例化 实战演练 序言 由于入门的测试文件很简单,所以一直以来也都是直接给出测试文件,直到今天才想着去总结一个测试文件的写法.这篇博客将根据HDLBits的 ...

  4. ModelSim之命令行仿真入门 (step 2)

    简单得modelsim命令行仿真 PART ONE ModelSim之命令行仿真入门 用do文件进行仿真真得很方便,比写testbench方便多了,采用do文件没有那么多信号定义,管理也比较方便. 1 ...

  5. 如何零基础入门FPGA?这篇文章让你吃透!

    01  FPGA学习重点 1. 看代码,建模型 只有在脑海中建立了一个个逻辑模型,理解FPGA内部逻辑结构实现的基础,才能明白为什么写Verilog和写C整体思路是不一样的,才能理解顺序执行语言和并行 ...

  6. FPGA入门学习记录(1)----自动售货机(VM_FSM)

    综述 在写一个自动售货机状态机并仿真,上板的过程中遇到了各种问题.在解决这些零碎的问题后,在防止自己忘记这些经验以及用电子介质取代纸质记录的目的下,写下此文. 这些零碎的经验主要分VeilogHDl语 ...

  7. 【数字IC验证快速入门】45、UVM项目实践之APB_SPI(13)UVM 验证方法学总结

    导读:作者有幸在中国电子信息领域的排头兵院校"电子科技大学"攻读研究生期间,接触到前沿的数字IC验证知识,旁听到诸如华为海思.清华紫光.联发科技等业界顶尖集成电路相关企业面授课程, ...

  8. FPGA入门经历的阶段

    1 入门首先要掌握HDL(HDL=verilog+VHDL) 第一句话是:还没学数电的先学数电.然后你可以选择verilog或者VHDL,有C语言基础的,建议选择VHDL.因为verilog太像C了, ...

  9. 四类九种移位寄存器总结(循环(左、右、双向)移位寄存器、逻辑和算术移位寄存器、串并转换移位寄存器、线性反馈移位寄存器LFSR|verilog代码|Testbench|仿真结果)

    移位寄存器总结 一.前言 二.简单循环左移/右移/双向移位寄存器 2.1 简单循环左移/右移/双向移位寄存器 2.2 verilog代码 2.3 Testbench 2.4 仿真结果 三.逻辑移位与算 ...

  10. FPGA入门到实战-学习笔记

    ref:腾讯教育 FPGA入门到实战-录播课-上海V3学院 https://ke.qq.com/course/66019 老师:尤恺元 第1课 掌握Verilog HDL的高级编码知识 授课日期: 老 ...

最新文章

  1. 深度学习中的注意力机制(三)
  2. ​MEMS在未来面临的挑战
  3. golang 中string和int类型相互转换
  4. python处理流程-Python文件处理流程
  5. 为了帮视障人士“看见”,阿里工程师做了哪些努力?
  6. linux 源码包安装mysql_LINUX下源码包安装mysql
  7. 工业以太网交换机的接口知识详解
  8. VMware vSAN 6.7实战(六)配置vSAN存储策略
  9. java9 变化_Java 9 ← 2017,2019 → Java 13,来看看Java两年来的变化
  10. [转载]java中try 与catch的使用
  11. 【原创】大数据基础之Spark(1)Spark Submit即Spark任务提交过程
  12. 从“卡脖子”到人有我优,数字孪生盾构机施工流程可视化
  13. 第 25 章 基于小波变换的数字水印技术
  14. 用R语言理解圆周率、自然对数和欧拉常数
  15. Spring AOP基础组件 Advised
  16. K2P刷机教程转自恩山磨人的小妖精
  17. 四年程序员的常用工具清单
  18. 苹果iCloud服务疑遭中国黑客攻击
  19. 牛客 BL1 扭蛋机
  20. 使用IPMI安装操作系统--超微服务器为例,以及ipmivier安装与使用

热门文章

  1. swf文件的反编译入门
  2. android 第三方圆弧进度条,Android 圆弧进度条 水平进度条 水波进度条
  3. MySQL管理工具安装说明
  4. Java如何给ServerSocket绑定指定IP地址
  5. Java JSch 远程执行 Shell 命令
  6. numpy复习总结,为深度学习打下基础
  7. linux模拟gps,Android之GPS研究(实战篇二)
  8. STM32F103系列选型
  9. mnist数据集下载地址
  10. python解释器需要另外安装吗_Python解释器安装