シミュレーション用コードを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 |