はじめに
FPGA (Field Programmable Gate Array) はプログラマブルなディジタル LSI デバイスですが、そのディジタル回路を表現するプログラムは HDL (Hardware Description Language, ハードウェア記述言語)で表現する事が標準的な方法です。
記述した HDL が正しく希望通りの動作を表現できているかどうか、 FPGA を搭載したボード(例:開発キット)で実際に動作させて確認する方法もありますが、それが出来ない状況では Simulation を行って動作を確認、分析します。
希望通り動作しない場合、その相違点を明確にし HDL に修正を行うことがデバッグとなります。
この記事では、 Agilex 3 で動作させる事を想定した簡単な HDL 記述を Quartus Prime Pro (version 25.1) 上で作成し、Simulation で確認する手順を紹介します。
Simulation には Quartus Prime Pro と同梱の Questa altera FPGA Edition を使用、Quartus から呼び出して起動する方法で実行します。
(バージョンによっては Questa Intel FPGA Edition となっている場合はありますが同様にお考え下さい)
ページ下部よりプロジェクトのアーカイブファイル test_design_Agilex3sim_25_1.qar をダウンロードできます。 Quartus Prime Pro Edition version 25.1 で展開することで "3. Run Simulation の実行" からスタートできます。
ポイント:この記事では Agilex 3 を例として説明していますが、他の Agilex ファミリーや Stratix 10 など、Quartus Prime Pro Edition がサポートするデバイスファミリーで共通の手順となっています。なお、Quartus Prime Standard Edition の最近の version でも対応している手順ですので参考にしていただけます。
ポイント:Simulation Tool として Questa altera FPGA Edition 以外にも、Quartus Prime Pro User Guide の 1.7. Supported Simulators に記載された Tool は対応可能です。
1. Quartus Project 上に Simulation する HDL デザインを構築
先ず最初に、Quartus Prime Pro Edition を起動し Agilex 3 のProject 上に Simulation する HDL デザインを構築します。
Quartus ソフトウェアを起動したら、New Project Wizard で Agilex 3 デバイスをターゲットとしたプロジェクトを作成します。Wizard で可能な Simulation Tool の設定も行っておきます。
(プロジェクトの作成 step 1:New Project Wizard の起動)
New Project Wizard ではまずワーキングディレクトリ、プロジェクト名(本記事では test_design)を設定します。
(プロジェクトの作成 step 2:ワーキングディレクトリ、プロジェクト名の設定)
次にターゲットデバイスとして Agilex 3 を選択します。
(プロジェクトの作成 step 3:Device の選択)
Simulation tool として Questa intel FPGA Edition を指定し、HDL 言語は Verilog にします。
(プロジェクトの作成 step 4:Simulation tool 指定)
Simulation したい HDL ファイルを作成します。今回はテキストエディタに用意されている template の Binary Counter をそのまま使用します。
( HDL ファイルの作成 step1:File -> New でデザイン関連ファイルの新規作成開始)
( HDL ファイルの作成 step2:Verilog HDL を指定)
Verilog HDL 向けのテキストエディタが起動しますが、適宜ウィンドウの Detach やサイズ変更を行って扱いやすいサイズで作業して下さい。
( HDL ファイルの作成 step3:テキストエディタの起動画面)
エディタ上で右クリックし、表示されるプルダウンメニューから Insert Template を選択します。
( HDL ファイルの作成 step4:Insert Template の実行)
Insert Template ウィンドウが開きますので、左のメニューで Verilog HDL の Binary Counter を選択し、Insert で内容を挿入して Close します。
( HDL ファイルの作成 step 5:Verilog HDL Binary Counter の挿入)
module 名を binary_counter から、Project 名と同じ “test_design” に変更し、エディタの File -> Save As で ”test_design.v” としてセーブします。
Add file to current project のチェックは ON にしてセーブします。エディタをクローズして下さい。Simulation したい HDL ファイルはこれで完成し、Quartus Project にも登録されました。
ポイント:ここで、Analysis & Synthiesis や Compile を実行して、作成した HDL の確認を行ってもかまいません。デザインの使用リソースの見積もりや、エラーがないかの確認・エラーのデバッグを行うことができます。
2. テストベンチの作成
次に、Simulation の為にテストベンチを作成します。
テキストエディタで、上記の HDL と同様に Verilog ファイルを生成し、内容は以下のテキストをコピー&ペーストしてください。
`timescale 1ns/1ns
module tb_test_design;
parameter WIDTH=64;
reg clk;
reg enable;
reg reset;
wire [WIDTH-1:0] result; // count;
parameter HCK = 5; // 100MHz TCK=10ns
initial begin
reset = 1'b1;
enable = 1'b1;
#(HCK*7) reset = 1'b0;
#(HCK * 2 * 100000000) $stop;
end
initial begin
clk = 1'b1;
forever #(HCK) clk = ~clk;
end
test_design #(WIDTH) DUT
(
.clk(clk),
.enable(enable),
.reset(reset),
.count(result) //,
);
endmoduleこの内容でテストベンチファイルとして、ファイル名 “tb_test_design.v” でセーブします
これで、Simulation に必要な HDL ファイルが揃いました。
以下に、テストベンチの内容について説明します。
1行目は Simulation のためのタイムスケールです。
3行目のモジュール名はデザイン HDL の top のモジュール名にテストベンチを表す意図で “tb_” を付加した名前にしています。
4行目は override するパラメータ、5-8 行が入出力用の信号の宣言です。
クロック周期をパラメータ化する為、10 行目で半周期 HCK を parameter 宣言しています。クロック周波数を 100MHz と想定します、周期 TCK = 10ns となりますので HCK = TCK/2 = 5ns です。
12-17 行の initial 文で reset, enable 信号の挙動と Simulation の終了操作をまとめて記述しています。reset は最初 assert され(High)、3.5 サイクル経過後 negate されます(Low)。enable は High 固定です。
Simulation の終了は $stop を用いて「停止」を指定しています。
100MHz で “1秒” 分のクロックサイクル経過後に停止させます。
クロック信号 clk を 19-22 行の initial 文で表現しています。
時刻 #0 が立ち上がりエッジとして High で開始、21 行目の forever 文で半周期毎に反転する、という表現方法を取っています。
デザインの top “test_design” をインスタンス名 “DUT” (Design Under Test の意味) でインスタンスしています。
出力ピン count は wire 信号 result で受け取っています。
テストベンチの内容は以上ですので 32行目の様に endmodule を末尾に置きます。
•参考資料:はじめてみよう!テストベンチ ~Verilog-HDL 編~
3. Run Simulation の実行
下記参考資料の内容にそって Simulation を実行します
•参考資料 Quartus® Prime Pro Edition の Run Simulation 機能で簡単に RTL シミュレーションする方法
実行済および不要なステップ(「プロジェクトへデザインを登録」「 IP 用のシミュレーション・モデル生成」)はスキップします。
「 EDA ツールの実行プログラムのパス設定」から順に設定・確認していきます。
「シミュレーターの指定 / 言語指定」では Verilog HDL を指定します。
メニュー欄から Assignments → Settings → EDA Tool Settings と開いてください。
[New] をクリックして「テストベンチの登録」を行います。
Test bench name には作成したテストベンチのモジュール名 “tb_test_design” を設定、Simulation period はテストベンチ内で $stop 文で制御しているので “Run simulation ....” を選択します。File name はブラウズボタン[...] を利用するか直接入力して “tb_test_design.v” を [Add] で登録します。
「Simulation Flow Settings」まで完了したら、[Apply][OK] をクリックして設定を完了させ Settings ウィンドウを一旦閉じます。
「操作方法」の手順で Simulation を起動、実行します。
“Analyze & Elaboration” を実行してください。
実行すると”Reset Release IP” を使用する様 Critical Warning で警告されますが、今回は無視して進めます。
(実際に動作させるデザインでは使用を推奨します)
View メニュー > Tcl Console ウィンドウを起動し、下記コマンドを入力し実行します。
execute_flow -simulation
HDL 記述にミスがありエラーで停止している場合がありますので、Questa のアイコンをクリックしてメインウィンドウを開き、Transcript ウィンドウにエラーが表示されていないか確認して下さい。
特にテストベンチは Simulation で初めて Tool によるチェックが行われますので、この時エラーの原因となることが多いです。エラーになる様な要因は様々です。文法ミスとしては、typo での信号名不一致、コンマやコロンの打ち間違い、変数の型が合っていないなどがあります。また、インストールやライセンスでの問題の場合もあります。
例えば下記はある行の末尾のセミコロン “;” を打ち忘れた場合のエラーです。
エラーメッセージから発生個所と手掛かりの情報を読み取り、HDL の該当箇所をチェックして修正を行います。Questa は一旦終了します。参考資料の「補足事項」にある様に、Questa を終了して “Flow was successful” [OK] をクリックするまで Quartus は応答しなくなる事に注意して下さい。
(エラーを修正した場合は、再度 Quartus の Tcl コンソールからコマンドで Simulstion を実行してください。)
テストベンチを含め HDL に問題がなければ記述した $stop まで simulation が進行し、停止します。
今回のデザインは比較的規模が小さい為、数分程度で停止すると思われます。
4. 波形確認
Simulation を実行した結果、wave ウィンドウに波形を表示する設定になっていれば wave ウィンドウが開き結果の波形が得られています。セクション3 の方法も wave ウィンドウが設定されています。本セクションでは wave ウィンドウの波形を確認、分析する為の簡単な操作を紹介します。
Wave ウィンドウのメニューバーと波形の間は各種 Toolbar が表示されていますが、使用する可能性が低いものを非表示にして波形の表示個所を少し増やすことができます。
Toolbar 領域で右クリックし、プルダウンメニューでチェックを On/Off して表示/非表示を切り替えます。
例えば Mode, Wave Cursor, Zoom のみ表示にすれば下記の様にシンプルになります。
横方向は時間軸ですので、波形の目視確認として、拡大縮小を繰り返して、全体の流れ、特定のパターンの発見、詳細な信号間の遅延や値の関係を追跡・確認・分析する作業になります。
良く使われる拡大縮小操作は下記があります。
・Zoom Full : Simulation 時間全体を画面 Fit 表示
・Zoom In (2x) : 2倍の拡大表示
・Zoom Out (2x) : 2倍の縮小表示
・Zoom Area : Drag & Drop で指定した範囲を拡大表示
- Zoom Mode では、左クリックで左右の範囲を見ながら、下方向(左下または右下)に Drag & Drop (左上方向の場合は Zoom Full, 右上方向は Zoom Out)
信号のイベント間の時間関係を正確に読み取る為、カーソルを利用することができます。デフォルト設定では、Wave ウィンドウにカーソルが1つ時刻 0 で表示されています。
カーソル1つで信号のエッジなどのイベントの時刻を読み取る使い方もありますが、2つのイベント間の関係を読み取る為もう1つカーソルを追加し2つの状態も良く使われます。
カーソルを追加するには、Wave Cursor Toolbar の Insert Cursor アイコンをクリックするか、信号名の下の時間表示ラインの左端の Insert Cursor アイコンをクリックします。(図の様に “+” ですがアイコンの絵柄は異なります)
また不要なカーソルを削除するには、 対象のカーソルを選択(ハイライト表示)して Wave Cursor Toolbar の Delete Cursor アイコンをクリックするか、対象のカーソル行の左端の Remove this cursor アイコンをクリックします。(同様にそれぞれ “-” の絵柄です)
カーソルの位置をイベント(値の変化)にピッタリ合わせる機能を使用して、正確な時間の読み取りやイベントの発生/未発生の確認を行うことができます。
信号とカーソルを1つずつ選択(ハイライト)して、Wave Cursor Toolbar の (1) Find Previous Transition または (2) Find Next Transition のアイコンをクリックします。前者ではカーソルより前で最も近いイベント時刻にカーソルが移動し、後者ではカーソルより後で最も近いイベントに移動します。
(時刻 0 または最後の時刻までイベントが無い場合は移動しません。)
これらの右の4つのアイコンはさらに立ち上がり/立ち下がりの条件に合うものに限定します。
2つ以上のカーソルがあると、最も近いカーソル同士の間で時間差が表示されます。
イベントへの時間合わせと組み合わせることで、クロック周期や信号間のレイテンシなどを正確に読み取ることができます。
複数ビットのバス信号は、デフォルトでは 16進数として値が表示されます。
システムの機能に合わせてわかりやすい radix (基数) を設定することができます。
信号名またはその右の値にカーソルを合わせて右クリックし、Radix から指定したい基数を選びます。よく使われるものは Binary (2進数), Decimal (符号付き10進数), Unsigned (符号無し10進数), Hexadecimal (16進数) です。フォーマットが適合すれば浮動小数点数を認識する事もできます。
信号名またはその右の値にカーソルを合わせて右クリックし、Format -> Analog(Automatic) を指定すると、信号の値を数値としてグラフ表示します。
Automatic の場合の縦軸のスケーリングは、値の最大値最小値が縦方向の表示範囲に適合する様に自動計算されます。
これにより今回の回路が単調増加のカウント動作を行っていることが確認できます。
なお、信号のビット数や、Simulation 時間が比較的大きい場合は表示に時間がかかることがありますので注意してください。
信号をコピー&ペーストして、Wave ウィンドウ内に並べて表示する事が出来ます。
多くの信号と並べて比較したい場合や、グラフ(Analog)表示と値(Literal)表示を並べて内容を捉えやすくしたい場合に行います。
(Analog 表示を値の表示に戻す場合は信号に右クリック -> Format -> Literal を実行して下さい)
下記の図では、信号 result をコピーして2つ縦に並べ、上はグラフ(Analog)表示、下は値(Literal)表示にしています。横方向には、時刻 0 付近の拡大図、Simulation 時間全体表示、時刻1秒付近の拡大図を信号の位置を合わせて並べています。
(ここでは表示から取得した画像を貼り合わせて作成しています。複数の Wave ウィンドウを作成すれば 、tool 上で異なる拡大率の信号を並べて比較することは可能です。)
(Lock Cursor)
カウント結果(Literal表示)を含め、0から99,999,999→100,000,000までのカウントが1秒で正しく行われることをカーソルで確認できます。(99,999,999 から 0 に戻る様に HDL を変更することで、1秒ごとに同じ動作を繰り返すカウンターを作成でき、時計などの応用に使用することができます)
なお、操作中のカーソル移動は左端のロックボタン(Lock Cursor)で防げます。
表示位置の移動はスクロールバーでのスライドが最も直観的でわかりやすいですが、拡大している状況で下記の方法でジャンプ移動もできます。
以下の時間表記の上で右クリックをすると直接時刻入力することができ、移動します。
おわりに
Quartus Prime Pro と 対応する Questa altera FPGA Edition がインストールされていれば、Agilex 3 をターゲットとした HDL 記述のデザインについてテストベンチを用意してすぐに RTL 機能 Simulation が行えることが確認できました。
直観的に波形を確認しながら、RTL HDL 設計の検証とデバッグを進めることができます。
ここでは紹介しきれなかった Simens Questa Simulation Tool の様々な機能も駆使し、是非、より高度な RTL HDL 設計にチャレンジしてみてください。
「Agilex™ 3 でやってみた」シリーズ一覧はこちら