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