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で発生している様子がわかります。

以上で基本的なポストレイアウト遅延ゲートシミュレーションの仕方は終わりです。