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 で異なるコードが生成されるのはなぜですか?