しつこくも その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幅を増やして逃げておくしかない。イマイチ美しくないのである。
コメント