【发布时间】: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;
在参考了 LRM 和有关该主题的其他一些问题后,我觉得这应该通过减去两个较大的数字然后截断结果来工作,但也许我误解了编码规则?
我也试过这个也没用
assign cout = 32'(ain - bin);
有人可以推荐最合适的编码方式吗?
【问题讨论】:
-
如果结果只有25位,高7位对结果没有影响,所以结果是正确的。如果您使用有符号值,可能会有所不同。
-
请确认:数字可以是32位,但
ain和bin之间存在相关性,所以减法的结果总是 -
是的,根据设计,我知道 ain - bin 的结果永远不会超过可以容纳 25 位的数字。
-
正如@HansLehnert 所说:在这种情况下,当数字出现在减法器的输入端时,MS 位必须相同,因此可以忽略。那么“这将导致计算不正确的值”在哪里。从哪里来?
-
给我们一个错误结果的例子
标签: verilog system-verilog xilinx hdl vivado