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で発生している様子がわかります。
以上で基本的なポストレイアウト遅延ゲートシミュレーションの仕方は終わりです。