编写TESTBENCH---测试--VHDL

首先对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
                q_n <= q_n + 1;
            end if;
        end if;
    end process;
    q <= q_n;
end behave;

 

 

library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;

entity testbench is      //一个空的实体,没有输入和输出。
    constant ClockPeriod: time := 40 ns;
end testbench;

architecture testbenchArc of testbench is
    component counter is
        port(clk: in std_logic;
            reset: in std_logic;
            en: in std_logic;
            q: out std_logic_vector(3 downto 0));
    end component counter;           //被测器件的申明。
    
    signal clock, rst, en: std_logic;
    signal q: std_logic_vector(3 downto 0); //所要信号的申明
begin

    CounterInstance: counter port map(clock, rst, en, q);   //进行信号的匹配
   
    simProcess: process
    begin
        rst <= '1';
        wait for 50 ns;
        rst <= '0';
        wait for 1000 ns;
        rst <= '0';
    end process simprocess;
   
    en <= '0' after 0 ns,
        '1' after 50 ns,
        '0' after 850 ns,
        '1' after 900 ns;  
   
    ClockProcess: process(clock, rst)
    begin
        if (rst = '1') then
            clock <= '0';
        else
            clock <= not clock after ClockPeriod;
        end if;
    end process ClockProcess;    //这个进程进行信号的模拟,作为被测体的输入和输出。

   
end testbenchArc;

你可能感兴趣的:(FPGA,测试,vector,signal,library,工作)