【FPGAテストベンチ/検証ノウハウ】テストベンチによるクロック信号/リセット信号の生成(Verilog編)

第1回目は、一度作成しておくと汎用的に再利用が可能なテストベンチでクロック信号やリセット信号を生成する方法(Verilog編)を紹介します。
テストベンチによるクロック信号やリセット信号の生成は、一度作れば再利用が可能でとても便利です。
では、始めましょう。
このブログは「FPGA設計ブログ一覧」の
2. シミュレーションのひとつです。
目次
クロックの生成
まず、クロックは直感的に周波数を判断しやすくするためにパラメータ化しておくとよいでしょう。
156.25MHzのクロックを生成するサンプルを下記に示します。
`timescale 1ns / 1ps
module tb_clk (
output wire CLK1
);
// Frequency Set (MHz)
localparam CLK1_FREQ = 156.25;
// Clock Generate
reg ck1 = 1'b0;
always ck1 = #(((1/CLK1_FREQ) / 2.0)*1000) ~ck1;
assign CLK1 = ck1;
endmodule
`timescale 1ns / 1psはテストベンチのみで使用される記述で、シミュレーション時間の単位と精度を設定しています。ここでは時間単位は1ns、精度は1psとしています。
次にlocalparamにて周波数を設定しています。ここでは156.25MHzを生成したいので156.25と設定しています。注意点としては例えば100MHzの場合には100ではなく、100.0と設定する必要があります。
always文にてクロックを生成していますが、ここでは下記の計算を行っています。
- 1÷156.25 = 0.0064 (周期)
- 0.0064÷2 = 0.0032 (周期の半分 この周期にてトグルすることでクロックとなる)
- 0.0032×1000 = 3.2 (周期のns単位 `timescaleにて1ns/1psと設定しているため)
always文にて3.2ns単位で信号がトグルすることにより、156.25MHzのクロックを求めることができます。
同じ記述を追加することで、1つのモジュールから複数のクロックを出力することも可能です。またここでは内部パラメータのlocalparamを使用していますが、parameter宣言により上位から周波数を与えることでより汎用的に使用することも可能です。
リセットの生成
次に、リセットについても時間をより直感的に判断するために時間設定をパラメータ化しておくとよいでしょう。
下記にリセット信号を設定時間にてトグルするサンプルを示します。
`timescale 1ns / 1ps
module tb_rst (
output wire RST1
);
// Reset Time Set (ns)
localparam RST1_TIM1 = 100.0;
localparam RST1_TIM2 = 50.0;
localparam RST1_TIM3 = 100.0;
// Reset Generate
reg rt1 ;
initial begin
rt1 = 1'b1;
#(RST_TIM1*1000) rt1 = 1'b0;
#(RST_TIM2*1000) rt1 = 1'b1;
#(RST_TIM3*1000) rt1 = 1'b0;
end
assign RST1 = rt1;
endmodule
`timescale 1ns / 1psはクロックと同様に1ns/1psでの設定です。
localparamにて信号をトグルさせたい時間を順番にns単位で設定しています。
ここではTIM1~3の3つのタイミングにて信号をトグルする設定としています。
initial begin以降で設定した時間により信号をトグルしています。
ここでは初期状態はHighとなっており、TIM1後にLow、さらにTIM2後にHigh、TIM3後に再度Lowとなります。
リセット生成もクロック生成と同様に複数個を設定することや、parameter宣言にて上位から時間設定を行うことでより便利に使うことができます。
以上でテストベンチによるクロック信号/リセット信号の生成(Verilog編)の説明を終わります。
このブログは「FPGA設計ブログ一覧」の
2. シミュレーションのひとつです。
最後までお付き合いいただきありがとうございました。
ModelSim/Questa エディション比較表はこちらをご覧ください。
このブログのシリーズ
関連ブログ