【问题标题】:Using Subtraction in a Conditional Statement in Verilog在 Verilog 的条件语句中使用减法
【发布时间】:2017-12-06 02:16:52
【问题描述】:

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

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

包含这种类型行的文件将被编译,但isinbufferzone 不会在它应该变高的时候变高。我假设它对条件中的减法不满意。我可以通过移动东西来使模块工作,但结果比我认为的要复杂得多,并且延迟确实开始增加。有人对最简洁的方法有什么想法吗?预先感谢您的帮助。

【问题讨论】:

  • x ? 1 : 0 只是x
  • isinbufferzoneapacketlength 是如何声明的?
  • 您好,感谢您的回复。 Isinbufferzone 是一条线,a 和 packetlength 是 17 位宽 regs
  • 我在iverilog.com 在线模拟器中试过这个,它可以工作。条件语句中的算术工作得很好。也许在这个语句之前做减法,看看它是否能在没有太多延迟的情况下工作?
  • @Qazi 当然,减法有效,但如果packetlength 小于 16384,它就会溢出。

标签: conditional verilog


【解决方案1】:

如果 packetlength 为 16384 或更小,无论 a 是什么,您可能预计 isinbufferzone 会变高,但事实并非如此。

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

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

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

【讨论】:

  • 感谢您的详细回复,这最终很好地回答了我的问题。我想我很快就知道,如果我认为存在语法错误,那实际上可能是设计的概念问题。
猜你喜欢
  • 2016-02-28
  • 2015-08-16
  • 1970-01-01
  • 2019-06-11
  • 1970-01-01
  • 2021-02-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多