parameterの値によって実行するコードを切り替えない

[] [] []


parameterの値によって実行するコードを切り替えない」

前項でdefineマクロは使わずにparameterを使った方が安全と言ったが、parameterも乱用するとよくない。

parameterの使い道は特に決まっていないが、大体、次の3とおりがある。

(1) 定数を、数値で書く代わりにparameterにする

 可読性をよくするために、数値の意味がわかりにくいマジックナンバーをparameterで書くとよい。

 例1) カウンタの周期 if(count_reg==COUNT_MAX)

 例2) ステートマシンの状態 if(state_reg==IDLE)

(2) ビット幅など[ ]内の数値をparameterにする

 設計変更や再利用を容易にするために、ビット幅などはparameterで書くとよい。(補足- parameterビット求め方)

 例) reg[WD-1:0] count_reg; count_reg <= {WD{1'b0}};

 ただしコードが読みにくくなる弊害もあるので、どの部分を設計変更や再利用の対象にするのかを慎重に考えてから使うべきである。

(3) parameterの値によって実行するコードを切り替える

 これも設計変更や再利用を容易にするためにパラメータ化するという意味である

 例) ビット幅が3216かでデータフォーマットを切り替える

parameter WD=16;

×if(WD==32) 

     dout[31:0] <= dout_reg[WD-1:0};

 else if(WD==16)

     dout[31:0] <= {16'd0,dout_reg[WD-1:0]};

(3)の切り替えコードは、使わない方は論理合成時に削除されてしまう冗長な記述であり

 ・論理が読みにくくなる

 ・parameter値が変わった場合について検証もれしやすくなる

という弊害があるので、どの部分を設計変更や再利用の対象にするのかを慎重に考えてから使うべきである。また、本来の機能以外のもの(シミュレーション用のコード等)RTLに埋め込むことも、間違いの元なのでよくない。テストベンチから制御するようにした方がよい。

`define DEBUG   // デバッグ時はマクロDEBUG defineする

module testbench;

  ...

  // テストベンチ上ではシミュレーションモードに指定する

    dut #(.SIMULATION_MODE(1)) dut_1(...)

endmodule

 

// デフォルトはシミュレーションモードではない

module dut #(parameter SIMULATION_MODE=0)

   ...

×`ifdef DEBUG  // デバッグ時は別の信号を出力する

       assign dout = ram[adr];

  `else

       assign dout = dout_reg;

 `endif

    ...

×if(SIMULATION_MODE==1)  // シミュレーションモード時はRAMを初期化する

   initial for(i=0;i<64;i=i+1) ram[i] = 16'd0;

     ...

endmodule


[] [] []