Chisel:Verilog为Sint和UInt生成代码

时间:2016-09-15 17:54:07

标签: chisel

当使用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生成的不同代码?

2 个答案:

答案 0 :(得分:2)

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

有关更多信息,请参阅有关verilog中已签名算术的文档: enter link description here

答案 1 :(得分:0)

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

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