1

我编写了一个模拟过程,可以根据需要按顺序设置或更改信号,我通常使用等待语句来等待某些时间间隔或等待信号分配,但只有当我知道信号何时应该到来时才是正确的,例如:

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

但现在我需要做一些不同的事情,我有一个通常为 0 的信号,并且每当它变为 1 时我都需要暂停模拟刺激。但是信号没有计时。这意味着我不能用简单的等待语句来做到这一点,因为模拟只会在特定时间等待它。我希望这种效果一直发生。怎么做这样的事情?

4

4 回答 4

2

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

为此,active_time可以创建具有活动时间(如下所示)的信号,然后可以根据该时间生成刺激。活动时间仅在active_stimuliTRUE 时运行。

然后可以创建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;
...

波形显示操作如下:

在此处输入图像描述

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

于 2014-05-16T14:18:39.957 回答
1

在中断型信号上“暂停”刺激过程的一些想法:

  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;
    

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

于 2014-05-16T13:49:42.957 回答
0

这是你想要的吗:

process (start) begin
    if rising_edge(start) then
        -- Respond to start signal rising
    end if;
end process;
于 2014-05-15T20:36:09.307 回答
0

没有什么可以阻止您在测试台/模拟中编写另一个进程以等待其他条件发生。您可能想要执行此操作的一个示例是当您简单地计算某个条件的事件数时。

例如:

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

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

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

于 2014-05-15T20:36:54.987 回答