Verilog操作意外结果

时间:2016-06-17 14:02:02

标签: verilog

我正在学习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位数会保留额外的位?

1 个答案:

答案 0 :(得分:4)

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

如果您希望将4位值视为有符号-3,则需要编写

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