昔signedとかないVerilog 95での開発していた時、符号付き演算をどうしていたかを残しておこうと思う。
さすがに現代においてVerilog 95縛りで開発とかはないと思うのであまり需要はないかもしれないけど何かの参考になればと思う。
verilog95で符号付き演算
module mult (a, b, out);
input a, b;
output out;
wire[ 7:0] a, b;
wire[15:0] out;
integer int_a, int_b;
always(a) int_a = {24{a[7]}, a};
always(b) int_b = {24{b[7]}, b};
assign out = int_a*int_b;
endmodule
と、こんな感じで32ビットに拡張してintegerで符号付き演算ができる。integerがsigned(最上位ビットが符合ビット)だからである。ビット拡張で32ビットの巨大乗算器になってしまわないか心配になるかと思うけどそこは大丈夫。コンパイラがきちんと入出力のビット幅を見て適切なビットサイズの乗算器にしてくれます。わざわざ最上位ビットでif文で分けて…みたいな事をするよりよっぽど効率の良い回路になる。
さすがに最近の開発ではsigned使うだろうと思っていたら、つい最近signed使わずに正に最上位ビットを見て絶対値算出して、演算して、符号を戻して…とやっている人がいた。signed使わないのならせめてこの記事のようにintergerで符号計算してね。こんな記事書いても参考にならないだろうなと思っていたがまだまだ参考になる事もあるのね。。。