組み込み屋の為のVerilog入門 その3

しつこくも その3である。
入門というか、私がやり始めたころの嵌りネタ特集と化している。
VerilogはC言語と文法が近く、C言語からの転向組みにはまあやさしいといえばやさしい。
で、CにあってVerilogで弱いもの。
キャストである。

32bitを乗算して上位ワードがほしい場合

module shift(
input [31:0] in0,
input [31:0] in1,
output [31:0] out
);
assign out = (in0 * in1) >> 32;
endmodule

などと書こうものなら問答無用で最適化されて回路が消滅する。
Verilogでは、式の中のもっともbit幅が多いものに計算サイズが合わせられる。
上の例では、32bitが最大であるから、ものの見事にシフト結果は0固定となる。

ではどうするか?

assign out = ({32’d0, in0} * in1) >> 32;

とりあえずこんな感じでbit幅を増やして逃げておくしかない。イマイチ美しくないのである。

コメント

タイトルとURLをコピーしました