При использовании 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
Я получу другой код Verilog для UInt и SInt, где в 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?