parameterを乱用しない
前項でdefineマクロは使わずにparameterを使った方が安全と言ったが、parameterも乱用するとよくない。
◇
parameterの用途は、大体、次の3とおりがある。
(1) 定数を、数値で書く代わりにparameterで書く
数値だと意味がわからないので可読性をよくするためである。
例1) カウンタの周期 if(count_r==COUNT_MAX)
例2) ステートマシンの状態 if(state_r==IDLE)
(2) ビット幅をparameter化する
設計変更や再利用を容易にするためである。
例) reg[WD-1:0] count_r; count_r <= {WD{1'b0}};
(3) parameterの値によって実行するコードを切り替える
これも設計変更や再利用を容易にするためである
◇◇
「ビット幅を中途半端にparameter化しない」
上記(2)のビット幅のparameter化はコードが読みにくくなる弊害もあるので、どの部分を設計変更や再利用の対象にするかよく考えてから使った方がよい。
特に、中途半端にparameter化するとparameter値をいじったときに不整合が生じて、かえって不便になる。
例1) 宣言はビット幅可変にしているのに、固定になっている箇所がある
parameter WD=4; reg[WD-1:0] din; // 宣言はビット幅可変 // ビット幅固定になっている箇所がある。 ×case(din) 4'b0001: ... 4'b0010: ... 4'b0100: ... 4'b1000: ... endcase |
可変にするなら全部する。
parameter WD=4; reg[WD-1:0] din; // 宣言はビット幅可変 ○for(i=0; i<WD; i=i+1) if(din[i]==1'b1) ... |
例2) 最大値とそのビット幅が連動しているのに、独立なparameterにしている
parameter D_MAX = 400; ×parameter WD = 9; // D_MAXのビット幅 reg[WD-1:0] din; if(din < DMAX) ... |
連動する定数はlocalparamにして大元のparameterから計算する。(→補足- parameter値のビット幅の求め方)
parameter D_MAX = 400; ○localparam WD = $clog2(D_MAX); // D_MAXのビット幅 reg[WD-1:0] din; if(din < DMAX) ... |
◇◇◇
「parameter値によって実行するコードを切り替えない」
上記(3)のコード切り替えは、使わない方は論理合成で削除されてしまう冗長な記述であり
・論理が読みにくくなる
・parameter値が変わった場合について検証もれしやすくなる
という弊害があるので、どの部分を設計変更や再利用の対象にするかよく考えてから使った方がよい。
例) ビット幅が32か16かでデータフォーマットを切り替えている
parameter WD=16; ×if(WD==32) // どちらかのコードは論理合成で削除される dout[31:0] <= dout_r[WD-1:0}; else if(WD==16) dout[31:0] <= {16'd0,dout_r[WD-1:0]}; |
無理にコードを汎用的にしなくてもよい。
○dout[31:0] <= {16'd0,dout_r[15:0]}; |