Verilog 操作意外结果

Verilog operation unexpected result

我正在学习verilog语言并遇到问题。

integer intA;
...
intA = - 4'd12 / 3; // expression result is 1431655761.
                    // -4’d12 is effectively a 32-bit reg data type

这个来自标准的片段让我们大吃一惊。标准说 4d12 - 是一个 4 位数字 1100。 那么-4d12 = 0100。现在好了。

要执行除法,我们需要使数字大小相同。 4 到 32 位。位数-4'd12 - 是无符号的,那么它应该等于32'b0000...0100,但它等于32'b1111...10100。不行,但下一步。

我的除法版本:-4d12 / 3 = 32'b0000...0100 / 32'b0000...0011 = 1

标准版:- 4'd12 / 3 = 1431655761

谁能告诉我为什么?为什么4位数字保留额外的位?

您需要阅读 1800-2012 LRM 的 11.8.2 表达式计算步骤 部分。您缺少的关键部分是操作数是 4'd12 并且在应用一元 - 运算符之前将其大小设置为 32 位作为无符号值。

如果你想把4位值当作有符号的-3,那么你需要这样写

intA = - 4'sd12 / 3 // result is 1

此处解析器将 -'d12 解释为 32 位数字,最初是无符号的,负号将导致位取反。所以结果是

('d12) 的否定= (28 个零 + 1100) 的否定= 28ones+2zeros+2ones = 11111111111111111111111111110011. 输出为 4294967283 。如果将此数字 (4294967283) 除以 3,则答案为 1,431,655,761。

保持微笑:)