vhdl - 奇怪的 VHDL 问题 : rising_edge(CLK) not firing

标签 vhdl

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

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

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

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

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

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

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

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

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

谢谢大家!

最佳答案

如果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 和 CLK='1' 之一。而且,相反,从 '0''H' 的转换是 rising_edge(CLK) 的上升沿,但对于 不是CLK'EVENT 和 CLK='1'.

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

关于vhdl - 奇怪的 VHDL 问题 : rising_edge(CLK) not firing,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53610031/

相关文章:

vhdl - 在 vhdl 中将 sfixed 转换为 std_logic_vector 的正确方法是什么?

将实数转换为十六进制单精度表示并再次返回的 Matlab 函数/脚本

vhdl - Windows 中的轻量级 VHDL 模拟器

testing - 在不同级别上测试FPGA设计

compiler-errors - 初学者的 VHDL 错误

VHDL:通过同步读取推断单端口 ram 的正确方法

file - VHDL:缺少以下文件:.stx、.ncd、.xrpt

process - VHDL - process() 什么时候第一次运行?

vhdl - 如何计算 FPGA spartan 板上的按键数

compiler-errors - VHDL错误:Pack:2811 - Directed packing was unable to obey the user design