4.1.1 カウンタ
4.1.1.1 RTLシミュレーション
例として、8ビットのカウンタ(モジュール名counter)を設計してみましょう。counterというフォルダを作ってその下で作業をするものとします。
下記は8ビットカウンタソース(counter.v)です。これは、論理合成対象となります。
module counter(clock,reset,counter_out); parameter width=8; input clock; input reset; output [width-1:0] counter_out; reg [width-1:0] counter_out; always @(posedge clock) begin if (reset) counter_out<=0; else counter_out<=counter_out+1; end endmodule |
次はテストベンチ(counter_test.v)です。別ファイルで記述します。
`timescale 1ns/1ps `define CYCLE (10) module counter_test; parameter width=8; reg reset=1; reg clock=0; reg [width-1:0] counter_out_test; wire [width-1:0] counter_out; always #`CYCLE clock=~clock; initial begin #`CYCLE; @(negedge clock); reset=0; #(1000*`CYCLE); $finish; end counter u1(.clock(clock),.reset(reset),.counter_out(counter_out)); //Compare RTL and Post Layout Gate Level circuit after synthesis always @(posedge clock) begin if (reset) counter_out_test<=0; else counter_out_test<=counter_out_test+1; end always@(posedge clock)begin if (counter_out_test !==counter_out) $display("Compare Error Expected:%h Result%h time=%d",counter_out_test,counter_out,$time); end endmodule |
注意する点は次の3つです。
以上二つのファイルでVeritakプロジェクトを構成し、動作が期待どおりに動くか確認します。
リセットが効いて0、その後POSEDGE CLOCKでインクリメント動作..うまく動いているようです。これで、RTLシミュレーションはおしまいです。
4.1.1.2 Quartusによる論理合成
まずプロジェクトを作成します。New Project Wizardを起動します。
先ほど作業したcounterフォルダを指定します。フォルダ名を合成対象のTOPモジュールにしておいたので入力の手間が省けます。
次に合成対象のcounter.vを指定します。
ページ3では、Simuation Tool nameの選択をCustom Verilog HDLに指定します。
ページ4,5では、デバイスを指定します。ここでは、DWM誌の付録のデバイスを選択しました。
以上の設定をまとめるとページ6になります。
論理合成、レイアウト、バックアノテーションファイルの作成
Start Compilationでコンパイルがスタートします。
コンパイルが成功するとcounter\simulation\customフォルダに
という二つのファイルが生成されています。これが、各々ゲートレベル回路と、レイアウト後のバックアノテーションファイル(遅延情報)になります。
Veritakによるポストレイアウト遅延ゲートシミュレーション
RTLシミュレーションとは別にVeritakのプロジェクトを作成する必要があります。
プロジェクトファイルは、SDFを読み込む関係でSDF File位置に作成してください。
必要なファイルは、
の4つです。
Veritakプロジェクトでは、counter.sdo以外の上記ファイルを指定します。counter.sdoは、counter.voの中で$sdf_annotateで自動的に呼び出されるので指定する必要はありません。
下図のようにファイルを指定したら、Save Projectを行います。
コンパイルモードは、Altera-SDFを指定して Save Projectを行います。
ゲートレベル遅延シミュレーション
Load Project、Goで、シミュレーションが走ります。
counter_test が合成したH/Wからの信号で、counter_out_testは、RTLの記述です。両者一致するはずなのですが、時刻10nsでコンペアエラーが発生しています。CLOCKが入る前にxxのところ00ですから、CYCLONEは、REGを電源投入後00に初期化するということなのでしょう。
合成した信号が遅れているのが分かると思います。図の黒赤カーソル間では、6698ps遅れています。また、counter_outは、REGの出力ですから、そんなにハザードはないかなと思いきや、3->4で発生している様子がわかります。
以上で基本的なポストレイアウト遅延ゲートシミュレーションの仕方は終わりです。