急がば回れのシミュレーション。

ひとつひとつ、ちゃんと確認しながら進んでいくのは大事よね。というのもあるし、Diamondってどうやって使うのというのにも慣れなくてはいけないので、シミュレーションをしてみます。

まず元のソース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 件のコメント:

コメントを投稿

Windowsでシンボリックリンクを試してみる。

きっかけは、1つのファイルを別の名前で起動したら違う動きになるようなスクリプトを書く、でした。  busybox なんかでは、同じ実行形式ファイルの名前を、lsにすればlsと同じ、cpとすればcpと同じ動作をするようにしてますが、Pythonスクリプトでそれと同じように argv...