【问题标题】:System Verilog subtraction removing important bits系统 Verilog 减法去除重要位
【发布时间】:2018-06-18 20:08:20
【问题描述】:

我有两个 32 位数字的简单减法,我知道这永远不会产生大于 25 位的数字。详细说明我的设计后,发现该工具 (Xilinx Vivado 2018.1) 已将输入寄存器缩减为 25 位,这将导致计算出不正确的值。

logic [31:0] ain;
logic [31:0] bin;
logic [24:0] cout;

assign cout = ain - bin;

这会导致精心设计的 rtl_sub 像这样...

在参考了 LRM 和有关该主题的其他一些问题后,我觉得这应该通过减去两个较大的数字然后截断结果来工作,但也许我误解了编码规则?

我也试过这个也没用

assign cout = 32'(ain - bin);

有人可以推荐最合适的编码方式吗?

【问题讨论】:

  • 如果结果只有25位,高7位对结果没有影响,所以结果是正确的。如果您使用有符号值,可能会有所不同。
  • 请确认:数字可以是32位,但ainbin之间存在相关性,所以减法的结果总是
  • 是的,根据设计,我知道 ain - bin 的结果永远不会超过可以容纳 25 位的数字。
  • 正如@HansLehnert 所说:在这种情况下,当数字出现在减法器的输入端时,MS 位必须相同,因此可以忽略。那么“这将导致计算不正确的值”在哪里。从哪里来?
  • 给我们一个错误结果的例子

标签: verilog system-verilog xilinx hdl vivado


【解决方案1】:

2 的补码减法

C = A -B

一样
C = A + ~B + 1

位 [31:25] 不会对位 [24:0] 的结果产生影响。也许您对适合 25 位的答案的假设是不正确的。

【讨论】:

  • 我开始意识到,是的,位 [31:25] 确实无关紧要,精心设计的设计是正确的。谢谢大家澄清这个问题,我想我已经很久没有练习基本的二进制数学了。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-04-17
  • 1970-01-01
  • 1970-01-01
  • 2019-09-04
  • 1970-01-01
相关资源
最近更新 更多