为什么vhdl中的这段代码不能模拟任何东西?(testbench and design)

时间:2016-03-19 02:34:52

标签: vhdl

--

library IEEE;

use IEEE.STD_LOGIC_1164.ALL;


entity D_flip_flop is

port ( 

        D : in STD_LOGIC;
        Q : inout STD_LOGIC;
        Q_tonos : out STD_LOGIC;
        CLK : in STD_LOGIC;
        RST : in STD_LOGIC
        );

end D_flip_flop;

architecture Behavioral of D_flip_flop is

begin

process_flip_flip: process

begin

wait until CLK'EVENT AND CLK = '1';

if(RST='1') then

    Q <= '0';
    else 
    Q <= D;
    end if;
    Q_tonos <= not Q;

end process process_flip_flip;
end Behavioral;

-------------------------

--testbench

LIBRARY ieee;

USE ieee.std_logic_1164.ALL;



ENTITY test_flip_flop IS

END test_flip_flop;

ARCHITECTURE tb OF test_flip_flop IS 



    COMPONENT D_flip_flop
    PORT(

         D : IN  std_logic;
         Q : INout  std_logic;
         Q_tonos : OUT  std_logic;
         CLK : IN  std_logic;
         RST : IN  std_logic
        );
    END COMPONENT;



   signal D : std_logic ;

   signal CLK : std_logic ;

   signal RST : std_logic ;



   signal Q : std_logic;



   signal Q_tonos : std_logic;


   constant CLK_period : time := 10 ns;
   signal stopClk : boolean;

BEGIN

    -- Instantiate the Unit Under Test (UUT)
   dut: D_flip_flop PORT MAP (

          D => D,
          Q => Q,
          Q_tonos => Q_tonos,
          CLK => CLK,
          RST => RST
        );

   CLK_process :process

   begin

        while not stopClk loop

        CLK <= '0';
        wait for CLK_period/2;
        CLK <= '1';
        wait for CLK_period/2;
        end loop;
        wait;
   end process CLK_process;


   -- Stimulus process

   stim_proc: process
   begin        


      -- insert stimulus here 
        D <= '0';
        RST <= '1';
        wait for 100 ns;

        D <= '0';
        RST <= '0';
        wait for 100 ns;

        D <= '1';
        RST <= '0';
        wait for 100 ns;

        D <= '1';
        RST <= '0';
        wait for 100 ns;

        wait;
   end process;

END;

2 个答案:

答案 0 :(得分:1)

我想你的测试平台中缺少一行:

    D <= '1';
    RST <= '0';
    wait for 100 ns;

    stopClk <= TRUE;  -- add this line

    wait;
  end process;

END;

http://www.edaplayground.com/x/56Mm

这样,当测试结束时,时钟stopClk信号关闭时钟发生器并完成模拟。它结束是因为它达到了一个名为 event fortvation 的状态。每次执行包含信号分配的一行代码时,都会向模拟器事件队列(其&#34;待办事项列表&#34;)添加一个事件。如果创建的情况不再继续执行此类行,则事件队列将变为空。这是事件的饥饿。模拟器检测到并且模拟停止。 (如果你想一想,还能做些什么呢?)

如果没有这条额外的线,模拟将永远运行,因为时钟生成过程会永久执行信号分配,因此事件队列永远不会为空。

答案 1 :(得分:0)

不是一个真正的答案,但是:考虑使用如果rising_edge(CLK),或者如果CLK =&#39; 1&#39;则使用和CLK&#39;事件而不是等到。并非所有的synhtesis工具都支持这种代码,无论如何在专业领域很难看到它;)

P.S。 stopClk 信号没有被驱动(或者是它?)你的TB时钟是可靠的,但我想它仍然是&#39; u&#39; 用于整个模拟。除非在模拟中被迫。