




已阅读5页,还剩28页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
编写高效的测试设计(testbenches)中国半导体设备及材料网整理 更多教程请访问:Writing Efficient Testbenches编写高效的测试设计(testbenches)原文作者:Mujtaba Hamid注:一个设计的测试验证是非常重要的。有效的测试可以助我们快速的完成或改善设计。Testbenches建议编写有效的测试代码来通过软件实现可靠的验证。无意中发现,顺手译为中文,以备将来方便。也贴给没有找到更好中文版本的同道人。Testbenches本意应该是测试平台更合理,但是在中文中阅读起来很不舒服。所以本文中有时译为“测试设计”,“测试代码”,有时干脆是“测试”。摘要:应用笔记为HDL验证设计的新手,或者是没有丰富的测试设计经验的逻辑设计者而编写。测试设计是验证HDL设计的主要手段。本应用笔记为创建或准备和构建有效的测试设计提供准则。它也提供一个为任何设计开发自较验测的测试设计的一个代数方法。涉及的所有设计文件可以从以下的站点获得:PC: /pub/applications/xapp/xapp199.zipUNIX: /pub/applications/xapp/xapp199.tar.gz简介:由于设计的规模越来越大和越来越复杂,数字设计的验证已经成为一个日益困难和繁琐的事。面对挑战,验证工程师们依靠许多的验证工具和方法。对于大的系统,如几百万门的设计,工程师们一般使用一套可靠的验证工具。当然,对于一些小的设计,设计工程师常常发现带有测试的hdl仿真器就可以做得很好。测试设计已经成为一个验证高级语言设计HLL (High-Level Language) 的标准方法。典型的,测试设计完成以下任务:实现测试设计;仿真通过使用模块的测试向量来仿真测试设计;输出结果到终端或波形窗口以检视;可选择的将实际结果和预期结果进行比较。一般测试设计使用工业标准的VHDL或verilog硬件描述语言来编写。测试设计调用功能设计,然后仿真。复杂的测试设计完成一些附加的功能-如它们包含逻辑来为设计决定适当的设计激励或比较实际结果和预期结果。后续的章节说明了一个非常稳定的测试设计的结构,并且提供了一个自较验测例子-它将自动比较实际结果和测试设计的预期结果。图1说明一个基于以上基本要求的标准的hdl验证流程。由于测试设计使用VHDL或verilogHDL来描述,测试设计的验证过程可以在不同的平台或不同公司的软件工具环境完成。另外,由于VHDL或verilogHDL是公开的通用标准语言,使用VHDL或verilogHDL来描述验证设计可以毫无困难的在将来重用。图1使用测试设计的HDL测试验证流程构建测试设计:测试设计可以用VHDL或verilogHDL来描述.因为测试设计只用来进行仿真,它们没有那些适应综合中仅应用的rtl语言子集的语法约束的限制.而是所有的行为结构都可以使用。从而测试设计可以编写的更为通用,使得它们可以更容易维护。所有的测试设计包含了如表1的基本程序段块。正如上面所提到的,测试设计一般包含更多的附加功能,如在终端上可视的结果和内建的错误检测。表1 测试设计的基本程序段下面的例子说明经常使用的测试设计的结构。产生时钟信号使用系统时钟来的时序逻辑设计必须产生时钟。重复的时钟信号可以很容易的在vhdl或verilog源码中实现。以下是vhdl和verilog的时钟发生示例。VHDL:- Declare a clock period constant.Constant ClockPeriod : TIME := 10 ns;- Clock Generation method 1:Clock = not Clock after ClockPeriod / 2;- Clock Generation method 2:GENERATE CLOCK: processbeginwait for (ClockPeriod / 2)Clock = 1;wait for (ClockPeriod / 2)Clock = 0;end process;Verilog:/ Declare a clock period constant.Parameter ClockPeriod = 10;/ Clock Generation method 1:initial beginforever Clock = #(ClockPeriod / 2) Clock;end/ Clock Generation method 2:initial beginalways #(ClockPeriod / 2) Clock = Clock;end准备激励信号为了获得测试设计的验证结果,激励必须在测试设计中提供。在测试设计中使用的并行激励块提供必要的激励。两个方法被考虑:绝对时间激励和相对时间激励。在第一个方法里,仿真变量被详细描述为相对于仿真时间零点。通过比较,相对时间激励提供初始值,然后在重触发激励前等待一个事件。根据设计者的需要,两种方法可以在测试设计中组合使用。表2绝对时间激励表2和表3分别以vhdl和verilog提供了一个绝对时间激励和相对时间激励的源代码。表3相对时间激励VHDL进程块和Verilog初始块与设计文件中的其他的进程块或初始块同时执行。然而,在每一个进程块或初始块中,事件是按照书写的顺序有序的规划的。这说明在仿真时间零点并发的每一个块激励的顺序。多模块应该被用来将复杂的激励顺序分解为有更好的可读性和方便维护的代码。显示结果在verilog中推荐使用关键字$display 和 $monitor 显示结果。虽然vhdl没有等效的显示指令,它提供了std_textio标准文本输入输出程序包。它允许文件的i/o重定向到显示终端窗口(作为这个技术的示例,参看下面的自较验查验证设计)下面是verilog示例,它将在终端屏幕上显示一些值。/ pipes the ASCII results to the terminal or text editorinitial begin$timeformat(-9,1,ns,12);$display( Time Clk Rst Ld SftRg Data Sel);$monitor(%t %b %b %b %b %b %b, $realtime,clock, reset, load, shiftreg, data, sel);end关键字 $display在终端屏幕上输出引用的附加的说明文字(“。”).关键字$monitor操作不同。因为它的输出是事件驱动的。例中的变量$realtime(由用户赋值到当前的仿真时间)用于触发信号列表中值的显示。信号表由变量 $realtime开始,跟随其他将要显示的信号名(clock, reset, load等)。以%开始的关键字包含一个格式描述的表,用来控制如何格式化显示信号列表中的每个信号的值。格式列表是位置确定的。每个格式说明有序地与信号列表中的信号顺序相关。比如%t说明规定了$realtime的值是时间格式。并且第一个%b说明符格式化clock的值是二进制形式。verilog提供附加的格式说明,比如%h用于说明十六进制,%d说明十进制,%c说明显示为八进制。(参见verilog准则了解完整的关键字及格式描述符)图2说明格式显示结果图2仿真结果返回结果简单的测试设计简单的测试设计实例化用户设计,然后提供相应的激励。测试输出被图形化显示在仿真器的波形窗口里或者作为文本发送到用户的终端或者是管道输出文本。以下是一个简单的用Verilog实现的设计,它实现了一个移位寄存器的功能。module shift_reg (clock, reset, load, sel, data, shiftreg);input clock;input reset;input load;input 1:0 sel;input 4:0 data;output 4:0 shiftreg;reg 4:0 shiftreg;always (posedge clock)beginif (reset)shiftreg = 0;else if (load)shiftreg = data;elsecase (sel)2b00 : shiftreg = shiftreg;2b01 : shiftreg = shiftreg 1;default : shiftreg = shiftreg;endcaseendendmodule以下是简单的测试设计示例移位寄存器设计的例子,verilog描述。module testbench; / declare testbench namereg clock;reg load;reg reset; / declaration of signalswire 4:0 shiftreg;reg 4:0 data;reg 1:0 sel;/ instantiation of the shift_reg design belowshift_reg dut(.clock (clock),.load (load),.reset (reset),.shiftreg (shiftreg),.data (data),.sel (sel);/this process block sets up the free running clockinitial beginclock = 0;forever #50 clock = clock;endinitial begin/ this process block specifies the stimulus.reset = 1;data = 5b00000;load = 0;sel = 2b00;#200reset = 0;load = 1;#200data = 5b00001;#100sel = 2b01;load = 0;#200sel = 2b10;#1000 $stop;endinitial begin/ this process block pipes the ASCII results to the/terminal or text editor$timeformat(-9,1,ns,12);$display( Time Clk Rst Ld SftRg Data Sel);$monitor(%t %b %b %b %b %b %b, $realtime,clock, reset, load, shiftreg, data, sel);endendmodule以上的测试设计实例化设计,设置时钟,提供激励信号。所有的进程块在仿真时间零点开始。英镑标记(#)说明下一个激励作用前的延迟。$stop命令使仿真器停止测试仿真(所有测试设计中都应该包含一个停止命令)。最后,$monitor语句返回ascII格式的结果到屏幕或者管道输出到一个文本编辑器。接后的是一个vhdl描述的的测试设计,它实例化设计并提供激励到上述用verilog描述的移位寄存器.VHDL 测试设计示例:library IEEE;use IEEE.std_logic_1164.all;entity testbench isend entity testbench;architecture test_reg of testbench iscomponent shift_reg isport (clock : in std_logic;reset : in std_logic;load : in std_logic;sel : in std_logic_vector(1 downto 0);data : in std_logic_vector(4 downto 0);shiftreg : out std_logic_vector(4 downto 0);end component;signal clock, reset, load: std_logic;signal shiftreg, data: std_logic_vector(4 downto 0);signal sel: std_logic_vector(1 downto 0);constant ClockPeriod : TIME := 50 ns;beginUUT : shift_reg port map (clock = clock, reset = reset,load = load, data = data,shiftreg = shiftreg);process beginclock = not clock after (ClockPeriod / 2);end process;process beginreset = 1;data = 00000;load = 0;set = 00;wait for 200 ns;reset = 0;load = 1;wait for 200 ns;data = 00001;wait for 100 ns;sel = 01;load = 0;wait for 200 ns;sel = 10;wait for 1000 ns;end process;end architecture test_reg;上述vhdl测试设计与之前提到的verilog测试设计的功能是相似的,如希望用一个命令来返回输出到终端。在vhdl中,std_textio程序包被用于在终端上显示信息,它将被搁到下一节说明。自动验证推荐自动实现测试结果的验证,尤其是对于较大的设计来说。自动化减少了检查设计是否正确所要求的时间,也使人可能的犯错最少。一般有以下几种常用的自动测试验证的方法:1、数据库比较。首先,要创建一个包含预期输出(一个黄金向量文件)的数据库文件。然后,仿真输出被捕获并与黄金向量文件中参考的向量比较(在unix中的diff 工具可以用来比较ascii数据文件)。然而,因为从输出到输入文件指针没有提供,是这种方法的一个缺点,使得跟踪一个导致错误输出的原因比较困难。2、波形比较。波形比较可以自动或是手动的运行。自动的方法使用一个测试比较器来比较黄金波形与测试输出波形。xilinx的hdl bencher工具可以用于执行一个自动波形比较(关于hdl bencher的相关信息,请参看/products/software/statecad/index.htm)3、自较验测试。一个自较验测试检查预期的结果与运行时间的实际结果,并不是在仿真结束以后。因为有用的错误跟踪信息可以内建在一个测试设计中,用来说明哪些地方设计有误,调试时间可以非常明显地缩短。更多的关于自较验测试的信息在下一节说明。自较验测试自较验测试通过在一个测试文档中放置一系列的预期向量表来实现。运行时间时间间隔将这些向量与定义好的实际仿真结果进行比较。如果实际结果与预期结果匹配,仿真成功。如果结果不匹配,测试报告两者的差异。为同步设计实现自较验测试更简单一些,因为与实现的结果相比较可以在一个时钟沿或任何一个整数倍的时钟周期后。比较的方法基于设计本身的特性。比如一个用于内存I/O的测试应该检查每一次更新数据时的结果或者从一个内存位置读取。类似的,如果一个设计用了一个显而易见的组合块的数字,在预期结果描述时,组合时延就必须要考虑。在自较验测试中,预期输出与实际输出在一个特定的运行时间间隔比较以便提供自动的错误检查。这个技术在小到中型的设计中非常好。但是,因为当设计复杂后,可能的输出组合成指数倍的增长,为一个大型设计编写一个自较验测试设计是非常困难和非常费时的。以下是一个用verilog和vhdl描述的自较验测试的简单的例子:Verilog例子下述的设计实例中,预期的结果被详细说明。后面的代码,两种结果被比较,比较的结果被返回终端。如果没有错误,一个“end of good simulation”消息会显示。如果失配发生,根据期望与实际值的失配情况,错误会被相应报告。timescale 1 ns / 1 psmodule test_sc;reg tbreset, tbstrtstop;reg tbclk;wire 6:0 onesout, tensout;wire 9:0 tbtenthsout;parameter cycles = 25;reg 9:0 Data_in_t 0:cycles;/ / Instantiation of the Design/ /stopwatch UUT (.CLK (tbclk), .RESET (tbreset), .STRTSTOP (tbstrtstop),.ONESOUT (onesout), .TENSOUT (tensout), .TENTHSOUT (tbtenthsout);wire 4:0 tbonesout, tbtensout;assign tbtensout = led2hex(tensout);assign tbonesout = led2hex(onesout);/EXPECTED RESULTS/initial beginData_in_t1 =10b1111111110;Data_in_t2 =10b1111111101;Data_in_t3 =10b1111111011;Data_in_t4 =10b1111110111;Data_in_t5 =10b1111101111;Data_in_t6 =10b1111011111;Data_in_t7 =10b1110111111;Data_in_t8 =10b1101111111;Data_in_t9 =10b1011111111;Data_in_t10=10b0111111111;Data_in_t11=10b1111111110;Data_in_t12=10b1111111110;Data_in_t13=10b1111111101;Data_in_t14=10b1111111011;Data_in_t15=10b1111110111;Data_in_t16=10b1111101111;Data_in_t17=10b1111011111;Data_in_t18=10b1110111111;Data_in_t19=10b1101111111;Data_in_t20=10b1011111111;Data_in_t21=10b0111111111;Data_in_t22=10b1111111110;Data_in_t23=10b1111111110;Data_in_t24=10b1111111101;Data_in_t25=10b1111111011;endreg GSR;assign glbl.GSR = GSR;initial beginGSR = 1;/ / Wait till Global Reset Finished/ /#100 GSR = 0;end/ / Create the clock/ /initial begintbclk = 0;/ Wait till Global Reset Finished, then cycle clock#100 forever #60 tbclk = tbclk;endinitial begin/ / Initialize All Input Ports/ /tbreset = 1;tbstrtstop = 1;/ / Apply Design Stimulus/ /#240 tbreset = 0;tbstrtstop = 0;#5000 tbstrtstop = 1;#8125 tbstrtstop = 0;#500 tbstrtstop = 1;#875 tbreset = 1;#375 tbreset = 0;#700 tbstrtstop = 0;#550 tbstrtstop = 1;/ / simulation must be halted inside an initial statement/ / #100000 $stop;endinteger i,errors;/ Block below compares the expected vs. actual results/ at every negative clock edge./always (posedge tbclk)beginif (tbstrtstop)begini = 0;errors = 0;endelsebeginfor (i = 1; i 1)$display(%0d ERROR! See log above for details.,errors);else$display(ERROR! See log above for details.);#100 $stop;endendendmodule这种简单的自较验测试设计可以转换到任何测试场合-当然,预期的输出值和信号的名字在重用时是需要更改的。如果不需要每个时钟沿检查,需要的话可以修改for-loop结构。如果仿真成功,下图的信息就会在显示终端上显示:图3 verilog示例验证VHDL 示例:在VHDL中,向量文件包含预期的结果。VHDL 的textio程序包用于从向量文件中读取数据,和显示错误信息。这个测试用VHDL示例秒表设计.LIBRARY IEEE;USE IEEE.std_logic_1164.all;LIBRARY ieee;USE IEEE.STD_LOGIC_TEXTIO.ALL;USE STD.TEXTIO.ALL;ENTITY testbench ISEND testbench;ARCHITECTURE testbench_arch OF testbench ISCOMPONENT stopwatchPORT (CLK : in STD_LOGIC;RESET : in STD_LOGIC;STRTSTOP : in STD_LOGIC;TENTHSOUT : out STD_LOGIC_VECTOR (9 DOWNTO 0);Figure 3: Verilog Example VerificationONESOUT : out STD_LOGIC_VECTOR (6 DOWNTO 0);TENSOUT : out STD_LOGIC_VECTOR (6 DOWNTO 0);END COMPONENT;SIGNAL CLK : STD_LOGIC;SIGNAL RESET : STD_LOGIC;SIGNAL STRTSTOP : STD_LOGIC;SIGNAL TENTHSOUT : STD_LOGIC_VECTOR (9 DOWNTO 0);SIGNAL ONESOUT : STD_LOGIC_VECTOR (6 DOWNTO 0);SIGNAL TENSOUT : STD_LOGIC_VECTOR (6 DOWNTO 0);constant ClockPeriod : Time := 60 ns;FILE RESULTS: TEXT IS OUT results.txt;signal i: std_logic;BEGINUUT : stopwatchPORT MAP (CLK = CLK,RESET = RESET,STRTSTOP = STRTSTOP,TENTHSOUT = TENTHSOUT,ONESOUT = ONESOUT,TENSOUT = TENSOUT);stimulus: PROCESSbeginreset = 1;strtstop = 1;wait for 240 ns;reset = 0;strtstop = 0;wait for 5000 ns;strtstop = 1;wait for 8125 ns;strtstop = 0;wait for 500 ns;strtstop = 1;wait for 875 ns;reset = 1;wait for 375 ns;reset = 0;wait for 700 ns;strtstop = 0;wait for 550 ns;strtstop = 1;end process stimulus;clock: processbeginclk = 1;wait for 100 ns;loopwait for (ClockPeriod / 2);CLK good_number);next when not good_number;vector_time := r * 1 ns;if (now X1F1E1D1C1B1A191817161514131211100F0E0D0C0B0A09080706050403020100,INIT_01 =X3F3E3D3C3B3A393837363534333231302F2E2D2C2B2A29282726252423222120,.INIT_0F=XFFFEFDFCFBFAF9F8F7F6F5F4F3F2F1F0EFEEEDECEBEAE9E8E7E6E5E4E3E2E1E0);end for;end for;end for;end for;end cfg_ex_blkram_tb;高级测试技术根据任务和过程细分激励模块在创建一个大的测试设计时,激励将会被分割使得代码清晰而易于修改。任务(verilog)或过程(VHDL)可以被用来分割信号。在下面的例子中,测试激励用于一个SDRAM控制器的设计。设计包括重复的激励模块,以便测试设计中通过声明独立的任务分割激励,这些任务稍后被调用来进行独立块的功能的仿真执行。Verilog示例task addr_wr;input 31 : 0 address;begindata_addr_n = 0;we_rn = 1;ad = address;endendtasktask data_wr;input 31 : 0 data_in;begindata_addr_n = 1;we_rn = 1;ad = data_in;endendtasktask addr_rd;input 31 : 0 address;begindata_addr_n = 0;we_rn = 0;ad = address;endendtasktask data_rd;input 31 : 0 data_in;begindata_addr_n = 1;we_rn = 0;ad = data_in;endendtasktask nop;begindata_addr_n = 1;we_rn = 0;ad = hi_z;endendtask这些任务指定独立的设计功能元素-地址可读可写,数据可读可写,或者空操作。一量指定,这些任务可以在激励进程中被调用。如下所示:Initial beginnop ; / Nop#( 86* CYCLE +1); addr_wr (32h20340400); / Precharge, loadController MR#(CYCLE); data_wr (32h0704a076); / value for Controller MR#(CYCLE); nop ; / Nop#(5 * CYCLE); addr_wr (32h38000000); / Auto Refresh#(CYCLE); data_wr (32h00000000); /#(CYCLE); nop ; / NopendVHDL例程以下是相当设计的VHDL测试文件,分别细分到独立的过程。Stimulus : processprocedure addr_wr (address: in std_logic_vector(31 downto 0) isbegindata_addr_n = 0;we_rn = 1;ad = address;end addr_wr;procedure data_wr (data_in: in std_logic_vector(31 downto 0 ) isbegindata_addr_n = 1;we_rn = 1;ad = data_in;end data_wr;procedure addr_rd (address: in std_logic_vector(31 downto 0) isbegindata_addr_n = 0;we_rn = 0;ad = address;end addr_rd;procedure data_rd (data_in: in std_logic_vector(31 downto 0) isbegindata_addr_n = 1;we_rn = 0;ad = data_in;end data_rd;procedure nop isbegindata_addr_n = 1;we_rn = 0;ad = Z;end nop;beginnop ; - Nopwait for 200 ns;addr_wr (16#20340400#); - Precharge, load Controller MRwait for 8 ns;data_wr (16#0704a076#); -
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 汽车等级考试试题及答案
- 海南省卫生健康委员会2025年医师资格考试中医执业助理医师练习题及答案
- 2025年公路工程试验检测师资格考试(公共基础)综合能力测试题及答案(广东汕尾)
- 遗体接运工前沿技术考核试卷及答案
- 玻璃钢制品缠绕工设备维护与保养考核试卷及答案
- 电商咨询师技术考核试卷及答案
- 2025年广东省职业病诊断医师考试职业性尘肺病及其他呼吸系统疾病复习题及答案
- 2025年茂名职业病诊断医师考试(职业性尘肺病)复习题及答案
- 2025年工匠试题考核及答案
- 2025年枣庄东林农文化产业发展有限公司招聘工作人员考试真题含答案
- 第2课《中国人首次进入自己的空间站》教学设计-统编版语文八年级上册
- 牛羊肉供货合同模板2025年
- 23G409先张法预应力混凝土管桩
- 民航安全检查员(四级)理论考试题库(浓缩500题)
- 热力管网监理实施细则
- FMEA-潜在失效模式分析
- 统编版高中语文选择性必修上册第一单元测试卷【含答案】
- 保健食品注册与备案管理办法课件
- 钢筋锈蚀原理及应对措施案例分析(54页图文丰富)
- 第二讲水轮机结构
- K2FastWave中文操作手册
评论
0/150
提交评论