【问题标题】:Chisel: Verilog generated code for Sint and UIntChisel:Verilog 为 Sint 和 UInt 生成的代码
【发布时间】:2016-09-15 17:54:07
【问题描述】:

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

【问题讨论】:

    标签: chisel


    【解决方案1】:

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

    有关更多信息,请参阅有关 verilog 中带符号算术的文档: enter link description here

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-02-09
        • 2013-05-08
        • 2014-03-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-02-15
        • 2016-09-06
        相关资源
        最近更新 更多