Главный смысл: все операнды и результат должны быть signed.
Сложение. При сложении двух чисел с базой N, получившиеся число будет иметь базу N+1.
Exported from Notepad++ 
Умножение. При умножении двух чисел с базой N, получившееся число будет иметь базу 2*N.
Exported from Notepad++ 
Сложение. При сложении двух чисел с базой N, получившиеся число будет иметь базу N+1.
module main(
    );
parameter N = 8;
reg     signed  [ N-1:  0 ] a = {1'b0, {(N-1){1'b1}}}; //127
reg     signed  [ N-1:  0 ] b = {1'b1, {(N-1){1'b0}}}; //-128
wire    signed  [  N :  0 ] sum = a + b; //-1
wire    signed  [  N :  0 ] dif = a - b; //255
wire    signed  [  N :  0 ] min = b + b; //-256
wire    signed  [  N :  0 ] max = a + a; //254
endmodule
Умножение. При умножении двух чисел с базой N, получившееся число будет иметь базу 2*N.
module main(
    );
parameter N = 8;
reg     signed  [ N-1:  0 ] a = {1'b0, {(N-1){1'b1}}}; //127
reg     signed  [ N-1:  0 ] b = {1'b1, {(N-1){1'b0}}}; //-128
wire    signed  [2*N-1: 0 ] ab = a * b; //-16256
wire    signed  [2*N-1: 0 ] a2 = a * a; //16129
wire    signed  [2*N-1: 0 ] b2 = b * b; //16384
endmodule