首页 > 解决方案 > 奇怪的 VHDL 问题:rising_edge(CLK) 未触发

问题描述

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

在设计中有多个这样的例子:我将追踪一条逻辑路径,最终发现一个没有触发的上升沿(随便)。

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

上升沿也等效于 CLK'LAST='0' 和 CLK'EVENT 和 CLK='1' - 此语句也不会触发。所以肯定是不满足CLK'LAST='0'吧?(如果 CLK'EVENT 和 CLK='1' 触发,并且 CLK'LAST='0' 的添加没有触发,那么它一定是导致问题的最后一项)。

但是,我查看增量视图,我看不到 0 和 1 之间的中间值 - 没有中间的高阻态,没有未定义的信号,什么也没有。它看起来很完美。

我已经用几个不同的 Modelsim 版本对此进行了测试,结果相同(只是为了确保它不是工具回归)。

到底是什么导致了这种情况?

我能想到的唯一不标准的事情是我使用外部名称将时钟/数据驱动到层次结构的几层,但它们正在将预期值更新到波形窗口。

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

谢谢大家!

标签: vhdl

解决方案


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

CLK'EVENT and CLK='1'

或者:

CLK'LAST='0' and CLK'EVENT and CLK='1'

rising_edge(CLK)还涉及'L''H''0'对于从or'L''1'or的任何转换,它都返回 true 'H'。也就是说,任何一个:

'L' -> 'H'
'L' -> '1'
'0' -> 'H'
'0' -> '1'

WhileCLK'EVENT and CLK='1'对以下任何一项评估为真:

'U' -> '1'
'X' -> '1'
'0' -> '1'
'Z' -> '1'
'W' -> '1'
'L' -> '1'
'H' -> '1'
'-' -> '1'

例如,从'H'到的转换'1'不是 的上升沿,rising_edge(CLK)而是的上升沿CLK'EVENT and CLK='1'。而且,相反,从'0'到的转变'H'是上升沿,rising_edge(CLK)但不是CLK'EVENT and CLK='1'

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


推荐阅读