仿真验证与TESTBENCH编写

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
第五章 仿真验证与 Testbench编写
2/26/2019
Microelectronics SchoolLeabharlann BaiduXidian University
1
5.1 Verilog HDL电路仿真和验证概述
仿真,也叫模拟,是通过使用EDA仿真工具,通过输入测试信号,比对 输出信号(波形、文本或者VCD文件)和期望值,来确认是否得到与期望所 一致的正确的设计结果,验证设计的正确性。 验证是一个证明设计思路如何实现,保证设计在功能上正确的一个过程。
在编写Testbench时需要注意的问题 :
(1)testbench代码不需要可综合 Testbench代码只是硬件行为描述不是硬件设计 。 (2)行为级描述效率高 Verilog HDL语言具备5个描述层次,分别为开关级、门级、RTL级、算法级 和系统级。 (3)掌握结构化、程式化的描述方式 结构化的描述有利于设计维护,可通过initial、always以及assign语句将不同 的测试激励划分开来。 一般不要将所有的测试都放在一个语句块中。
T触发器的仿真波形和部分文本输出结果 :
部分文本输出结果: 0T= x, clk= 0, rst_n= x, data_out= x 3T= x, clk= 0, rst_n= 0, data_out= 0 5T= x, clk= 1, rst_n= 0, data_out= 0 8T= 1, clk= 1, rst_n= 1, data_out= 1 10T= 1, clk= 0, rst_n= 1, data_out= 1
全加器的输入a、b和ci定义为reg型变量;把输出so和co定义为wire型变量 用模块例化语句“adder1 U1(a,b,ci,so,co);”把全加器设计电路例化到测试仿 真环境中; 用initial块语句改变输入的变化并生成测试条件,输入的变化语句完全根据全 加器的真值表编写 仿真结果 :
• 5.2.1 Testbench及其结构
在仿真的时候 Testbench 用来产生测试激励给待验证设计( Design Under Verification,DUV),或者称为待测设计(Design Under Test,DUT)。
测试平台 (Testbench)
控制 反馈
激励输入
被验证设计 (DUV)
在终端上显示仿 真的值,或者存 成文件
激励 (Stimulus)
实例化DUT (Design Under Test)
使用仿真工具比 较仿真结果
自动比较测试结 果的正确性
从图中可以清晰地看出Testbench的 主要功能: (1)为DUT提供激励信号。 (2)正确实例化DUT。 (3)将仿真数据显示在终端或者存 为文件,也可以显示在波形窗口中以 供分析检查。 (4)复杂设计可以使用EDA工具, 或者通过用户接口自动比较仿真结果 与理想值,实现结果的自动检查。
响应输出
Testbench平台结构
module仿真模块名://无端口列表 各种输入、输出变量定义 数据类型说明 //其中激励信号定义为reg型 //显示信号定义为wire型 integer parameter
测试程序的一般结构 由于Testbench是一个测 试平台,信号集成在模 块内部,没有输入输出。
验证在Verilog HDL设计的整个流程中分为4个阶段: 阶段1: 功能验证; 阶段2: 综合后验证; 阶段3: 时序验证; 阶段4: 板级验证。
2/26/2019
Microelectronics School Xidian University
2
5.2 Verilog HDL测试程序设计基础
• 5.2.2测试平台举例
输入激励信号 reg类型
激励向量 测试模块 输出显示 待测试模块
测试平台需要产生时钟信号、 复位信号和一系列的仿真向量, 观察DUT的响应,确认仿真结 果。
输出显示信号 wire类型
DUT的仿真平台
(1)组合逻辑电路仿真环境的搭建
module adder1(a,b,ci,so,co); input a,b,ci; output so,co; assign{co,so}=a+b+ci; endmodule 根据全加器的真值表(表5.2-1)编写的全加 器测试程序如下: module adder1_tb; wire so,co; reg a,b,ci; adder1 U1(a,b,ci,so,co); //模块例化 initial // 测试信号产生 begin a=0;b=0;ci=0; #20 a=0;b=0;ci=1; #20 a=0;b=1;ci=0; #20 a=0;b=1;ci=1; #20 a=1;b=0;ci=0; #20 a=1;b=0;ci=1; #20 a=1;b=1;ci=0; #20 a=1;b=1;ci=1; #200 $finish; end endmodule
例5.2-1 T触发器测试程序示例 module Tflipflop_tb; //数据类型声明 reg clk, rst_n,T; wire data_out; TFF U1 (.data_out(data_out),.T(T),.clk(clk),.rst_n(rst_n)); / /对被测模块实例化 always //产生测试激励 #5 clk=~clk; Initial begin clk=0; #3 rst_n=0; #5 rst_n=1; T=1; #30 T=0; #20 T=1; end Initial //对输出响应进行收集 begin $monitor($time, "T= %b, clk= %b, rst_n= %b, data_out= %b", T, clk, rst_n, data_out); end endmodule
待测试模块调用
激励向量定义 (always、initial过程块; function,tast结构等; If-else,for,case,while,repeat,disable等控制 语句) 显示格式定义 ($monitor,$time,$display等) endmodule
在Testbench模块内, 例化待测设计的顶层模 块,并把测试行为的代 码封装在内,直接对待 测系统提供测试激励。
相关文档
最新文档