1

当使用 SInt 和 UInt 实现加法器时,我得到相同的 Verilog 代码,请参见下面的代码,

import Chisel._

class Unsigned_Adder extends Module{ 
  val io = new Bundle{
    val a =      UInt(INPUT, 16)
    val b =      UInt(INPUT, 16)
    val out =    UInt(OUTPUT)
  }
  io.out := io.a + io.b
}

 import Chisel._

class Signed_Adder extends Module{ 
  val io = new Bundle{
    val a =      SInt(INPUT, 16)
    val b =      SInt(INPUT, 16)
    val out =    SInt(OUTPUT)
  }
  io.out := io.a + io.b
}

这将生成相同的 Verilog 代码,

module Signed_Adder(
    input [15:0] io_a,
    input [15:0] io_b,
    output[15:0] io_out
);

  wire[15:0] T0;


  assign io_out = T0;
  assign T0 = io_a + io_b;
endmodule

当然,模块名称会有所不同。使用乘法运算符 (*) 在凿子中实现乘法器时

io.out := io.a * io.b  

我将为 UInt 和 SInt 获得不同的 Verilog 代码,在 SInt 中代码看起来像,

module Multi(
    input [15:0] io_a,
    input [15:0] io_b,
    output[31:0] io_out
);

  wire[31:0] T0;


  assign io_out = T0;
  assign T0 = $signed(io_a) * $signed(io_b);
endmodule

添加$signed到代码中。这是为什么?为什么在加法情况下我得到相同的 Verilog 代码,但在乘法情况下我得到为 UInt 和 SInt 生成的不同代码?

4

2 回答 2

2

加法如果变量的大小相等,加法器不关心符号,由于溢出位,加法将是正确的。但是对于乘法,我们必须知道符号来管理它。

有关更多信息,请参阅有关 verilog 中带符号算术的文档: 在此处输入链接描述

于 2016-09-16T07:24:53.910 回答
0

如果你使用 +& 那么 Addr.io.out 的宽度将为 17 位

并且在verilog中,这个Addr不会像FabienM所说的那样关心符号,因为它将由上层设计处理,如无符号到有符号变换,然后连接到这个Addr,它将被转换为2-补码形式。

于 2017-06-29T09:51:11.067 回答