在 Verilog 的条件语句中使用减法

Using Subtraction in a Conditional Statement in Verilog

我对 Verilog 比较陌生,我一直在从事一个项目,在理想情况下,我希望有一个赋值语句,如:

assign isinbufferzone = a > (packetlength-16384) ? 1:0;

包含此类行的文件将编译,但 isinbufferzone 没有在应该的时候变高。我假设它不喜欢在条件中进行减法。我可以通过四处移动东西来使模块工作,但结果比我想象的要复杂得多,而且延迟真的开始增加。有没有人对最简洁的方法是什么有任何想法?预先感谢您的帮助。

如果 packetlength 为 16384 或更低,您可能期望 isinbufferzone 走高,而不管 a,但事实并非如此。

如果packetlength小于16384,值packetlength - 16384不是负数-X,而是某个非常大的正数(可能是2 32X, 或 217X,我不太确定是哪一个,但没关系),因为 Verilog 默认执行无符号算术。这叫做integer overflow.

您可以尝试通过将一些信号声明为 signed 来解决此问题,但我认为最安全的方法是显式处理溢出情况并确保仅对 [=12] 计算减法结果=] 16384 或更大的值:

assign isinbufferzone = (packetlength < 16384) ? 1 : (a > packetlength - 16384);