RENESAS ForgeFPGA ソフトウェアシミュレーション

RENESAS ForgeFPGA ソフトウェアシミュレーション

重要な情報

シミュレーションは、異なる入力刺激を異なるタイミングで設計に適用し、RTLコードが意図したとおりに動作するかどうかを確認する手法です。これは、設計の堅牢性を検証するために使用されます。シミュレーションにより、ユーザーは view 関連する信号のタイミング図は、設計の説明がどのように設計に組み込まれているかを理解するために役立ちます。 file 振る舞う。

テストベンチは、シミュレーションに使用されるコードです。シンプルなテストベンチは、テスト対象ユニット (UUT) をインスタンス化し、入力を駆動します。Go Configure ソフトウェアは、Icarus Verilog (iVerilog) と GTKWave を使用して、テストベンチで提供される刺激を使用してシミュレーション波形を観察します。

このドキュメントでは、システムに Icarus をインストールする際に実行する必要がある手順と、シミュレーションを正常に実行する方法について説明します。

Icarus Verilogのインストール

a. 最新バージョンのIcarus Verilog (IVerilog)をインストールします。 https://bleyer.org/icarus/
b必ず IVerilog を PATH に追加し、GTKWave をインストールしてください (図 1 を参照)
Icarus Verilogのインストール

cGo Configure ソフトウェアを開き、パーツ SLG47910(Rev BB) を選択して Forge Workshop を開きます (図 2 を参照)。
Icarus Verilogのインストール

d上部のツールバーの中央にある FPGA エディターをクリックするか、ウィンドウの中央にある FPGA コア構造をダブルクリックすることもできます。
Icarus Verilogのインストール

e. Forge Workshop という新しいウィンドウが開きます。上部のメニュー ツールバーで、[オプション] → [設定] をクリックします。[設定] ダイアログ ボックスで、[ユーザー設定] タブの [ツール] に移動します。Icarus Verilog と GTKWave の両方で [システム環境ボックスを使用する] の選択を解除します。システムに保存されている Iverilog と GTKWave へのパスを指定されたスペースに追加します (図 4 を参照)。
Icarus Verilogのインストール

テストベンチをシミュレートする準備はすべて整いました。上記の手順により、Go Configure ソフトウェアでテストベンチをシミュレートするときに GTKWave が自動的に起動するようになります。

テストベンチ

システムを正常に実装するための最も重要なステップは、設計とその機能を検証することです。ハードウェアを実装した後に複雑なシステムを検証するのは賢明な選択ではありません。お金、時間、リソースの面で非効率的です。したがって、FPGA の場合は、テストベンチを使用して Verilog ソース コードをテストします。

11 ビットの入力があり、すべての可能な入力組み合わせ値、つまり (211) についてデバイスをテストするとします。これは非常に大きな組み合わせ数であるため、手動でテストすることは不可能です。このような場合、テストベンチは、すべての可能な値について設計を自動的にテストし、テスト設計の信頼性を確認できるため、非常に便利です。Verilog テストベンチは、物理的なハードウェア デバイスを必要とせずに設計をシミュレートおよび分析するために使用されます。

テスト対象設計 (略して DUT) は、テストする機能の合成可能なモジュールです。言い換えれば、テストする回路設計です。Verilog の 3 つのモデリング スタイル (ゲート レベル、データフロー、動作) のいずれかを使用して DUT を記述できます。

テストベンチは合成できないため、シミュレーション目的にのみ使用されます。これにより、ユーザーはテストベンチの作成に「for」、「$display」、「$monitor」などのキーワードなど、Verilog 構造のフルレンジを使用できます。シンプルなテストベンチは、テスト対象ユニット (UUT) またはテスト対象デバイス (DUT) をインスタンス化し、入力を駆動します。

テストベンチを理解する

テストベンチを理解する

テストベンチにおけるタイムスケールの定義

シミュレーションを行う際、ソフトウェアは時間の定義方法を知る必要があります。遅延単位は、`timescale ディレクティブを使用して指定されます。このディレクティブは、それに続くモジュールの時間単位と精度を指定します。`timescale は、#1 が時間に関して何を意味するかを判断するのに役立ちます。# は、timescale で指定された時間単位に従って、システムに導入される遅延を定義するために使用されます。したがって、time_unit が ns の場合、#1 は 1 ns の遅延を意味します。

構文:
`タイムスケール / /

time_unit は、遅延 #1 が表す時間の量です。time_precision ベースは、時間単位に対して使用する小数点以下の精度を表します。(図 23 の 5 行目を参照)

タイムスケール構造を使用すると、同じ設計で異なる時間単位を使用できます。遅延仕様は合成できず、ハードウェア ロジックに変換できないことに注意してください。遅延関数は完全にシミュレーション目的です。$時間 および$リアルタイム システム関数は現在の時刻を返します。デフォルトのレポート形式は別のシステムタスク $timeformat で変更できます。

Examp上: 

`タイムスケール 10us/100ns
`タイムスケール 1ns/1ps
#10 reset = 1; // 信号を10ns遅延します
#0.49 $display( “時刻 #0 の T = %0.49t”, $realtime) ;

指定された遅延は #0.49 で、単位時間の半分より小さいです。ただし、時間精度は 1ps に指定されているため、シミュレーターは 1ns より小さくすることができず、指定された遅延ステートメントを丸めて 0ns を生成します。したがって、このステートメントは遅延を提供できません。

シミュレーションログ: 

時刻 #1 で T = 0.49

モジュール宣言

テストベンチでのモジュール宣言は、メインの Verilog コードとは異なります。テストベンチでは、モジュールはターミナル ポートなしで宣言されます。(図 25 の 5 行目を参照)

構文: 

モジュール;

モジュール宣言の後に、メイン設計で以前に定義された入力信号と出力信号が定義されます。 file.
シミュレーション中に信号を駆動および監視するために、2 つの信号タイプを使用します。reg データ型は、新しい値が割り当てられるまで値を保持します。このデータ型には、always ブロックまたは initial ブロッ​​クでのみ値を割り当てることができます。
ワイヤ データ型は、物理接続のデータ型に似ています。ポート、割り当てステートメント、または reg によって駆動される値を保持します。このデータ型は、initial ブロッ​​クまたは always ブロックでは使用できません。パラメータと整数の宣言もこのセクションで行われます。

Examp上:
Reg a,b; // HDLコード内の入力はテストベンチ内のregとして定義されます
Wire y; // HDLの出力信号はテストベンチではwireとして定義されます

DUTインスタンス化

テストベンチの目的は、DUT モジュールが機能しているかどうかを確認することです。したがって、設計モジュールをテスト モジュールにインスタンス化する必要があります。

構文: 

(。 (信号1)、.信号1>(信号2));

Examp上:

ALU d0 (.a(a), // ALUの信号「a」はALU_tbモジュールの「a」に接続する必要があります
.b(b), // ALU の信号「b」は ALU_tb モジュールの「b」に接続する必要があります
.c(c)) ;// ALU の信号「c」は ALU_tb モジュールの「c」に接続する必要があります

DUT モジュール ALU をテスト モジュールにインスタンス化しました。インスタンス名 (d0) はユーザーが選択します。先頭にピリオド「.」が付いている信号は ALU モジュール内の信号の名前で、テスト ベンチで接続するワイヤまたはレジスタは信号の横の括弧 () で囲まれています。コンパイル エラー メッセージでエラーが発生した行番号が正しく示されるように、各ポート接続を別の行にコーディングすることをお勧めします。これらの接続は名前で行われるため、表示される順序は関係ありません。

DUT のインスタンス化は、テストベンチ モジュールが異なる信号名を持つモジュールに対しても行うことができます。インスタンス化を行う際に重要なのは、信号を正しくマッピングすることです。

Example: 

ALU d0 (.a(A), // ALUの信号「a」はALU_tbモジュールの「A」に接続する必要があります
.clk(clock), // ALU の信号「clk」は「clock」ALU_tb モジュールに接続する必要があります
.out(OUT)) ; // ALU の信号「out」は ALU_tb モジュールの「OUT」に接続する必要があります

テストベンチの常時および初期ブロック

Verilog には、initial と always という 2 つの連続ブロックがあります。これらのブロックで刺激を適用します。

初期ブロック

初期ブロックは一度だけ実行され、ブロックの最後の行が実行されると終了します。刺激は初期ブロックに書き込まれます。(図 54 の行 72 ~ 5 を参照)

構文:
..
初期開始
$ダンプfile();
ダンプ変数
..(刺激を入力)
終わり

最初のブロックは、シミュレーションの開始時、つまり t = 0 の時点で実行を開始します。開始と終了の間の最初の行から始めて、遅延に達するまで各行が上から下へ実行されます。遅延に達すると、このブロックの実行は遅延時間 (10 時間単位) が経過するまで待機し、その後再び実行を開始します。
ユーザーは、すべての組み合わせを手動で入力する代わりに、この初期ブロック内でループ (for、while、if-else) を使用して刺激を定義することもできます。
初期ブロック

 

Example:
最初の始まり
A = 0; b = 0; // 実行を開始
#10 a = 0; b = 1; // 実行は t = 10 単位時間で行われます
#10 a = 1; b = 0; // 実行は t = 20 単位時間で行われます
終わり

ごみ Files

もう一つ覚えておくべきことは、$の宣言ですごみfiles および$ダンプバー 最初のブロック内(図55の56-5行目を参照)。$ごみfile ネットとレジスタの値の変化をダンプするために使用されます file それが引数として指定されます。

例えばamp上:

$ごみfile(“alu_tb.vcd”);

変更内容を file alu_tb.vcdという名前で記録されます。変更は file VCDと呼ばれる file これは値変更ダンプの略です。VCD(値変更ダンプ)は値の変更に関するすべての情報を保存します。$dumpは1つしか持てません。file Verilog シミュレーションのステートメント。

$はダンプバー ダンプする変数を指定するために使用されます( file $dump によって言及されましたfile) 最も簡単な方法は、引数なしで使うことです。$dumpvars の一般的な構文は次のとおりです。

$ダンプバー ( <, >);

基本的に、どのモジュールとモジュール内のどの変数をダンプするかを指定できます。これを使用する最も簡単な方法は、レベルを 0 に設定し、モジュール名をトップ モジュール (通常はトップ テストベンチ モジュール) に設定することです。

$ダンプバー(0、アル_tb);

レベルが0に設定され、モジュール名のみが指定されている場合、そのモジュールのすべての変数と、このトップモジュールによってインスタンス化されたすべての下位レベルモジュールのすべての変数がダンプされます。このトップモジュールによってインスタンス化されていないモジュールがある場合、その変数はカバーされません。さらに、$の宣言はごみfile $dumpvarsまたはダンプを指定する他のシステムタスクの前に記述する必要があります。これらのダンプ file刺激入力の前に宣言する必要があります。そうしないと、これらのダンプに値は保存されません。 files.

常にブロック

初期ステートメントとは対照的に、alwaysブロックは、実行がt = 0の時点で開始されますが、繰り返し実行されます。たとえば、ampクロック信号は、フリップフロップのようなシーケンシャル回路の動作に不可欠です。クロック信号は継続的に供給される必要があります。したがって、テストベンチでクロックの動作のコードを次のように記述できます (図 52 の 5 行目を参照)。

いつも
#10 クロック = ~クロック;
エンドモジュール

上記のステートメントは、t = 10 から 0 ns 後に実行されます。clk の値は、前の値から 10 ns 後に反転します。したがって、20 ns パルス幅のクロック信号が生成されます。したがって、このステートメントは周波数 50 MHz の信号を生成します。信号の初期化は always ブロックの前に行われることに注意することが重要です。初期化部分を実行しないと、clk 信号は t – 0 から x になり、10 ns 後に別の x に反転されます。

自己チェックテストベンチ

自己チェック テストベンチには、現在の状態をチェックするステートメントが含まれています。

  • $画面 システムタスクは主にシミュレーションの流れを追跡するためのデバッグメッセージを表示するために使用されます。

初期開始
A = 0 ; b = 0 ; c = 0; #10; // 入力を適用し、待機
if(y ! == 1) 開始
$display( “000 失敗”) ; //チェック
c = 1; #10 ; //入力を適用し、待機
終わり
そうでない場合 (y ! == 0) 開始
$display(“001 失敗”) // チェック
b = 1; c = 0; #10; 終了
そうでない場合(y!==0)
$display (“010 失敗”); //チェック
終わり
エンドモジュール

$画面 変数、文字列、または式の値を表示するために使用されます。上記の例からample、if-elseループのいずれかが満たされるたびに、シミュレータログにはそれぞれの$が表示されます。画面 ステートメント。文字列の末尾にはデフォルトで改行が付きます。

$画面 (「時間 = %t、A = %b、B = %b、C = % b」、$時間、A、B、C);

引用符で囲まれた文字はそのまま印刷されます。% に続く文字は文字列形式を表します。バイナリ データを表すには %b を使用します。10 進数、16 進数、8 進数を表すにはそれぞれ %d、%h、%o を使用できます。実数を表すには %g を使用します。これらは引用符の外側にある値に、記載された順序で置き換えられます。例:amp上記のステートメントは、シミュレーションログに次のように表示されます: time = 20、A = 0、B =1、C = 0

テーブル 1. Verilog テーブル形式

口論 説明
%h, %h 16進形式で表示
%d, %D 小数形式で表示
%b, %B バイナリ形式で表示
%m、%M 階層名を表示
%s、%S 文字列として表示
%t、%T 時間形式で表示
%f, %F 実数を10進数形式で表示します
%e, %E 'real' を指数形式で表示します

$画面 主にCのprintfのように、その時点のデータや変数をそのまま印刷します。$について言及する必要があります。画面 どのようなテキストでも view シミュレーションログに記録されます。

  • $時間

$時間 シミュレーションの現在の時刻を返すシステム タスクです。

  • $モニター

$モニター 書き込まれたデータや変数を監視し、変数が変更されるたびに印刷します。
変更された値を表示します。引数が取得されるたびに$displayを呼び出すのと同様の効果が得られます。
更新されました。$モニター メインスレッドのバックグラウンドで実行されるタスクのようなもので、監視と
引数変数の値の変更を表示します。$モニター $と同じ構文を持つ画面.

$モニター(「時間 = %t、A = %b、B = %b、C = % b」、$時間、A、B、C);
自己チェックテストベンチ

図7から、テストベンチを自己評価するための新しいコード行が追加されていることがわかります。$画面 および$モニター テストベンチの異なるセクションのステートメントによって、結果が異なります (図 8 を参照)。$時間 これらのステートメントで言及されているのは、値が印刷されている時間を印刷します。同時に、単位が170000であるとすると、$によってAとBの値に違いがあることがわかります。画面 および$モニター 声明。
自己チェックテストベンチ

GTKWave ソフトウェア

GTKWaveはフル機能のGTK+ウェーブです viewUnix、Win32、Mac OSX用のLXT、LXT2、VZT、FST、GHWを読み取るer file標準のVCD/EVCDと同様に filesと彼らの viewing。その公式 webサイトは http://gtkwave.sourceforge.net/ GTKWaveが推奨されます viewIcarus Verilog シミュレーション ツールによる er。

ユーザーが設計の機能をテストするためのテストベンチを正常に作成すると、ユーザーはGTKWaveソフトウェアを使用して view 波形。

GTKWaveソフトウェアを起動するには view 波形を表示するには、ツールバーの上部にある [テストベンチのシミュレーション] ボタンをクリックするか、メイン メニューから [ツール] → [シミュレーション] → [テストベンチのシミュレーション] を選択する必要があります。構文エラーがない場合、設計に応じて、GTKWave が自動的に起動するか、テストベンチの刺激の結果がウィンドウの [ロガー] セクションに表示されます。

GTKWaveソフトウェアは.vcd形式のダンプを開きますfile 自動的に表示されます。GTKWaveウィンドウは開いたときに波形を表示しません。これにより、ユーザーはどの信号を表示するかを選択できます。 view そして観察します。ユーザーが表示する必要のある信号を選択するには、ウィンドウの左側の SST タブにあるモジュール/インスタンスの名前をクリックする必要があります。各インスタンスの + をクリックすると、そのインスタンスに関連する信号が下部のセクションに表示されます。次に、目的の信号をドラッグ アンド ドロップするか、ダブルクリックして信号ウィンドウに表示します。すべて選択 (CTRL + A) して、信号ウィンドウに挿入することもできます (図 9 を参照)。
GTKWave ソフトウェア

信号は信号ウィンドウに追加されましたが、まだシミュレーションされていません。信号ウィンドウに必要な信号を追加したら、シンボル 信号を現在のウィンドウの幅に合わせてから、リロードから信号を再ロードするシンボル シンボルがツールバーに表示されます。信号とそれぞれの値を確認できるようになりました。

信号値

デフォルトでは、信号の値は 16 進数形式で、すべての波形は緑色で表示されます (正しく実行されている場合)。

ユーザーは、信号を右クリックしてデータ形式またはカラー形式を選択することで、これらの信号のプロパティを変更できます。また、信号グループの間にセクションを作るために空白の信号を挿入することもできます。希望する光学結果が得られたら、次の操作を行って設定を保存できます。 File → 書き込み保存 File.

GTKWave ツールバー

ツールバー (図 10 を参照) を使用すると、ユーザーは信号に関する基本的な機能を実行できます。ツールバーの各オプションについて左から右に説明します。
GTKWave ツールバー

  1. メニューオプション: このオプションでは view ソフトウェアを実際に操作するために使用できるソフトウェアのさまざまな機能すべて。このメニュー オプションの詳細については、このユーザー ガイドのセクション 8 で説明されています。
  2. カットトレース: 信号ウィンドウから選択信号を削除/カットするために使用されます
  3. コピートレース: シグナルウィンドウから選択したシグナルをコピーするために使用されます
  4. トレースを貼り付ける: コピー/切り取ったトレースは、信号ウィンドウの別の場所に貼り付けることができます。
  5. ズームフィット: ユーザーが表示するために選択したウィンドウのサイズに応じて信号を調整するために使用されます。
  6. ズームイン: 信号ウィンドウを拡大するために使用されます
  7. ズームアウト: 信号ウィンドウを縮小するために使用されます
  8. ズーム元に戻す: 信号ウィンドウのズームイン/ズームアウトを元に戻すために使用されます
  9. ズームして開始: 信号ウィンドウがズームされ、信号の開始時刻が表示されます。
  10. 最後までズーム: シグナルウィンドウを拡大し、シグナルの終了時間を表示します
  11. 前のエッジを検索: これにより、マーカーが左側に移動し、前のエッジを示します。
  12. 次のエッジを探す: マーカーが右に移動し、次のエッジを示します
  13. スクロール下/上結合: これを使って、ユーザーが表示したい時間枠を設定できます。例えばampたとえば、時間枠を 0 秒から 500 ns に設定すると、その期間内の信号のみが表示されます。
  14. リロード: 表示されている信号に変更があるたびにリロードが押されます。新しいパラメータに従って信号がリロードされ表示されます。例:ampつまり、信号の時間枠を変更した後、信号をリロードして、新しく設定した時間枠で信号を表示する必要があります。

メニューオプション

GTKWave ソフトウェアの左上隅から、11 本の縦線をクリックしてメニュー オプションにアクセスできます (図 XNUMX を参照)。メニュー オプションの下には、次のオプションがあります。
メニューオプション

File

の File サブメニューにはアクセスに関連するさまざまな項目が含まれています files、VCD のインポートとエクスポート files、印刷、および読み取り/書き込み files と終了します。

編集

編集サブメニューは、波形サブウィンドウの値のデータ表現を変更するなど、さまざまなユーティリティ機能を実行するために使用されます。編集サブメニューのオプションを使用すると、信号のデータ形式の変更、信号の並べ替え、シフト、トリミング、強調表示、信号のグループ化、信号へのコメント、信号の色の変更などを行うことができます。

検索

検索サブメニューは、ネット名と値の検索に使用します。VCD内の信号とインスタンスの異なる階層レベルで機能を実行するのに役立ちます。 file.

時間

時間サブメニューには、ナビゲーション ボタンとステータス パネル ボタンによって実行される機能のスーパーセットが含まれています。
ズーム、特定の時点への移動、特定の方向への信号のシフトなど、時間に関連したシンプルな機能を有効にします。

マーカー

マーカー サブメニューは、マーカーに対するさまざまな操作を実行したり、画面外のスクロール制御を行うために使用されます。
信号ウィンドウに多数のマーカーを追加する機能を有効にします。最大 26 個の名前マーカーが許可され、すべての時間は異なる必要があります。

aシグナルウィンドウにマーカーを追加するには
マーカーを配置する必要なポイントを左クリックし、ALT + N を押します。これにより、必要なポイントに名前付きマーカー (A、B、C など) が配置されます。ユーザーは、26 の異なる時間位置に対してこれを続けることができます。
すべての場所マーカーの時間値を比較するには、メニュー → マーカー → 変更マーカー データの表示を選択します。
これにより、各マーカーの時間値を示すウィンドウが開きます。ユーザーは配置された各マーカーの時間値を手動で記録し、それらを減算して 2 つのマーカー間の時間差を計算できます。
b信号ウィンドウのマーカーを削除するには

ユーザーはメニュー → マーカー → 名前付きマーカーの収集に移動できます。これにより、信号ウィンドウに配置された最後の名前付きマーカーが削除されます。ユーザーはメニュー → マーカー → 名前付きマーカーをすべて収集に移動して、すべての名前付きマーカーを削除できます (図 12)。
メニューオプション

図 13 では、信号の色がどのように変更されたかを確認できます。信号ウィンドウに「Blank Signal」というコメントとともに「Blank Signal」が追加されたことも確認できます。
また、6 つの名前付きマーカー (A ~ E) が存在し、これらのマーカー間の時間値が ps で計算されていることにも注意してください。
メニューオプション

View

の View サブメニューは、信号サブウィンドウのステータス項目や値のグラフィック表示に関するさまざまな属性を制御するために使用されます。このメニューから、信号ウィンドウを白黒またはカラーに変換することもできます。 View サブメニューでは、時間単位を秒(secs)からfs(fs)まで変更することもできます。ユーザーはこのオプションを見つけることができます。 View → 時間次元にスケール → fs。

ヘルプ

ヘルプ サブメニューには、オンライン ヘルプを有効にしたり、プログラムのバージョン情報を表示したりするためのオプションが含まれています。

結論

このドキュメントは、必要なテストベンチのドラフトを修正し、Icarus Verilog と GTKWave を使用して波形を表示し、結果を観察することで、ユーザーが設計を正常にシミュレートし、機能を検証できるように支援するために作成されました。

改訂履歴

リビジョン 日付 説明
1.00 20年2024月XNUMX日 初回リリース。

R19US0011EU0100 改訂1.0
20年2024月XNUMX日
© 2024 ルネサスエレクトロニクス
ロゴ

ドキュメント / リソース

RENESAS ForgeFPGA ソフトウェアシミュレーション [pdf] ユーザーガイド
REN_r19us0011eu0100、ForgeFPGA ソフトウェア シミュレーション、ForgeFPGA ソフトウェア、ForgeFPGA、ForgeFPGA シミュレーション、ソフトウェア シミュレーション、シミュレーション、ソフトウェア

参考文献

コメントを残す

あなたのメールアドレスは公開されません。 必須項目はマークされています *