在非时钟信号上使用'事件属性'是不好的做法吗?

时间:2018-11-09 09:01:06

标签: vhdl fpga

有一个类似的问题here,并用

回答。
  

是的,rising_edge()/falling_edge()仅应用于时钟   信号。尽管它在仿真中起作用,但可能会导致问题和   综合中意想不到的硬件。

使用'event属性来检测非时钟信号的边沿是否一样,如以下示例所示,是否一样?

process (rndm_sig)
begin
    if (rndm_sig'event and rndm_sig = 1) then
    -- do something.
    end if;
end process;

1 个答案:

答案 0 :(得分:5)

综合工具会将任何用作X'event and X= 1rising_edge.(X)的信号视为时钟。

在FPGA中,这意味着路由工具将尝试为信号分配专用的时钟网,其中包含所有内容。例如该信号必须路由到专用时钟输入,这可能导致明显的延迟和与其他信号的偏差。

此外,信号最好“干净”。这意味着如果信号上出现最小的尖峰,则FF将计时。这也意味着,如果您的信号不干净,则某些FF可能会触发,而有些则不会。

计时工具将需要知道周期和高/低时间,并尝试使设置和保持时间与所有其他时钟相对应。这可能会导致重大问题和/或设计中的额外逻辑。如果信号与其他时钟完全不同步,则可能具有元稳定性,并且可能需要在时钟寄存器之后添加同步器。

因此可以归结为:强烈建议 强烈建议 X'event and X= 1rising_edge.(X)构造仅使用“真实”时钟信号。

同时,数字设计中有一条规则说:如果没有其他解决方案,所有规则都将被淘汰。

在我来自ASIC的行业中,您在打破基本规则之前必须与一些高级设计师交谈。然后,您必须在代码周围添加一些强调的大注释,说明”“是的,这违反了规则,但没有其他方法,因为我们拥有此,此,此并且它已经由X和Y进行了审查和签名” / em>是的,我曾经在设计中使用过闩锁。