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 に答える