首先对 TESTBENCH 作一个形象一些的比喻吧,它就象是一个面包板
(做过电路实验吧),他对外没有任何接口,但它要向要插在他上面的器件提
供接口,这样才能正确的插入,还有它必须对插在它上面的器件提供正常的信
号。当然在它上面还必须要有这个器件。这时就完成了一个 TESTBENCH。应
该大概明白了其中的意思了吧。
好了,根据上面的比喻我们可以非常明确的知道一个 TESTBENCH 要写
一些什么东西,首先它对外无接口,所以它的实体部分是空的。在它上面要有
相应的器 件,所以在它的结构体中要申明我们要测试的器件,也就是
component 的申明。还有就是它要对器件提供接口,所以它的结构体应该提
供一些信号,并且要 对这些信号进行正确的测试赋值。当然还要进行一些插入
工作,就是信号的对应工作。这样一个 TESTBENCH 就完成了。原理很简单的,
应该很容易明白。不 过在真正的测试中可能不会用太多的这种方式吧,应该会
选用测试向量吧,这个的准确性更高一些。不过怎么样写测试向量,这到是一
个有大学问的东西,因为当我 们的管脚很多的时候,测试的向量数目是要心指
数增长的,当然不可能把所有的情况都测试完成了,只有是测试其中的一部分,
这儿怎么样写出有代表性的一组测试 向量是很有学问的,应该说是研究的热点
吧。
下面给一个测试向量的例子,这是在网上找的代码,可能对大家有帮助吧。
这是一个计数器的测试向量。
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;
entity counter is
port(clk: in std_logic;
reset: in std_logic;
en: in std_logic;
q: out std_logic_vector(3 downto 0));
end counter;
architecture behave of counter is
signal q_n: std_logic_vector(3 downto 0);
begin
process(clk, reset, en, q_n)
begin
if (reset = '1') then
q_n <= (others => '0');--异步清零
elsif rising_edge(clk) then
if en = '1' then
评论1