シミュレーション用コードをRTL記述に埋め込まない

[] [] []


parameterでコードを切り替えることで、シミュレーション用コードをRTL記述に埋め込むこともできるが、本来のコードが読みにくくなるのでよくない。テストベンチから操作した方がよい。

「シミュレーション時だけ定数を変えたいときは、テストベンチからdefparam文で変える」

) シミュレーション時だけカウンタ周期を短くする

parameter SIMULATION_MODEでシミュレーション用コードに切り替えると

// テストベンチ

module tb;

 // テストベンチ上でシミュレーションモードに切り替える

×dut #(.SIMULATION_MODE(1)) dut_0(...);

 ...

endmodule

// RTL記述

module dut #(parameter SIMULATION_MODE=0)

   ...

×if(SIMULATION_MODE==1) // シミュレーション時はカウンタ周期を短くする

  count_r <= (count_r==16'd10)? 16'd0 : count_r + 1'b1;

  else

   count_r <= (count_r==16'd10_000)? 16'd0 : count_r + 1'b1;

   ...

endmodule

テストベンチからdefparamで切り替えると

// テストベンチ

module tb;

 ...

 // テストベンチ上でカウンタ周期を短くする

defparam dut_0.COUNT_MAX=16'd10;

  dut dut_0(...);

endmodule

// RTL記述

module dut

  // カウンタ周期をparameterにしておく

  parameter COUNT_MAX=16'd10_000;

   ...

count_r <= (count_r==COUNT_R_MAX)? 16'd0 : count + 1'b1;

   ...

endmodule

◇◇

「シミュレーション時に内部信号の値を強制的に変えたいときは、テストベンチからforce,release文で変える」

) シミュレーション時に強制的にエラーを起こさせる

parameter SIMULATION_MODEでシミュレーション用コードに切り替えると

// RTL記述

module dut #(parameter SIMULATION_MODE=0)

   ...

×if(SIMULATION_MODE==1) // シミュレーション時はエラーを起こさせる

    assign parity = ^(din[7:0] | 8'h01);

  else

    assign parity = ^din[7:0];

    ...

endmodule

テストベンチからforce,releaseで切り替えると

// テストベンチ

module tb;

  dut dut_0(...);

  initial begin

    ...

  force dut_0.din[0] = 1'b1; //強制的にエラーを起こさせる

    $display("-- %m.din=%h",dut_0.din);

    #(100);

    release dut_0.din[0]; //エラーを解除

    ...

endmodule


[] [] []