當使用聖馬丁和uint實現加法器我得到同樣的Verilog代碼,請參見下面的代碼,鑿:Verilog的生成代碼聖馬丁和uint
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和聖馬丁,凡在聖馬丁的代碼會看起來像一個不同的Verilog代碼,
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生成了不同的代碼?