当使用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生成的不同代码?
答案 0 :(得分:2)
如果变量的大小相等,加法器不关心符号,由于溢出位,加法将是正确的。 但随着乘法,我们必须知道管理它的标志。
有关更多信息,请参阅有关verilog中已签名算术的文档: enter link description here
答案 1 :(得分:0)
如果您使用+&那么Addr.io.out的宽度将是17位
并且在verilog中,这个Addr不会像FabienM所说的那样关心标志,因为它将由上层设计处理,如无符号到有符号变换然后连接到这个Addr,它将被转换为2 - 补充形式。