在VHDL中,当模拟测试平台时,我有一个进程和一个敏感列表。 是否有可能看到灵敏度列表中的哪个信号触发了该过程? 我知道这可能取决于工具。 我正在使用Xilinx ISE。模拟器是否提供此信息?
答案 0 :(得分:4)
您可以将'transaction
属性与'event
结合使用,以确定哪些信号在当前的增量周期中有交易:
process(a, b) is
begin
if a'transaction'event then
report "Transaction on a";
end if;
if b'transaction'event then
report "Transaction on b";
end if;
end process;
'transaction
属性创建一个bit类型的新信号,用于切换每个事务。该信号的'event
属性可识别父信号上发生的任何事务。
您还可以使用not <signal name>'quiet(0 ns)
来确定自上次执行以来灵敏度列表中哪些信号发生了交易:
process(a, b) is
begin
if not a'quiet(0 ns) then
report "Transaction on a";
end if;
if not b'quiet(0 ns) then
report "Transaction on b";
end if;
end process;
如果您不想处理在不同delta周期中发生的事件的排序,后者可能会更有用。
答案 1 :(得分:0)
这里有两个VHDL概念:
交易:在模拟周期(时间和增量周期)为信号分配值
事件:导致信号值发生变化的交易(分配)
因此,每次分配给该信号时,信号都会发生交易,但是 甚至只有在分配实际改变信号值时才会发生。
VHDL具有以下相关属性:
S'active
:如果在模拟周期中发生了事务,则为布尔值为
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;
这将驱动信号,如下所示。请注意,ModelSims“扩展了时间 “增量模式”已用于显示增量周期期间的信号变化:
来自进程alfa的报告输出(初始运行0 ps除外)是:
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
来自过程bravo的报告输出(初始运行0 ps除外)是:
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
因此,可以看出,仅在1 ns delta 2的a
的事务信号更改仅由进程bravo中的事务检查报告,并且没有与之关联的事件
此
答案 2 :(得分:0)
@Morten,所以使用事件和事务我甚至可以捕获我连续向信号发送相同值的实例。 如示例所示:
a&lt; = 0; - 声明为自然
b <= 0;
等待1 ns;
a&lt; = 1; - 事务和事件@ 1 ns 1 delta
等等0秒; - Delta延迟a&lt; = 1; - 只有事务,但没有事件@ 1 ns 2 delta
等等0秒; - Delta延迟在此行中,您可以为信号分配相同的值&#39; 39>
a&lt; = 1; - 只有事务,但没有事件@ 1 ns 2 delta
我的假设是您可以捕获事务,其中transaction = 1,event = 0。
这很好,但是,在FPGA中合成时仍然会出现这种情况吗?