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