我有一个旧的 VHDL 代码,我需要使用 Modelsim 运行模拟。该代码“包括”扭曲条件,该条件在实际硬件中没有影响,但在模拟中失败。 我知道这不应该这样写,因为实现取决于综合工具,但它是 20 年前写的,我现在必须处理它...... 在状态机内,下一个状态由从预加载值减少到 0 的信号值确定。不幸的是,减量线不在 If then else 语句内,因此“bitcounter”在为零时也会减少。环绕值不用于代码中的任何内容(在“稍后”状态之一,信号再次预加载),因此硬件中一切都很好。
信号定义: 位计数器:整数范围 0 到 11;
有问题的代码片段
进程(时钟) 开始 如果上升沿(时钟) 然后
案例状态是 当....
...
当 GET_DATA_2 =>
IF(位计数器 = 0)
然后
状态 <= LAST_CYCLES_HIGH;
别的
状态 <= GET_DATA1;
END IF;
Bitcounter <= Bitcounter-1; ...
Modelsim 失败,因为位计数器递减至 -1
是否有任何选项可以通过模拟命令来补偿此错误代码,或者通过将“-1”声明为“允许”(扩展“在 Modelsim 端”的范围)或抑制模拟中的此特定错误?
虽然最简单的方法肯定是更改 VHDL 代码,但这最终会导致不同的配置数据,这是应该避免的......
这段代码曾经运行过吗?如果是这样,正如评论所暗示的那样,它可能是在没有范围检查的情况下运行的。
注意 Modelsim 不会“失败”;您只是收到一个断言错误,表明该值现在超出了范围。这就是范围的工作原理:没有隐含的模算术;这只是一张支票。如果您不喜欢这样,请删除子类型声明(
range
)并仅使用普通的integer
。然而,最初的设计者想必使用该范围是有原因的,因此最好修复递减操作,以便它首先检查值是否为零,然后换行为 11(或 Bitcounter'high
)。
请注意,如果
Bitcounter
实际上是综合的,您应该保留范围并修复减量。