在VHDL测试平台上等待一个不定时的信号

时间:2014-05-15 20:23:17

标签: vhdl modelsim vlsi

我已经编写了一个模拟过程,可以根据需要顺序设置或更改信号,我通常使用等待语句来等待某些时间间隔或等待信号分配,但只有当我知道信号何时到来时才会出现这种情况,例如:

    reset      <= '1';
    write      <= '0';
    read       <= '0';
    wait for 25 ns;
    reset      <= '0';
    chipselect <= '1';
    wait until clk = '1';

但是现在我需要做一些不同的事情,我有一个通常为0的信号,我需要在它变为1时暂停模拟激励。但是信号不是定时的。意思是我不能用简单的等待语句来做,因为模拟只会在某个时间等待它。我希望这种效果始终发生。怎么做这样的事情?

4 个答案:

答案 0 :(得分:2)

根据描述,我知道你想暂停刺激 基于信号生成,因此刺激时间相应延长 停顿的时间。

对于此,具有活动时间的信号(下面名为active_time)可以是 创建,然后可以基于此时间生成刺激。活跃时间 仅在active_stimuli为TRUE时运行。

active_wait_for对应的支持程序(下面名为wait for) 然后可以创建等待请求的活动时间量,以供使用 刺激的产生过程。

建议代码:

architecture syn of tb is

  -- Active declarations
  signal   active_stimuli    : boolean := TRUE;
  constant ACTIVE_RESOLUTION : time := 1 ps;
  signal   active_time       : time := 0 ps;

  -- Wait procedure for active delay
  procedure active_wait_for(delay : time) is
    variable active_time_start_v : time;
  begin
    active_time_start_v := active_time;
    if delay > 0 ps then
      wait until active_time >= active_time_start_v + delay;
    end if;
  end procedure;

  -- Stimuli signal
  signal stimuli_a : std_logic;
  signal stimuli_b : std_logic;

begin

  -- Active time generation
  process is
  begin
    wait for ACTIVE_RESOLUTION;
    if active_stimuli then
      active_time <= active_time + ACTIVE_RESOLUTION;
    else  -- Save execution time in loop by wait until
      wait until active_stimuli;
    end if;
  end process;

  -- Stimuli generation
  process is
  begin
    stimuli_a <= '0';
    stimuli_b <= '0';
    wait until active_time >= 2 ns;
    stimuli_a <= '1';
    active_wait_for(3 ns);
    stimuli_b <= '1';
    wait;
  end process;
...

波形显示操作如下:

enter image description here

请注意,极性与问题中的信号不同,但是命名是 这种极性更清晰。

答案 1 :(得分:1)

关于&#34;暂停&#34;的一些想法中断型信号的激励过程:

  1. 将激励重写为时钟进程(例如状态机),并将中断用作时钟使能。但这可能是一种痛苦。

  2. 可能更容易,无论何时等待,等待这样的事情:

    wait until clk = '1';
    if interrupt = '1' then
      wait until interrupt = '0';
      wait until clk = '1';
    end if;
    

    或者它不是同步等待:

    wait for 100 ns;
    if interrupt = '1' then
      wait until interrupt = '0';
    end if;
    

    当然,您可以编写一个程序来简化这些过程。可能有更简单/更优雅的方式来编码,但我写的应该有效。

答案 2 :(得分:0)

这就是你想要的:

process (start) begin
    if rising_edge(start) then
        -- Respond to start signal rising
    end if;
end process;

答案 3 :(得分:0)

没有什么可以阻止您在测试平台/模拟中编写另一个进程来等待其他情况发生。您可能希望这样做的一个示例是,您只是计算特定条件的事件数。

例如:

Signal_Waiter : process(interrupt)
begin
   if rising_edge(interrupt) then
      -- do stuff here such as increment a counter
   end if;
end process;

由于此过程完全独立于代码的“刺激”部分,因此始终可以进行唤醒和处理。在这种情况下,只要信号中断发生变化,它就会唤醒。

如果您正在从单独的过程中驱动刺激信号,请小心,因为您不能有两个过程驱动相同的信号。如果您需要对主控制过程的反馈,可以使用信号或共享变量进行反馈。