对带符号数来源有多种,模块外部接入,模块内部运算时定义,无符号数要参与有符号数的运算等等。相对应的定义带符号数有多种方式。
1.外部接口输入定义
module calc_op
#( parameter DW = 32 ,
...
)
(
...
input wire signed [DW -1: 0] dat_0;
...
);
...
endmodule
2.第2种方式在模块内部定义
wire signed [7:0] a0;
reg signed [7:0] b0;
3.第3种方式在运算中强制
wire [7 : 0] a0;
wire signed [7 : 0] b0;
wire signed [15:0] b ;
如直接写:
assign b = a0*b0 ;
毫无疑问运算结果就是错误的。如果知道a0是有符号数那就必须像定义b0那样定义a0,如确定a0是无符号数,那就按照下面方式写:
assign b = $signed({1'b0,a0}) * b0 ;
参与运算的变量都需要是带符号的,结果也是需要带符号的。