在 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 32 − X, 或 217 − X,我不太确定是哪一个,但没关系),因为 Verilog 默认执行无符号算术。这叫做integer overflow.
您可以尝试通过将一些信号声明为 signed
来解决此问题,但我认为最安全的方法是显式处理溢出情况并确保仅对 [=12] 计算减法结果=] 16384 或更大的值:
assign isinbufferzone = (packetlength < 16384) ? 1 : (a > packetlength - 16384);
我对 Verilog 比较陌生,我一直在从事一个项目,在理想情况下,我希望有一个赋值语句,如:
assign isinbufferzone = a > (packetlength-16384) ? 1:0;
包含此类行的文件将编译,但 isinbufferzone
没有在应该的时候变高。我假设它不喜欢在条件中进行减法。我可以通过四处移动东西来使模块工作,但结果比我想象的要复杂得多,而且延迟真的开始增加。有没有人对最简洁的方法是什么有任何想法?预先感谢您的帮助。
如果 packetlength
为 16384 或更低,您可能期望 isinbufferzone
走高,而不管 a
,但事实并非如此。
如果packetlength
小于16384,值packetlength - 16384
不是负数-X,而是某个非常大的正数(可能是2 32 − X, 或 217 − X,我不太确定是哪一个,但没关系),因为 Verilog 默认执行无符号算术。这叫做integer overflow.
您可以尝试通过将一些信号声明为 signed
来解决此问题,但我认为最安全的方法是显式处理溢出情况并确保仅对 [=12] 计算减法结果=] 16384 或更大的值:
assign isinbufferzone = (packetlength < 16384) ? 1 : (a > packetlength - 16384);