奇怪的VHDL问题:rising_edge(CLK)不触发

时间:2018-12-04 09:50:10

标签: vhdl

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

在设计中有多个实例:我将查找逻辑路径,最后发现一个不会触发的上升边缘(无论如何)。

这是关键所在:用CLK'EVENT和CLK ='1'替换rise_edge会导致逻辑正确触发,但是我无法浏览一千个源文件来全部替换它们,然后将其推送到团队仓库-这是荒谬的(加上代码是有效的,并且已经被多次使用,因此进行这样的更改将浪费大量时间)。

上升沿也等于CLK'LAST ='0'和CLK'EVENT和CLK ='1'-此语句也不会触发。因此必须满足CLK'LAST ='0',对吗? (如果触发了CLK'EVENT和CLK ='1',并且未触发CLK'LAST ='0',则必须是导致问题的最后一项)。

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

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

到底是什么原因造成的?

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

使用外部名称强制值会导致边沿丢失,即使信号看起来正确(甚至向下变化),还是会导致某种形式的波形窗口差异?是什么导致CLK'LAST有效丢失?

谢谢!

2 个答案:

答案 0 :(得分:6)

如果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''L''1''H'的任何转换都返回true。也就是说,以下任何一项:

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

CLK'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函数的自定义版本...

答案 1 :(得分:1)

我假设您正在这些分层信号上使用VHDL force。如果是这样,我在使用ModelSim时遇到了相同的问题。我不确定这是否与ModelSim对VHDL-2008的支持实现有关。

找到这个后,我通常通过TCL宏而不是VHDL使用ModelSim force命令,因为ModelSim命令的行为似乎更具可预测性(包括被rising/falling_edge()识别),并且(可供参考的IEEE 1076)我相信它比VHDL版本支持更多选项。