Verilog - 负数除法

问题描述 投票:0回答:2
module test;
    reg [3:0]a;
        initial 
        begin
            a= -4'b1100 / 6;
            $display(a);
        end
endmodule

为什么输出是8?

我在 EDA 游乐场中尝试了这段代码,我得到的 o/p 为 8。我无法理解其背后的逻辑。请帮我解决这个问题

verilog
2个回答
0
投票

因为

a
是一个无符号变量——它的值永远不会被视为负数。

参见 有符号二进制乘法和有符号二进制除法


0
投票

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
© www.soinside.com 2019 - 2024. All rights reserved.