好文档就是一把金锄头!
欢迎来到金锄头文库![会员中心]
电子文档交易市场
安卓APP | ios版本
电子文档交易市场
安卓APP | ios版本

如何写testbench.doc

12页
  • 卖家[上传人]:
  • 文档编号:43466941
  • 上传时间:2018-06-06
  • 文档格式:DOC
  • 文档大小:19.25KB
  • / 12 举报 版权申诉 马上下载
  • 文本预览
  • 下载提示
  • 常见问题
    • 如何写如何写 testbenchtestbench一、 基本概念和基础知识Testbench 不仅要产生激励也就是输入,还要验证响应也就是输出当然也可以只产生激励,然后通过波形窗口通过人工的方法去验证波形,这种方法只能适用于小规模的设计在 ISE 环境中,当前资源操作窗显示了资源管理窗口中选中的资源文件能进行的相关操作在资源管理窗口选中了 testbench 文件后,在当前资源操作窗显示的 ModelSimSimulator 中显示了 4 种能进行的模拟操作,分别是:Simulator Behavioral Model(功能仿真) 、Simulator Post-translate VHDL Model(翻译后仿真) 、Simulator Post-Map VHDLModel(映射后仿真) 、Simulator Post-Place 断言的条件不是一个条件表达式,而直接是 false这说明只要程序执行到这里断言就一定会成立,送出消息出错级别为 note,在模拟器的输出窗口将会显示:图 2再看一个例子:assert (s_cyi((DWIDTH-1)/4) = '0')and (s_ovi = '0')and (s_qutnt = conv_std_logic_vector(v_quot,DWIDTH))and (s_rmndr = conv_std_logic_vector(v_remd,DWIDTH))report “ERROR in division!“severity failure;断言的条件有 4 个并且是与的关系,只要其中一个条件不成立则整个表达式为假,断言成立。

      如果断言成立将输出“ERROR in division!“这个消息并且通知模拟器出错级别为failure,这一般会停止模拟这个断言实际是在对结果进行验证二、实际 testbench 分析下面将详细分析一个实际的 testbench,它是用来测试 8051 的 ALU单元的除法功能的8 位的除法器,被除数和除数的组合共有 256×256=65536 种我们采用的方法是穷举所有的输入组合,这样的代码覆盖率可以达到 100%它的验证必须通过程序自动完成,否则通过人工方法工作量太大把要测试的程序当作一个元件,例如想象成一个 74 系列数字电路Testbench 的作用是在被测试电路的输入端加上激励,然后比较被测试电路的输出和计算出来的期望值是否一致对我们这个例子来说,在要仿真的 ALU 输入端产生 65536 种输入组合,然后将 ALU 产生的对应输出值和 testbench 算出的期望值相比较,如果有错误产生则停止模拟并输出信息ALU 的除法单元的输入有 4 个,分别是被除数、除数、进位、溢出位;输出也有 4 个,分别是商、余数、新的进位、新的溢出位1、 testbench 的输出 s_dvdnd(被除数) 、s_dvsor(除数) 、s_cyo(进位) 、s_ovo(溢出位)连接到 ALU 的输入 acc_i(被除数) 、ram_data_i(除数) 、cy_i(进位) 、ov_i(溢出位) ;2、 testbench 的输入 s_qutnt(商) 、s_rmndr(余数) 、s_cyi(进位) 、s_ovi(溢出位)连接到 ALU 的输出 result_a_o(商) 、 result_b_o(余数) 、new_cy_o(进位) 、new_ov_o(溢出位) 。

      3、 总之,testbench 驱动被测试单元,同时对被测试单元的输出进行验证4、assert (s_cyi((DWIDTH-1)/4) = '0')and (s_ovi = '0')and (s_qutnt = conv_std_logic_vector(v_quot,DWIDTH))and (s_rmndr = conv_std_logic_vector(v_remd,DWIDTH))report “ERROR in division!“severity failure;根据 51 指令系统规定,除法运算的 cy 位固定为 0,如果除数为 0则 ov 置 1,否则置 0程序中s_qutnt = conv_std_logic_vector(v_quot,DWIDTH)s_rmndr = conv_std_logic_vector(v_remd,DWIDTH)用来对运算结果进行比较conv_std_logic_vector()是类型转换函数――首先是对库的引用library IEEE;use IEEE.std_logic_1164.all;use IEEE.std_logic_arith.all;library work;use work.mc8051_p.all;library STD;use STD.textio.all;――定义结构体,testbench 程序的结构体是空的。

      因为 testbench是用来仿真的,不存在--对外的接口,所以 entity 是空的但是必须要有,这是语法的要求entity TBX_mc8051_alu isend TBX_mc8051_alu;-------------------------------------------------------------------------------architecture TBX_ARCH_DIV of TBX_mc8051_alu is――定义元件,映射后仿真和布局布线后仿真要使用 SDF 文件,必须指定实例名要实例--化元件首先必须定义元件component mc8051_aluport (new_ov_o : out STD_LOGIC; ――新的 ov 位,输出ov_i : in STD_LOGIC := 'X'; ――ov 位,输入new_cy_o : out STD_LOGIC_VECTOR ( 1 downto 0 ); ――新的 cy位,输出acc_i : in STD_LOGIC_VECTOR ( 7 downto 0 ); ――acc,输入rom_data_i : in STD_LOGIC_VECTOR ( 7 downto 0 ); ――rom_data,输入cmd_i : in STD_LOGIC_VECTOR ( 5 downto 0 ); ――命令,输入ram_data_i : in STD_LOGIC_VECTOR ( 7 downto 0 ); ――ram_data,输入cy_i : in STD_LOGIC_VECTOR ( 1 downto 0 ); ――cy,输入result_b_o : out STD_LOGIC_VECTOR ( 7 downto 0 ); ――结果b,输出result_a_o : out STD_LOGIC_VECTOR ( 7 downto 0 ) -―结果a,输出);end component;――定义函数--------------------------------------------------------------------------------- IMAGE - Convert a special data type to string ----This function uses the STD.TEXTIO.WRITE procedure to convert different ---- VHDL data types to a string to be able to output the information via ---- a report statement to the simulator. ---- (VHDL'93 provides a dedicated predefinded attribute 'IMAGE) -------------------------------------------------------------------------------――定义了一个函数 IMAGE,之所以有两个定义,是因为对 IMAGE进行了重载,一个是把――time 变量转换成 string,另一个是把 integer 变量转换成stringfunction IMAGE (constant tme : time) return string isvariable v_line : line;variable v_tme : string(1 to 20) := (others => ' ');beginwrite(v_line, tme);v_tme(v_line.all'range) := v_line.all;deallocate(v_line);return v_tme;end IMAGE;function IMAGE (constant nmbr : integer) return string isvariable v_line : line;variable v_nmbr : string(1 to 11) := (others => ' ');beginwrite(v_line, nmbr);v_nmbr(v_line.all'range) := v_line.all;deallocate(v_line);return v_nmbr;end IMAGE;――定义过程,它产生所有的测试输入数据并将产生结果和期望值进行比较,如果有误――产生,模拟将停止并输出一个错误信息。

      注意到 testbench 要产生被测试单元的输入――信号,因此 testbench 的输出接到被测试单元的输入,被测试单元的输出接到――testbench 的输入procedure PROC_DIV_ACC_RAM (constant DWIDTH : in positive;constant PROP_DELAY : in time;signal s_cyi : in std_logic_vector;signal s_ovi : in std_logic;signal s_qutnt : in std_logic_vector;signal s_rmndr : in std_logic_vector;signal s_cyo : out std_logic_vector;signal s_ovo : out std_logic;signal s_dvdnd : out std_logic_vector;signal s_dvsor : out std_logic_vector;signal s_dvdr_end : out boolean) isvariable v_quot : integer;variable v_remd : integer;variable v_flags : std_logic_vector((DWIDTH-1)/4+1 downto 0);begins_dvdr_end rom_data_DIV_ACC_RAM(7 downto 0),ram_data_i => ram_data_DIV_ACC_RAM(7 downto 0),acc_i => acc_DIV_ACC_RAM(7 downto 0),cmd_i => cmd_DIV_ACC_RAM,cy_i => cy_DIV_ACC_RAM(1 downto 0),ov_i => ov_DIV_ACC_RAM,new_cy_o => new_cy_DIV_ACC_RAM(1 downto 0),new_ov_o => new_ov_DIV_ACC_RAM,result_a_o => result_a_DIV_ACC_RAM(7 downto 0),result_b_o => result_b_DIV_ACC_RAM(7 downto 0));――mc8051_alu 的被除数。

      点击阅读更多内容
      关于金锄头网 - 版权申诉 - 免责声明 - 诚邀英才 - 联系我们
      手机版 | 川公网安备 51140202000112号 | 经营许可证(蜀ICP备13022795号)
      ©2008-2016 by Sichuan Goldhoe Inc. All Rights Reserved.