3.3 signed operation
3.3.1 Difference between signed and unsigned operation in multiplier
Let's see an example.
`define DIFF_CHECK
module signed_mul_test;
parameter integer width=3;
parameter integer mul_width=width*2;
integer i,j;
reg signed [width-1:0] as,bs;
reg [width-1:0] a,b;
reg [mul_width-1:0] mul;
reg signed [mul_width-1:0] muls;
wire [mul_width-1:0] mulw=a*b;
wire signed [mul_width-1:0] mulws=as*bs;
initial begin
for (i=0;i<2**width-1;i=i+1) begin
a=i;
as=i;
for (j=0;j<2**width-1;j=j+1) begin
b=j;
bs=j;
mul=a*b;
muls=as*bs;
#10;
`ifdef DIFF_CHECK
if (mul !=muls) begin
$display("Unsigned a =%d[%b] b =%d[%b] mul =%d[%b] ",a,a,b,b,mul,mul);
$display("Signed as=%d[%b] bs=%d[%b] muls=%d[%b] ",as,as,bs,bs,muls,muls);
$display("");
end
`endif
if (mul !=mulw) $display("Fail");
if (muls !=mulws) $display("Fail");
end
end
end
endmodule
Here is a result.
Unsigned a =1[001] b =4[100] mul = 4[000100] Signed as= 1[001] bs=-4[100] muls= -4[111100] Unsigned a =1[001] b =5[101] mul = 5[000101] Signed as= 1[001] bs=-3[101] muls= -3[111101] Unsigned a =1[001] b =6[110] mul = 6[000110] Signed as= 1[001] bs=-2[110] muls= -2[111110] Unsigned a =2[010] b =4[100] mul = 8[001000] Signed as= 2[010] bs=-4[100] muls= -8[111000] Unsigned a =2[010] b =5[101] mul =10[001010] Signed as= 2[010] bs=-3[101] muls= -6[111010] Unsigned a =2[010] b =6[110] mul =12[001100] Signed as= 2[010] bs=-2[110] muls= -4[111100] Unsigned a =3[011] b =4[100] mul =12[001100] Signed as= 3[011] bs=-4[100] muls=-12[110100] Unsigned a =3[011] b =5[101] mul =15[001111] Signed as= 3[011] bs=-3[101] muls= -9[110111] Unsigned a =3[011] b =6[110] mul =18[010010] Signed as= 3[011] bs=-2[110] muls= -6[111010] Unsigned a =4[100] b =1[001] mul = 4[000100] Signed as=-4[100] bs= 1[001] muls= -4[111100] Unsigned a =4[100] b =2[010] mul = 8[001000] Signed as=-4[100] bs= 2[010] muls= -8[111000] Unsigned a =4[100] b =3[011] mul =12[001100] Signed as=-4[100] bs= 3[011] muls=-12[110100] Unsigned a =4[100] b =5[101] mul =20[010100] Signed as=-4[100] bs=-3[101] muls= 12[001100] Unsigned a =4[100] b =6[110] mul =24[011000] Signed as=-4[100] bs=-2[110] muls= 8[001000] Unsigned a =5[101] b =1[001] mul = 5[000101] Signed as=-3[101] bs= 1[001] muls= -3[111101] Unsigned a =5[101] b =2[010] mul =10[001010] Signed as=-3[101] bs= 2[010] muls= -6[111010] Unsigned a =5[101] b =3[011] mul =15[001111] Signed as=-3[101] bs= 3[011] muls= -9[110111] Unsigned a =5[101] b =4[100] mul =20[010100] Signed as=-3[101] bs=-4[100] muls= 12[001100] Unsigned a =5[101] b =5[101] mul =25[011001] Signed as=-3[101] bs=-3[101] muls= 9[001001] Unsigned a =5[101] b =6[110] mul =30[011110] Signed as=-3[101] bs=-2[110] muls= 6[000110] Unsigned a =6[110] b =1[001] mul = 6[000110] Signed as=-2[110] bs= 1[001] muls= -2[111110] Unsigned a =6[110] b =2[010] mul =12[001100] Signed as=-2[110] bs= 2[010] muls= -4[111100] Unsigned a =6[110] b =3[011] mul =18[010010] Signed as=-2[110] bs= 3[011] muls= -6[111010] Unsigned a =6[110] b =4[100] mul =24[011000] Signed as=-2[110] bs=-4[100] muls= 8[001000] Unsigned a =6[110] b =5[101] mul =30[011110] Signed as=-2[110] bs=-3[101] muls= 6[000110] Unsigned a =6[110] b =6[110] mul =36[100100] Signed as=-2[110] bs=-2[110] muls= 4[000100]
When MSB is 1, signed and unsigned operations will make different result.