module test;
reg [3:0]a;
initial
begin
a= -4'b1100 / 6;
$display(a);
end
endmodule
为什么输出是8?
我在 EDA 游乐场中尝试了这段代码,我得到的 o/p 为 8。我无法理解其背后的逻辑。请帮我解决这个问题
Verilog 中的除法是上下文确定的运算符。
操作数的大小和符号根据 Verilog 的上下文确定规则进行修改。
参见:
数字 6 是一个无符号的 Verilog 文字,它会导致所有操作数扩展为 32 位,并将 RHS 视为无符号。
分子从零扩展到 32 位:
0000_0000_0000_0000 0000_0000_0000_1100
然后负号取 2 的补码
1111_1111_1111_1111 1111_1111_1111_0011
这是 ffff_fff3
Verilog 还将 LHS 的内部表示扩展到 32 位。
要了解这是如何工作的,让我们使用您的代码并更改操作数
看起来像 Verilog 将它们更改为的样子。让我们将 32 位值显示为
二进制。
module test;
reg [31:0]a;
initial
begin
a= 32'hffff_fff3 / 32'd6;
$display("%b, %d", a,a[3:0]);
end
endmodule
产品
00101010101010101010101010101000, 8
为什么我得了8
值 8 由 LHS 的 4 个 LSB 生成,在您的示例中,前 27 位被截断,因为您将 LHS 定义为 4 位。
让我们重新编写您的文章以执行 4 位除法,将所有操作数更改为 4 位,带符号:
module test;
reg signed [3:0] a;
initial
begin
// minus 4 divided by 6 = 0
a= 4'sb1100/ 4'sd6;
$display("%b, %d", a,a);
//
// minus 4 divided by 1 = -4
a= 4'sb1100/ 4'sd1;
$display("%b, %d", a,a);
end
endmodule
产品
0000, 0
1100, -4