Verilogの論理式の書き方
ここでVerilogの論理式の書き方をまとめておく。C言語と似ているのでマニュアルを見なくても大体想像がつくが、ハードウェアを記述するためにビット単位の書き方になっている点が特徴である。
■変数
・ reg変数でもwire変数でも必ずビット幅を指定して宣言する。
・ reg[7:0] a; は8ビットの変数aの宣言。(要素8個の配列という意味ではない)
MSBがビット7でLSBがビット0であることを示す。
・ reg b; は1ビットの変数の宣言。reg[0:0] b;と書いてもよいが普通は書かない。
・ a[4:1]は変数aのビット4からビット1までを抜き出した4ビット変数を示す。
・ a[3]は変数aのビット3を抜き出した1ビット変数を示す。
■定数
・ reg変数、wire変数が取りうる値は
0: Low
1: High
x: 不定
z: ハイインピーダンス(HiZ)
ただし現実のFFはHiZにはならないので、zはwire変数だけ
・ 形式は <ビット幅>’<基数><数値>
・ ビット幅を省略すると32ビット、基数を省略すると10進数と見なされる。
・ 桁を見やすくするため数値の途中にアンダースコア( _ )を入れてもよい。
・ 数値で省略した上位ビットは0と見なされるが、10進数以外は省略しない方がよい。
・ ただし多ビットのzとxの書き方は紛らわしく、8ビットのzは本来は8’bzzzz_zzzzだが8’bzと書いても同じなのでこちらの方が便利。
例) 8’b0000_0001は8ビット2進数の1。
8’b1と書いても同じだが0を省略しない方がよい。
例) 8’d3は8ビット10進数の3。8’b0000_0011と同じ
例) 8’h0aは8ビット16進数のa。8’b0000_1010と同じ
例) 10は32ビット10進数。32’h0000_000aと同じ
■演算子
・ 算術演算子: + (加算), - (減算), * (乗算)
・ ビット演算子: ~ (NOT), & (AND), | (OR), ^ (XOR)
例) a=’b1010, b=’b1100のとき、~a=’b0101, a&b=’b1000
・ 関係演算子: == (等しい), != (等しくない), <,>,<=,>= (不等号)
(注意) “<=”は a_reg <= b_reg; のように代入の記号と重複している
・ 条件演算子
例) y = ( s )? a : b; // s=1のときa、s=0のときbを代入する
■リダクション演算子
・ 変数内の全ビット同士の演算を示す ~ (NOT), & (AND), | (OR), ^ (XOR)
例) ^a[2:0] はa[2]^a[1]^a[0] と同じ意味
■ビットの連結
・ 中かっこ { a,b,c } は変数a,b,cを並べた1つの変数を示す。
・ { N { a } } はaをN個並べた1つの変数を示す。
例) dat[15:0] = {dat_upper[7:0],dat_lower[7:0]}; // 上位バイトと下位バイトを連結した2バイトを表す
例) d_sign_ext[15:0] = {{8{d[7]},d[7:0]}; // 符号拡張の書き方