Vhdl 灵敏度列表中的哪个信号触发该过程

Vhdl 灵敏度列表中的哪个信号触发该过程,vhdl,Vhdl,在VHDL中,当模拟测试台时,我有一个进程和灵敏度列表。 是否可能看到灵敏度列表中的哪个信号触发了该过程? 我理解这可能取决于工具。 我正在使用Xilinx ISE。模拟器是否提供了此信息?您可以将'transaction属性与'event结合使用,以确定哪些信号在当前增量周期中有事务: 过程(a,b)是 开始 如果是“交易”事件,那么 报告“网上交易”; 如果结束; 如果是b'transaction'事件,那么 报告“b上的交易”; 如果结束; 结束过程; 'transaction属性创建一

在VHDL中,当模拟测试台时,我有一个进程和灵敏度列表。 是否可能看到灵敏度列表中的哪个信号触发了该过程? 我理解这可能取决于工具。
我正在使用Xilinx ISE。模拟器是否提供了此信息?

您可以将
'transaction
属性与
'event
结合使用,以确定哪些信号在当前增量周期中有事务:

过程(a,b)是
开始
如果是“交易”事件,那么
报告“网上交易”;
如果结束;
如果是b'transaction'事件,那么
报告“b上的交易”;
如果结束;
结束过程;
'transaction
属性创建一个bit类型的新信号,在每个事务上切换。该信号上的
“event
属性标识父信号上发生任何事务的时间

您还可以使用
not'quiet(0 ns)
来确定自上一个时间步骤以来,灵敏度列表中的哪些信号有事务:

过程(a,b)是
开始
如果不是一个安静的(0ns)那么
报告“网上交易”;
如果结束;
如果不是b'quiet(0 ns),则
报告“b上的交易”;
如果结束;
结束过程;

如果您不想处理发生在不同增量周期上的事件顺序,则后者可能更有用。

这里有两个VHDL概念:

  • 事务:在模拟周期(时间和增量周期)为信号赋值

  • 事件:导致信号值更改的事务(赋值)

因此,每次分配给该信号时,该信号上都会发生一个事务,但 即使只有在该赋值实际改变信号值时才会发生

VHDL具有以下相关属性:

  • S'active
    :布尔值,即在模拟周期中发生的iff事务

  • S'event
    :布尔值,即当前模拟周期中发生的iff事件为真

如果出现灵敏度列表中的任何信号,则恢复处理, 因此,要确定导致进程恢复的信号,请执行以下操作: 可使用以下代码:

alfa: process (a, b) is
begin
  report "Process alfa was resumed";
  if a'event then
    report "- Event on a";
  end if;
  if b'event then
    report "- Event on b";
  end if;
end process;
如果为
a
b
分配了当前值,则不会发生偶数

然而,VHDL有一个属性,可以生成隐式信号 在每个事务中进行更改,从而有效地将事务转换为 事件,从而可以恢复进程:

  • S'transaction
    :当事务发生时更改的位
因此,通过
A
b
上的事务恢复的流程可以通过以下方式进行:

bravo: process (a'transaction, b'transaction) is
begin
  report "Process bravo was resumed";
  if a'active then
    report "- Transaction on a";
  end if;
  if a'event then
    report "- Event on a";
  end if;
  if b'active then
    report "- Transaction on b";
  end if;
  if b'event then
    report "- Event on b";
  end if;
end process;
该行为可通过产生刺激的试验台过程显示,如下所示:

process is
begin
  a <= 0;          -- Declared as natural
  b <= 0;          -- --||--
  wait for 1 ns;
  a <= 1;          -- Both transaction and event @ 1 ns 1 delta
  wait for 0 sec;  -- Delta delay
  a <= 1;          -- Only transaction, but no event @ 1 ns 2 delta
  wait for 0 sec;  -- Delta delay
  b <= 2;          -- Both transaction and event @ 1 ns 3 delta
  wait for 0 sec;  -- Delta delay
  a <= 3;          -- Both transaction and event @ 1 ns 4 delta
  b <= 3;          -- Both transaction and event @ 1 ns 4 delta
  wait for 1 ns;
  wait;
end process;
流程bravo的报告输出(0秒时的初始运行除外)为:

因此,可以看出,
a
在1ns delta 2处的仅事务信号变化仅由事务签入过程bravo报告,并且没有与此相关的事件
这是。

@Morten,因此使用事件和事务,我甚至可以捕获我连续向信号发送相同值的实例。 如示例所示:


a谢谢!属性似乎是检测这些的最佳方式。您的代码将(正确地)报告a或B上是否有事务,但仅仅是事务不会触发敏感度列表。当然,要回答这个问题,您需要:
如果是“事件”,则报告“事件上的事件”等,这是提问者实际要求的。仅事务(无值更改)和
等待0秒
仅用于模拟,因为硬件需要改变信号才能进行任何通信(因此不只是事务),并且没有增量周期的概念(
等待0秒
)在硬件方面。感谢您的回复和澄清。非常感谢。
Time: 1 ns  Iteration: 1  Instance: /tb    # ** Note: Process alfa was resumed
Time: 1 ns  Iteration: 1  Instance: /tb    # ** Note: - Event on a

Time: 1 ns  Iteration: 3  Instance: /tb    # ** Note: Process alfa was resumed
Time: 1 ns  Iteration: 3  Instance: /tb    # ** Note: - Event on b

Time: 1 ns  Iteration: 4  Instance: /tb    # ** Note: Process alfa was resumed
Time: 1 ns  Iteration: 4  Instance: /tb    # ** Note: - Event on a
Time: 1 ns  Iteration: 4  Instance: /tb    # ** Note: - Event on b
Time: 1 ns  Iteration: 1  Instance: /tb    # ** Note: Process bravo was resumed
Time: 1 ns  Iteration: 1  Instance: /tb    # ** Note: - Transaction on a
Time: 1 ns  Iteration: 1  Instance: /tb    # ** Note: - Event on a

Time: 1 ns  Iteration: 2  Instance: /tb    # ** Note: Process bravo was resumed
Time: 1 ns  Iteration: 2  Instance: /tb    # ** Note: - Transaction on a

Time: 1 ns  Iteration: 3  Instance: /tb    # ** Note: Process bravo was resumed
Time: 1 ns  Iteration: 3  Instance: /tb    # ** Note: - Transaction on b
Time: 1 ns  Iteration: 3  Instance: /tb    # ** Note: - Event on b

Time: 1 ns  Iteration: 4  Instance: /tb    # ** Note: Process bravo was resumed
Time: 1 ns  Iteration: 4  Instance: /tb    # ** Note: - Transaction on a
Time: 1 ns  Iteration: 4  Instance: /tb    # ** Note: - Event on a
Time: 1 ns  Iteration: 4  Instance: /tb    # ** Note: - Transaction on b
Time: 1 ns  Iteration: 4  Instance: /tb    # ** Note: - Event on b