まず元のソースclk1000hz.vの7行目、CNT = 25000; を CNT = 10; くらいにしておきます。半周期で25000クロックも刻まれても困るので。
そうしたら、テストベンチファイルの作成です。
左ペインのFile Listタブを選択し、Input Filesで右クリック、Add → New File...でclk1000hz_test.vというファイルを作成します。
// vim: set fenc=utf-8 filetype=verilog expandtab ts=4 sts=0 sw=4:
//
// testbench for clk1000hz.
//
//
`timescale 1ns/1ns
module CLK_TEST;
reg clk, reset;
wire out;
parameter CYCLE = 20; // 20ns (50MHz)
CLK1000HZ c1k(
.clk(clk),
.reset(reset),
.clk1m(out));
always #5 clk = ~clk;
initial begin
$monitor("%t: clk=%b, reset=%b, out=%b", $time, clk, reset, out);
clk = 0; reset = 1;
#10 reset = 0;
#10 reset = 1;
#1000
$finish;
end
endmodule
そうしたら上記のようなソースを入力します。 いろいろ細かい作法やら考え方、キーワードなどはその手の本を見てもらうとして、テストベンチでは入力はreg、出力はwireだそうです。そして実行する内容はinitialブロックに記述、と。
ここでは初期化としてclk=0とreset=1を、10サイクル後にリセットをおろし、その10サイクル後にリセットを解除。そのまま1000サイクルまでシミュレーションしておしまい、ということにしておきます。
次にツールバーから波形と鉛筆のアイコンをクリックします。
Simulation Wizardというウィザードです。最初に説明ダイアログが出ますから、これはそのままNextをクリックします。
次に、Simulation Project Nameを入力するように求められます。
ここではSimulatorが選べるようになって…いません。無償版ですからね。Active-HDLしか選べません。なので、asimulなどという名前を適当につけてみました。すると、そんなプロジェクトはないけれど作りますかというメッセージが出るので、Yesをクリックします。
次にProcess Stageを選択するようになっていますが、ここも選択できるのはひとつだけなのでそのままNext。するとソースファイルを指定するように出てきますので、これもそのままNextです。
次はParse HDL files for simulationというダイアログ。ここではトップモジュールを指定できるようになっていますが、現在は一つしか選べません。ここもNext。
最後に諸設定を確認するダイアログが出ます。
左下のチェックボックスはすべてチェックした状態でFinishしてみます。
するとActive-HDL 9.2というのが立ち上がり、シミュレーションをして…
なにも波形が出てきません。左ペインの信号のところもステートが不明になっていたりします。それはそうです、テストベンチのコンパイルをしてないですから。
Active-HDLのDesignからCompile Allをクリックして再度シミュレータを走らせると、ちゃんと出ました。
波形も出ています。が、よくよく数えてみるとclkが11個でoutが切り替わっています。どうやらなにか間違っているようです。
よくよくソースを見てみれば、if (count < CNT)ではダメですね。ここはCNT-1でないと。
ソースを修正してコンパイルし、再度シミュレーションしてみました。
どうやらよさそうですね。やっぱり急がば回れは重要です。
0 件のコメント:
コメントを投稿