TestBench的书写 TestBench的目标 TestBench的基本框架 书写TestBench的几种主要方法 HDL调试的主要方式

Slides:



Advertisements
Similar presentations
声明 本课件供《虚拟仪器技术》、《自动测试技术》等相关课程教师授课使用与参考. 教师可根据课程需要和实际情况在此课件基础上增删内容
Advertisements

第2章 SOPC硬件开发环境及流程.
自衛消防編組任務職責 講 義 This template can be used as a starter file for presenting training materials in a group setting. Sections Right-click on a slide to add.
第4章 VHDL设计初步.
Chapter 5 Sequential Logic Circuit
基于解释性语言的手机跨平台架构 Sloan Yi. Qt MTK.
-Artificial Neural Network- Hopfield Neural Network(HNN) 朝陽科技大學 資訊管理系 李麗華 教授.
天文望远镜集成建模研究 杨德华 南京天文光学技术研究所 30 NOV, 年中国虚拟天文台年会 广西师范大学 桂林
程序的形式验证 - 简介 中国科学院软件研究所 张文辉 1.
Greatest Common Divisor ---最大公约数
指導教授:許子衡 教授 報告學生:翁偉傑 Qiangyuan Yu , Geert Heijenk
第10章 Verilog操作符 学习内容: 熟悉Verilog语言的操作符.
第六章 应用程序结构.
Chapter 1 用VC++撰寫程式 Text book: Ivor Horton.
Chapter 5 Verilog 硬體描述語言
Chapter 5 Verilog硬體描述語言
簡易 Visual Studio 2010 C++ 使用手冊
Ch01-2 Verilog語法 資料流(DataFlow)設計 行為(Behavior)設計
第17章 Verilog中的高级结构 学习内容: 任务和函数的定义和调用 怎样使用命名块 怎样禁止命名块和任务 有限状态机(FSM)及建模.
EDA技术 廖义奎.
Creating Animated Apps (I) 靜宜大學資管系 楊子青
版权所有,禁止未经授权的商业使用行为 何宾 Tel: 北京中教仪装备技术有限公司.
EDA原理及应用 何宾
第四阶段实验 ISP器件的设计与应用 一、实验目的 二、实验内容与要求 三、ISP器件的开发流程 四、EDA Pro2K实验系统介绍
HLA - Time Management 陳昱豪.
欢迎参加VHDL培训 VHDL培训教程 浙江大学电子信息技术研究所 电子设计自动化(EDA)培训中心
C 語言簡介 - 2.
XBRL未來發展趨勢 2009年12月 For information on applying this template onto existing presentations, refer to the notes on slide 3 of this presentation. The Input.
SOA – Experiment 3: Web Services Composition Challenge
Verilog硬件描述语言基础.
EDA 原理及应用 何宾
第三章 基本觀念 電腦繪圖與動畫 (Computer Graphics & Animation) Object Data Image
Programmable Logic Architecture Verilog HDL FPGA Design
JTAG INTERFACE SRAM TESTER WITH C-LCM
软件工程 Software Engineering
语法进阶.
时序电路设计 刘鹏 浙江大学信息与电子工程系 Apr. 24, 2011 EE141
数字集成电路设计入门 --从HDL到版图 于敦山 北大微电子学系.
簡易 Visual Studio 2005 C++ 使用手冊
精简指令集(RISC)CPU的构造原理和设计方法
中国科学技术大学计算机系 陈香兰(0551- ) Spring 2009
第三章 基本觀念 電腦繪圖與動畫 (Computer Graphics & Animation) Object Data Image
Version Control System Based DSNs
第一次上机安排 第六周 第七周 周一晚(提高1、2,通信001~012) 周二上(通信014~085) 周四上(通信086~154)
软件工程 第四章 软件设计 软件过程设计技术与工具.
第14章 对验证的支持 学习内容 理解Verilog文本输出 理解不同的读取仿真时间的系统函数 理解 Verilog文件I/O功能.
虚 拟 仪 器 virtual instrument
中央社新聞— <LTTC:台灣學生英語聽說提升 讀寫相對下降>
计算机EDA设计 教 程 北航计算机学院 艾明晶.
姚金宇 MIT SCHEME 使用说明 姚金宇
设计示例一 用门级结构描述D触发器:.
數位邏輯設計 VHDL.
成绩是怎么算出来的? 16级第一学期半期考试成绩 班级 姓名 语文 数学 英语 政治 历史 地理 物理 化学 生物 总分 1 张三1 115
信号量(Semaphore).
Compute System Administration Homework 2: Shell Script
iSIGHT 基本培训 使用 Excel的栅栏问题
计算机问题求解 – 论题1-5 - 数据与数据结构 2018年10月16日.
Unit 1 How do you study for a test?
魏新宇 MATLAB/Simulink 与控制系统仿真 魏新宇
 隐式欧拉法 /* implicit Euler method */
醫工所碩士二年級 R 葉昱甫 電子所碩士一年級 R 謝博鈞 電信所碩士一年級 R 王欣平
怎樣把同一評估 給與在不同班級的學生 How to administer the Same assessment to students from Different classes and groups.
Arguments to the main Function and Final Project
FPGA组合逻辑 王安然.
Verilog HDL 基本语法 STEP 2016/12/3.
按键处理部分 王安然.
Programmable Logic System Design
第四章 UNIX文件系统.
Programmable Logic System Design
Section 1 Basic concepts of web page
Presentation transcript:

TestBench的书写 TestBench的目标 TestBench的基本框架 书写TestBench的几种主要方法 HDL调试的主要方式 提高模拟验证效率的主要方法 综合前后模拟验证结果一致性的确定

TestBench的目标 测试、验证HDL代码的正确性; 测试、验证Design的功能、时序正确性; 待测试、验证的模块加载到模拟验证环境; 产生模拟验证所需的输入激励; 对输入激励码,构造出其对应的正确输出结果; 提供一种机制,自动判断Design的正确性

DUT (Design Under Test ) 输入激励产生 待模拟、验证的 Design 输出结果 比较 预期输出结果构造 模拟结果 正确性判断

The Simulation Environment This is a simplified picture of the overall simulation environment. This section concentrates on testbench development strategies. design source model libraries testbench source simulator compile file input: stimulus,response simulate file output: test pats,reports

HDL代码调试 HDL代码 TestBench 逻辑模拟 修改HDL代码 综合

输入激励码的产生方式 由其它硬件/软模型产生待验证模块所需的输入激励码; 用HDL代码生成(On-the-fly); 事先产生所需的输入激励码并存于相应的文件中,使用时从文件中读取

软、硬件合作模拟 主要用于系统模拟验证 待模拟、验证的 设计模块 硬件 软模型 模拟、验证 结果评测 利用硬件的软模型 进行模拟验证

由其它硬件/软模型产生 待验证模块所需的输入激励码 优点: 能较全面模拟、验证Design在各种情形下的正确性; 自动产生待验证模块的输入激励码 易于管理、验证速度快 缺点: 必须有相应模块的硬件/软件模型支持; 必须有专门的验证环境支持; 代价昂贵 使用领域: 模型(Protocol)验证、系统模拟、设计投片前的确认。

用HDL代码生成DUT的输入激励码 注意事项: 将时钟信号、置/复位信号与其它信号分开并分别加以处理; 注意各种(各组)输入信号的时序关系; 注意所采用的延时表示方式(绝对延时/相对延时); 注意各种输入激励与时钟信号的关系

用HDL代码生成DUT的输入激励码 输入激励码产生方式: 用单独的always语句或assign赋值语句产生时钟信号; 用简单的initial语句块产生置/复位信号的激励; 在initial语句块中用循环语句块产生按一定规律变化的信号的激励码; 用Task过程产生特殊信号的输入激励; 用三态buffer产生或监控Bidirectional信号的激励; 必要时预估DUT的输出变化情形并加以比较

用HDL代码生成DUT的输入激励码 parameter Period = 10 ; assign #(Period/2) clk = ~clk; 在输入激励产生过程中,可用fork/join 形式表示绝对时间 parameter Period = 10 ; always #(Period/2) clk = ~clk ; parameter Period = 10 ; always begin #(0.4*Period) clk = ~clk; #(0.6*Period) clk = ~clk; end parameter Period = 10 ; always fork #(0.4*Period) clk = ~clk; #Period clk = ~clk; join 时钟信号必须用initial语句赋初值

用HDL代码生成DUT的输入激励码 用initial语句块中的顺序过程语句描述一般信号 的输入变化情形 可采用绝对延时或相对延时表示方式; 优点: 直接、简洁,易于理解; 只需要列出输入信号的变化情形; 可用于各种输入信号(不包括时钟信号)激励的描述; 应用面广,适合于DUT的初始功能验证。 缺点: 难以管理; 难于过程化处理。

用HDL代码生成DUT的输入激励码 在initial语句块中用循环结构描述具有一定变化规则的输入激励信号 reg [7:0] A, B; integer I; …… initial begin for (I=0;I<1024; I=I+1) A = $random %256; B = $random % 256; #Period; end 描述简单、明了、代码紧凑、易于管理 在initial语句块中存在

用HDL代码生成DUT的输入激励码 DUT 实例语句; 用一个或多个initial语句块产生DUT的 模拟激励向量; module TestBench_Name ; 参数说明; 寄存器、线网类型变量的定义、说明; DUT 实例语句; 时钟信号定义、赋初值; 定义置/复位信号的变化情形; 用一个或多个initial语句块产生DUT的 模拟激励向量; 用Task、function定义DUT外部时序接口; endmodule 产生激励码的方式灵活、 容易产生中、小模块的激励码 不易管理

将模块不同功能的调测试输入激励码置于不同的HDL代码段,存于不同的文件中,使用时再用`include “文件名”形式调入 用HDL代码生成DUT的输入激励码 module TestBench_Name ; 参数说明; 寄存器、线网类型变量的定义、说明; DUT 实例语句; 时钟信号定义、赋初值; 定义置/复位信号的变化情形; `include “产生输入激励码的HDL代码段” ; endmodule 将模块不同功能的调测试输入激励码置于不同的HDL代码段,存于不同的文件中,使用时再用`include “文件名”形式调入

Using Verilog Tasks Use Verilog tasks in your testbench to encapsulate repeated operations. clk data_valid data_read data_read task cpu_read; begin #30 data_valid = 1; wait (data_read = = 1); #20 cpu_data = data_in; wait (data_read = = 0); #20 cpu_data = 8`hzz; #30 data_valid = 0; end endtask

Using Concurrent Statements Use fork-join blocks in your testbench to concurrently activate parallel tasks. monitor initialize fork join execute module inline_tb; //declare variables //instantiate designs initial begin initialize_design; fork monitor_data; monitor_error; monitor_timeout; run_test; join end endmodule

Applying Stimulus Some common stimulus application techniques include: In-line stimulus,applied from an initial block Stimulus applied from a loop or always block Stimulus applied from an array of vectors or integers Stimulus that is recorded during one simulation and played back in another simulation

In-Line Stimulus In-line stimulus has the following characteristics: You list the variables only when their values change You can easily define complex timing relationships between signals The testbench can become very long for tests of real designs module inline_tb; wire [7:0] results; reg [7:0] data_bus,addr; DUT u1 (results,data_bus,addr); initial fork #10 addr = 8`h01; #10 data_bus = 8`h23; #20 data_bus = 8`h45; #30 addr = 8`h67; #30 data_bus = 8`h89; #40 data_bus = 8`hAB; #45 $finish; join endmodule

Stimulus From Loops Stimulus applied from a loop has the following characteristics: For each iteration you assign a new stimulus vector The timing relationships between signals are regular in nature The testbench is compact module loop_tb; wrie [7:0] response; reg [7:0] stimulus; reg clk; integer i; DUT u1 (response,stimulus); inititial clk = 0; always begin #10 clk = 1; #10 clk = 0; end initial begin for (i = 0;i <= 255;i=i + 1) @(negedge clk) stimulus = i; #20 $finish; endmodule

预设输入激励码向量方式 方法: 将所需的输入激励码用一定形式的向量表示; 输入激励码向量预存于文件中; 使用时从文件中按一定的时序节拍读入文件中的输入激励码向量

module multiplier8(A, B, Clk, Start, Mul, Done); input [7:0] A, B; input Start; input Clk; output [15:0] Mul; output Done; reg [15:0] Mul; reg Done; Functional Description Stms; …… endmodule 1、从给定的输入激励码文件中读入输入A、B、Start的激励码及相应的预期输出结果Mul、Done; 2、TestBench预设一类向量以便读取输入激励码文件中的数据 3、输入激励码、预期的输出结果预存于文件中

Verilog HDL提供的支持 Verilog HDL提供了几个系统任务支持从文件中直接读取输入激励码向量 $readmemb(“File_Name”, Test_Vector); 从文件中读取二进制输入激励码向量 $readmemh(“File_Name”, Test_Vector);

二进制表示的输入激励码及其输出预期结果表示 输入激励码文件Test_Fixed.v //Start A[7:0] B[7:0] Done Mul[15:0] 00000000001001110 00000000000000000 10000000001001110 10000000000000000 10000001000000010 10000000000000100 …….. 二进制表示的输入激励码及其输出预期结果表示 TestBench作相应的定义: Reg [7:0] A, B; Reg Start; …… Reg [33:0] Vector, Test_Vector[0:Test_Length]; ……. $readmemb(“Test_Fixed.v”, Test_Vector); For (I=0; I<Test_Length; I = I+1) 按一定时序将Test_Vector[I]送入Vector并送入A、B、Start;

十六进制表示的输入激励码及其输出预期结果表示 输入激励码文件Test_Fixed.v 十六进制表示的输入激励码及其输出预期结果表示 //Start A[7:0] B[7:0] Done Mul[15:0] 0004E0000 409D00000 204050004 …….. TestBench作相应的定义: Reg [7:0] A, B; Reg Start; …… Reg [33:0] Vector, Test_Vector[0:Test_Length]; ……. $readmemh(“Test_Fixed.v”, Test_Vector); For (I=0; I<Test_Length; I = I+1) 按一定时序将Test_Vector[I]送入Vector并送入A、B、Start;

Stimulus From Arrays Stimulus applied from an array has the following characteristics: You can load the stimulus from a data file directly into the array For each iteration you read a new stimulus vector from the array module array_tb; wire [7:0] response; reg [7:0] stimulus,stim_array[0:15]; integer i; DUT u1 (response,stimulus); initial begin $readmemb(“datafile”,stim_array); for (i = 0;i <= 15;i = i + 1); #20 stimulus = stim_array[i]; #20 $finish; end endmodule

Vector Capture and Playback You can capture manufacturing test vectors at the boundary of a device model. parameter period = 20 wire [7:0] response; reg [7:0] stimulus; DUT u1 (response,stimulus); always apply (stimulus); always verify (response); task capture_tb; integer MCDR,MCDS; begin MCDR = $fopen(“response.dat”);if (!MCDR) $finish; MCDS = $fopen(“stimulus.dat”);if (!MCDS) $finish; forever @(posedge clk) #(period - 1) begin $fdisplayb (MCDR, “ %b”,response); $fdisplayb (MCDS, “ %b”,stimulus); end endtask

Vector Capture and Playback You can play back the saved stimulus and response vectors. parameter MAX_VECTOR = 255; wire [7:0] response; reg [7:0] stimulus,stim_array[0:255],resp_arry[0:255]; DUT u1 (response,stimulus); task playback_tb; integer MCDR,MCDS,i; begin $readmemb(“response.dat”,resp_array); $readmemb(“stimulus.dat”,stim_array); @(negedge clk) //synchronize to inactive clock stimulus = stim_array[0]; //apply 1st stimulus for (i = 0;i <=MAX_VECTOR;i = i + 1) @(negedge clk) begin if (response != = resp_array[i]) begin //check response $display(“ERROR:response is %b,should be %b”, response,resp_array[i], “\nTEST FALLED”); $finish; end if (i = = MAX_VECTOR) begin $display(“TEST PASSED”);$finish; end stimulus = stim_array[i + 1]; //apply next stimulus end endtask

Forcing Stimulus You can make two types of procedural continuous assignments: You can assign and deassign a register assign <lvalue> = <expression> This overrides any procedural assignment to the register initial begin #10 assign top.dut.fsm1.state_reg = `init_state; #20 deassign top.dut.fsm1.state_reg; end You can force and release a register or net This overrides all drivers of the signal #10 force top.dut.counter.scan_reg.q = 0; #20 release top.dut.counter.scan_reg.q;

HDL代码调试 HDL代码 TestBench 逻辑模拟 修改HDL代码 综合

HDL代码调试 HDL代码调试手段 逻辑模拟过程中,查看模拟波形,判断HDL描述的正确性; 逻辑模拟验证过程中加入相关的监控措施; Verilog HDL语言中提供了下列系统任务可供使用: $display $fdisplay $monitor $time $write $strobe $fopen $fclose $dump $finish $stop 利用虚拟原型、估计综合及后设计的结果;

HDL代码调试 逻辑模拟验证 在TestBench中加入$strobe系统任务,记录、探测所关心的信号波形; 在逻辑模拟验证前,利用模拟器提供的功能,选择需要观察的信号并加以记录; 在TestBench中增加模拟结果与预期的正确结果的比较,检测不正确的HDL代码

Reporting Warnings and Errors Use file output system tasks to report errors and warnings. A more sophisticated testbench would: Report an error to a centralized error handler Modify the test flow,depending upon the errors encountered Maintain error statistics,and report them at the end of the test task par_err_task; forever @(posedge par_err) err_handle_task (`NONFATAL,`PARITY); endtask task cor_err_task; forever @(posedge cor_err) err_handle_task (`NONFATAL,`CORRECTABLE);

逻辑模拟工具及逻辑模拟方法 Verilog-XL :Cadence 业界的“黄金模拟器”, SignOff的Foundry产家最多; 解释执行,与用户的交互性能好,但模拟速度较慢; 适合对小模块的HDL描述进行模拟验证; 调用方式: verilog +gui –s –f run.f 从Cadence的Composer界面启动,适合于对逻辑图进行模拟验证

逻辑模拟工具及逻辑模拟方法 NC-Verilog :Cadence 业界的“黄金模拟器”, SignOff的Foundry产家较多; 本征码编译,与用户的交互性能好,模拟速度快; 适合对大的设计进行模拟验证; 调用方式: ncxlmode +gui –s –f run.f 从Cadence的Composer界面启动,适合于对逻辑图进行模拟验证

逻辑模拟工具及逻辑模拟方法 VCS :Synopsys 本征码编译,与用户的交互性能好,模拟速度快; 适合对大的设计进行模拟验证; 提供了一整套Verilog HDL代码调试手段 调用方式: vcs +gui –s –f run.f

逻辑模拟工具及逻辑模拟方法 VSS :Synopsys 的VHDL模拟器 速度慢; 适合对小的VHDL代码进行模拟验证; 调用方式复杂

提高模拟验证效率的手段 在具体的模块HDL编码前,应有一整套模块的模拟、验证、测试的计划; 进程的敏感信号表中不能存在冗余的信号; 在系统模拟验证中,采用比较模拟验证法代替波形观察法,以提高效率; 在模块/系统功能模拟时,采用零延时或路径延时的模拟验证方式。

逻辑模拟中的延时考虑 延时方式: 零延时 路径延时 单元延时 最大/最小延时 动态延时

Run.f 的组织 Run.f文件中所包含的内容: 逻辑模拟方式 延时计算的控制方式 待模拟验证的模块的Verilog描述文件 单元库文件的读取方式 单元库文件所在的目录

/export/home/HDL/src/mult16.v /export/home/HDL/src/adder16.v ……….. +gui -s testfixture.verilog /export/home/HDL/src/mult16.v /export/home/HDL/src/adder16.v ……….. +libext+.v+ -y library_path ……. 模拟界面控制 TestBench 库文件 单元库所存的路径 单元库文件的读取方式控制

逻辑模拟结果一致性的确定 在TestBench中加入预期结果比较 利用波形比较工具检测逻辑模拟波形的一致性