奇数VHDL问题:rising_edge(CLK)未触发

tra*_*res 3 vhdl

我有一个大型模拟测试平台,它正在运行两个Kintex Ultrascale FPGA之间的接口.我遇到了最奇怪的问题:我无法触发rising_edge(CLK)语句.

设计中有多个这样的实例:我将追溯逻辑路径,最后发现一个没有触发的rising_edge(无论如何).

下面是踢球者:用CLK'EVENT替换rising_edge并且CLK ='1'会导致逻辑正确触发,但是我无法通过一千个源文件来替换它们然后将它推送到团队回购 - 那个' d是荒谬的(加上代码是有效的,并且已被多次使用,因此进行类似的更改将浪费大量时间).

rising_edge也相当于CLK'LAST ='0'和CLK'EVENT以及CLK ='1' - 此语句也不会触发.所以一定不能满足CLK'LAST ='0',对吧?(如果CLK'EVENT和CLK ='1'触发,并且CLK'LAST ='0'的添加不会触发,那么它必须是导致问题的最后一个项目).

但是,我看看delta-view,我看不到介于0和1之间的中间值 - 没有中间的高Z状态,没有未定义的信号,没有.它看起来很完美.

我用几个不同的Modelsim版本测试了这个结果,结果相同(只是为了确保它不是一个工具回归).

世界上有什么可能导致这种情况?

我唯一可以想到的是非标准的是我使用外部名称来驱动层次结构中的几层时钟/数据,但是他们正在将预期值更新到波形窗口.

使用外部名称强制值会以某种方式导致边缘被遗漏,即使信号看起来正确(甚至下降到增量?)或是否会导致某种波形窗口差异?是什么导致CLK'LAST有效丢失?

谢谢大家!

Ren*_*let 6

如果类型CLK不是bit,例如,如果是std_ulogicstd_logic否,rising_edge(CLK)则不等同于:

CLK'EVENT and CLK='1'
Run Code Online (Sandbox Code Playgroud)

要么:

CLK'LAST='0' and CLK'EVENT and CLK='1'
Run Code Online (Sandbox Code Playgroud)

rising_edge(CLK)也包括'L''H'; 它从任何过渡返回true '0''L''1''H'.也就是说,任何:

'L' -> 'H'
'L' -> '1'
'0' -> 'H'
'0' -> '1'
Run Code Online (Sandbox Code Playgroud)

虽然CLK'EVENT and CLK='1'对以下任何一个评估为真:

'U' -> '1'
'X' -> '1'
'0' -> '1'
'Z' -> '1'
'W' -> '1'
'L' -> '1'
'H' -> '1'
'-' -> '1'
Run Code Online (Sandbox Code Playgroud)

因此,从一个过渡'H''1',例如,不是一个上升的边缘,rising_edge(CLK)但它是一个CLK'EVENT and CLK='1'.而且,相反,从'0'到的过渡'H'是一个上升的边缘,rising_edge(CLK)但不是CLK'EVENT and CLK='1'.

此问题的另一个潜在原因是不太可能:您正在使用该rising_edge功能的自定义版本...