Post on 25-Jan-2020
Artgraphics
実践 SystemVerilog入門
Document Identification Number: ARTG-TD-001-2019
Document Revision: 1.0, 2020.02.14
アートグラフィックス
篠塚一也
✓ SystemVerilog
実践 SystemVerilog入門
© 2020 アートグラフィックス
〒124-0012 東京都葛飾区立石 8-14-1
www.artgraphics.co.jp
A Practical Guide to Learning SystemVerilog
© 2020 Artgraphics. All rights reserved.
8-14-1, Tateishi, Katsushika-ku, Tokyo, 124-0012 Japan
www.artgraphics.co.jp
注意事項
弊社の技術資料の内容の一部、あるいは全部を無断で複写、複製、転載する事は、
禁じます。
弊社の技術資料の譲渡、転売、模倣、又は、改造等の行為を禁止致します。
はじめに
SystemVerilog の最新仕様は、2018 年 2 月 21 日に規格 IEEE Std 1800-2017(以降、LRM と略
称)として公開され、実質的に Verilog HDL(以降 Verilog と略称)時代に終末を告げ、
SystemVerilog の時代が到来したと言えます。SystemVerilog は Verilog の持つ曖昧性を除去す
ると共に Verilogが備えていない多くの機能を追加し、設計、及び検証分野での生産性向上と
品質向上を齎します。特に、SystemVerilog が備えるクラスは、検証技術の再利用性を高める
ためのデータタイプとして重要な役割を果たします。
SystemVerilogは、Verilogをサブセットとして位置付け、Verilogとの上位互換性を維持する事
を基本としています。例えば、Verilog シンタックスで記述したデザインを、変更せずに
SystemVerilogの環境でコンパイルする事ができます。然し、実行結果がVerilogシミュレータ
の結果と完全に一致する保証はありません。理由は、Verilog の曖昧性に起因します。Verilog
ではスケジューリングのセマンティックスが厳密ではないために、記述の仕方により実行結
果が大きく異なります。また、同じ記述でも、使用する Verilogシミュレータにより実行結果
が異なる事もあり得ます。Verilog と比較した時、SystemVerilog の大きな進歩はスケジューリ
ングのセマンティックスを厳密に定義した事と言えます。SystemVerilog を学習する際には、
先ず最初に、そのセマンティックスを理解しなければなりません。逆に言えば、スケジュー
リングセマンティックスを忠実に実践すれば、シミュレーション結果は期待した通りの動作
になる事を意味します。本書は、全体を通してこの事実を強調します。
既に述べた様に、SystemVerilog には多くの機能が追加されました。とりわけ、SystemVerilog
の豊富なデータタイプは検証作業の実践面での改革を余儀なくさせます。例えば、従来のモ
ジュールベースのテストベンチではなく、汎用化に適した SystemVerilog クラスを使用した検
証環境構築法は生産性向上と再利用可能性を促進し、検証技術をライブラリーとして蓄積す
る事を可能にします。従い、SystemVerilogでは従来とは異なる発想が求められます。
LRM は 1300 ページに及ぶ大作であり、読破するには相当の覚悟と時間が必要です。本来、
誰もが言語仕様書を読まなければならないのですが、LRM が容易に理解できる英文では書か
れていない事実を考えると、少数の技術者のみが読破し得ると思えます。一方、日本国内に
は LRM を解説した良書が皆無である事実は、国内における SystemVerilog の普及を妨げてい
る大きな障害の一つと言えると考えられます。
Verilog から SystemVerilog への移行、或いは設計及び検証分野の主言語として SystemVerilog
を採用する事は時代の趨勢であると受け止めなければなりません。従って、ハードウェア設
計検証技術者にとっては、SystemVerilog に関する実践的な知識を習得する事は、必然的な義
務となっています。本書は、こうした状況を鑑みて誕生しました。
本書は、単なる SystemVerilog の解説書では無く、言語の持つ機能を基礎から解説して、実践
で使用するための知識を提供する事を主眼にしています。本書は、LRM に書かれてある重要
な章を殆ど含んでいるため、決して入門書とは言えないかも知れません。然し、記述スタイ
ルは初心者を対象にしているので、本書の内容を理解する事は困難ではないと思います。
本書の構成は、LRM の構成を尊重する様に構成されているので、本書を読みながら LRM を
参照する事は比較的容易です。本書の内容は、LRM のエッセンスを簡潔明瞭に解説した資料
ではありますが、更に詳細な知識を得るためには LRMを参照するのが最も望ましい事です。
本書は、概要を含めて 27章から構成され、SystemVerilog言語全般の解説と検証機能全般の解
説をカバーしています。SystemVerilog言語全般では、Verilogとの差異、SystemVerilogに追加
された機能等を中心にして解説を進め、検証機能全般ではランダムスティミュラスの生成、
ファンクショナルカバレッジ、アサーション、UVMを解説しています。要約すると、本書を
読了後は SystemVerilog の基礎的な知識から検証技術の基礎知識までを習得する事ができます。
特に、最近知られ始めている検証手法 UVM の解説は検証技術を見直す好機になると確信し
ています。UVMは、SystemVerilogが備える殆ど全ての機能を利用して構築された優れた検証
実践 SystemVerilog入門
2
Copyright 2020 © Artgraphics. All rights reserved.
パッケージです。従って、UVM を理解する事は SystemVerilog に関する理解を深める事に繋
がります。UVMは決して簡単に理解できる概念ではありませんが、たとえ検証作業に関わり
がない読者でも UVM に関する基礎知識を習得する事を勧めます。知識習得の努力が報われ
る日が必ずやって来ます。
本書は多くの章から構成されてはいますが、第 5 章までの内容を順に読んだ後は、他の章を
選択して学習する事ができます。目的と必要性に応じて主題を選択して効果的に学習を進め
て下さい。
本書の特徴の一つは、多くの例題でシミュレーション結果を示している事です。シミュレー
ション結果を示す理由は、記述した機能がどの様な効果を齎すかを正確に伝えるためです。
同時に、予想外の結果を齎す事が有り得る事を示すためでもあります。即ち、単なる機能の
説明に終わらず、予想される帰結を如実に示す事により、実践で遭遇し得る問題を未然に防
ぐための基礎技術を研磨する機会としています。
また、紙面の都合上、一部の記述は小さな書体で記述されています。
アートグラフィックス
篠塚一也
実践 SystemVerilog入門
1
Copyright 2020 © Artgraphics. All rights reserved.
変更履歴
日付 Revision 変更点
2020.02.14 1.0 初版。
実践 SystemVerilog入門
1
Copyright 2020 © Artgraphics. All rights reserved.
目次
1 概要 ............................................................................................................................... 1
1.1 SYSTEMVERILOGの歴史 .............................................................................................. 1
1.2 SYSTEMVERILOG概要 ................................................................................................. 1
1.2.1 言語としての SystemVerilog .............................................................................. 1
1.2.2 設計言語としての SystemVerilog ....................................................................... 2
1.2.3 検証言語としての SystemVerilog ....................................................................... 3
1.3 本書の対象者と目的 .................................................................................................... 3
1.4 本書の構成 .................................................................................................................. 4
1.5 例題に関して ............................................................................................................... 5
1.6 本書の記法 .................................................................................................................. 5
2 設計及び検証のためのビルディングブロック ................................................................. 9
2.1 設計要素 ...................................................................................................................... 9
2.2 モジュール .................................................................................................................. 9
2.3 プログラム ................................................................................................................ 10
2.4 インターフェース ..................................................................................................... 11
2.5 チェッカー ................................................................................................................ 12
2.6 パッケージ ................................................................................................................ 13
2.7 ゲートとスィッチレベルのモデリング ..................................................................... 14
2.8 PRIMITIVE .................................................................................................................. 16 2.9 CONFIGURATION ........................................................................................................ 16
2.10 コンパイルユニット .............................................................................................. 16
2.11 `TIMESCALEコンパイラーダイレクティブ................................................................ 17
2.12 VERILOGから SYSTEMVERILOGへの移行 ................................................................. 19
2.12.1 背景と動機 ..................................................................................................... 19
2.12.2 Verilogから SystemVerilogへの変換 .............................................................. 19 2.12.2.1 組み合わせ回路 ....................................................................................................... 19 2.12.2.2 シーケンシャル回路 ................................................................................................ 21
3 データタイプ ............................................................................................................... 22
3.1 データタイプとデータオブジェクト......................................................................... 22
3.2 LOGIC型 .................................................................................................................... 23
3.3 ネット型 .................................................................................................................... 23
3.4 変数 ........................................................................................................................... 25
3.5 単数系と集合系 ......................................................................................................... 26
3.6 ネットと変数 ............................................................................................................. 27
3.7 4-STATE型 ................................................................................................................. 28
3.8 2-STATE 型 ................................................................................................................. 28
3.9 INTEGRALデータタイプ ............................................................................................ 30
3.10 REAL、SHORTREALと REALTIME............................................................................... 30
3.11 VOID型 ...................................................................................................................... 30
3.12 CHANDLE型 .............................................................................................................. 31
3.13 クラス .................................................................................................................... 31
3.14 STRINGデータタイプ ................................................................................................ 31
3.15 イベントデータタイプ ........................................................................................... 33
3.16 TYPEDEF .................................................................................................................... 35 3.17 ENUMデータタイプ .................................................................................................. 36
3.18 定数 ........................................................................................................................ 40
3.19 CAST オペレータ ....................................................................................................... 43
3.20 $CAST ダイナミック型変換 ....................................................................................... 43
実践 SystemVerilog入門
2
Copyright 2020 © Artgraphics. All rights reserved.
3.21 便利な初期値設定 .................................................................................................. 44
3.21.1 リテラルの拡張 .............................................................................................. 44
3.21.2 インデックス指定 ........................................................................................... 45
3.22 リファレンスポインター ....................................................................................... 46
4 メンバーで構成されるデータタイプ ............................................................................. 48
4.1 ストラクチャ ............................................................................................................. 48
4.1.1 Packed ストラクチャ ........................................................................................ 50
4.1.2 ストラクチャへの値の設定 ................................................................................ 51
4.2 ユニオン .................................................................................................................... 51
4.2.1 Packedユニオン ................................................................................................ 53
4.2.2 タグ付きユニオン .............................................................................................. 53
4.3 PACKED アレイと UNPACKEDアレイ ........................................................................ 54
4.3.1 Packed アレイ ................................................................................................... 54
4.3.2 Unpacked アレイ .............................................................................................. 55
4.3.3 アレイの操作 ..................................................................................................... 56
4.3.4 packedアレイのアクセス .................................................................................. 58
4.4 ダイナミックアレイ .................................................................................................. 58
4.4.1 ダイナミックアレイのメソッド ........................................................................ 59
4.4.2 アレイのコピー .................................................................................................. 61
4.5 ASSOCIATIVE アレイ .................................................................................................. 62
4.5.1 Associativeアレイの概要 .................................................................................. 62
4.5.2 Associativeアレイの要素の登録 ....................................................................... 63
4.5.3 Associative アレイの関数 .................................................................................. 64
4.5.4 Associativeアレイリテラル .............................................................................. 65
4.6 キュー ........................................................................................................................ 66
4.6.1 キューの概要 ..................................................................................................... 66
4.6.2 キューの操作 ..................................................................................................... 67
4.6.3 キューを操作する関数 ....................................................................................... 69
4.7 アレイ情報取得関数 .................................................................................................. 71
4.8 アレイ操作関数 ......................................................................................................... 72
4.8.1 アレイ検索関数 .................................................................................................. 72
4.8.2 アレイ要素の順序を操作する関数 ..................................................................... 74
4.8.3 アレイを計算する関数 ....................................................................................... 75
4.9 アレイの走査法 ......................................................................................................... 76
5 クラス .......................................................................................................................... 78
5.1 クラスの概要 ............................................................................................................. 78
5.2 シンタックス ............................................................................................................. 79
5.3 クラスオブジェクト(クラスインスタンス) .......................................................... 81
5.4 クラスプロパーティ及びメソッドへのアクセス ...................................................... 81
5.5 コンストラクタ ......................................................................................................... 82
5.6 タイプ指定のコンストラクタ呼び出し ..................................................................... 82
5.7 STATICクラスプロパーティ ...................................................................................... 83
5.8 STATICクラスメソッド ............................................................................................. 84
5.9 THISハンドル ........................................................................................................... 85
5.10 ハンドルのアレイ .................................................................................................. 85
5.11 クラスのコピー ..................................................................................................... 87
5.12 クラスインヘリタンスとサブクラス ..................................................................... 88
5.13 $CAST......................................................................................................................... 91
5.14 VIRTUALメソッド ..................................................................................................... 92
5.15 アブストラクトクラスとピュアバーチャルメソッド ........................................... 94
5.16 クラススコープオペレータ ................................................................................... 95
実践 SystemVerilog入門
3
Copyright 2020 © Artgraphics. All rights reserved.
5.17 メンバーへのアクセス制限 ................................................................................... 97
5.18 メソッドをクラスの外に記述する方法 ................................................................. 98
5.19 パラメータによる汎用クラスの定義 ..................................................................... 99
5.19.1 概要 ................................................................................................................ 99
5.19.2 パラメータによる汎用クラスの実装例 .......................................................... 99
5.19.3 パラメータによる汎用クラスの開発手順 .................................................... 101
5.19.4 Quicksort ......................................................................................................... 102
5.20 クラスのフォワード宣言 ..................................................................................... 104
5.21 インターフェースクラス ..................................................................................... 105
5.21.1 概要 .............................................................................................................. 105
5.21.2 機能 .............................................................................................................. 106
5.22 ガーベッジコレクション ..................................................................................... 108
5.22.1 概要 .............................................................................................................. 108
5.22.2 automatic変数 ................................................................................................ 108
5.22.3 static変数 ........................................................................................................ 109
6 プロセス .................................................................................................................... 110
6.1 シミュレーションプロシージャ .............................................................................. 110
6.1.1 initialプロシージャ ........................................................................................ 110
6.1.2 alwaysプロシージャ ....................................................................................... 111 6.1.2.1 組み合わせ回路とセンシティビティリスト .............................................................. 111 6.1.2.2 シーケンシャル回路と alwaysプロシージャ ............................................................ 112 6.1.2.3 always_combプロシージャ ...................................................................................... 113 6.1.2.4 always_latchプロシージャ ...................................................................................... 114 6.1.2.5 always_ffプロシージャ ............................................................................................ 115
6.1.3 finalプロシージャ ........................................................................................... 117
6.2 ブロック文 .............................................................................................................. 117
6.2.1 begin-endブロック ......................................................................................... 118
6.2.2 fork-joinブロック ............................................................................................ 119
6.2.3 ブロック名 ....................................................................................................... 123
6.2.4 forkブロックの効果的利用 ............................................................................. 123
6.3 タイミングによる実行制御 ..................................................................................... 124
6.3.1 タイミングによる実行制御の概要 ................................................................... 124
6.3.2 ディレーによる制御 ......................................................................................... 125
6.3.3 エッジセンシティブイベント制御 ................................................................... 125 6.3.3.1 機能 ........................................................................................................................... 125 6.3.3.2 エッジセンシティブイベント制御の注意点 .............................................................. 127
6.3.4 代入内タイミング制御 ..................................................................................... 129
6.3.5 レベルセンシティブイベント制御 ................................................................... 132
6.3.6 シーケンスによるイベント制御 ...................................................................... 132
6.4 プロセス制御 ........................................................................................................... 134
6.4.1 wait fork文 ...................................................................................................... 134
6.4.2 disable fork文 ................................................................................................. 135
6.4.3 wait_order文 ................................................................................................... 135
6.5 プロセスと RNG ..................................................................................................... 137
6.6 ユーザ固有のプロセス制御 ..................................................................................... 138
7 代入文 ........................................................................................................................ 141
7.1 連続代入文 .............................................................................................................. 141
7.2 ビヘイビア代入文 ................................................................................................... 143
7.2.1 ブロッキング代入文 ......................................................................................... 143
7.2.2 ノンブロッキング代入文 ................................................................................. 144 7.2.2.1 機能 ........................................................................................................................... 144 7.2.2.2 代入文の効果の確認 .................................................................................................. 145
実践 SystemVerilog入門
4
Copyright 2020 © Artgraphics. All rights reserved.
7.2.2.3 左辺に関する制限...................................................................................................... 146
7.3 パターン指定による代入 ......................................................................................... 147
7.4 アレイパターン指定代入文 ..................................................................................... 148
7.5 ストラクチャパターン指定代入文 .......................................................................... 148
7.6 UNPACKED アレイの初期化 ..................................................................................... 150
8 オペレータと式 .......................................................................................................... 152
8.1 オペレータ .............................................................................................................. 152
8.1.1 代入オペレータ ................................................................................................ 153
8.1.2 インクリメント及びデクリメントオペレータ ................................................. 153
8.1.3 冪乗 .................................................................................................................. 154
8.1.4 比較オペレータ ................................................................................................ 154
8.1.5 ワイルドカード比較オペレータ ...................................................................... 155
8.1.6 logicalオペレータ ........................................................................................... 157
8.1.7 bitwiseオペレータ .......................................................................................... 157
8.1.8 計算オペレータ ................................................................................................ 159
8.1.9 shiftオペレータ ............................................................................................... 160
8.1.10 conditionalオペレータ .................................................................................... 161
8.1.11 結合オペレータ ............................................................................................ 162
8.1.12 insideオペレータ ............................................................................................ 163
8.1.13 ビットストリームオペレータ....................................................................... 164
8.2 オペランド .............................................................................................................. 166
8.2.1 パートセレクト ................................................................................................ 166
8.2.2 unpackedアレイ ............................................................................................. 167
8.3 タグ付きメンバーの操作 ......................................................................................... 168
9 実行文 ........................................................................................................................ 169
9.1 IF文 ......................................................................................................................... 169
9.1.1 全ての条件を列挙 ............................................................................................ 169
9.1.2 unique-if、unique0-if文 ................................................................................. 169
9.1.3 priority-if文 .................................................................................................... 170
9.2 CASE文 .................................................................................................................... 171
9.2.1 unique-case、unique0-case文 ....................................................................... 172
9.2.2 priority-case文 ................................................................................................ 173
9.2.3 insideオペレータと if文及び case文 ............................................................. 173 9.2.3.1 if文と insideオペレータ .......................................................................................... 173 9.2.3.2 case文と insideオペレータ ...................................................................................... 173
9.2.1 casezと casex .................................................................................................. 174
9.3 ループ文 .................................................................................................................. 175
9.3.1 for文 ................................................................................................................ 175
9.3.2 repeat文 .......................................................................................................... 176
9.3.3 foreach文 ........................................................................................................ 177
9.3.4 while文 ............................................................................................................ 179
9.3.5 do-while文....................................................................................................... 180
9.3.6 forever文 ......................................................................................................... 180
9.4 RETURN文 ............................................................................................................... 181
9.5 BREAK文 .................................................................................................................. 182
9.6 CONTINUE文............................................................................................................ 183
10 タスクとファンクション ......................................................................................... 185
10.1 タスク .................................................................................................................. 185
10.1.1 ポートリスト ................................................................................................ 185
10.1.2 タスク内の記述 ............................................................................................ 185
実践 SystemVerilog入門
5
Copyright 2020 © Artgraphics. All rights reserved.
10.2 ファンクション ................................................................................................... 186
10.2.1 ファンクションの制限 ................................................................................. 186
10.2.2 ポートリスト ................................................................................................ 186
10.2.3 ファンクション内の記述 .............................................................................. 187
10.2.4 ファンクション内でタイミング制御を行う方法.......................................... 188
10.3 引数に標準値を指定する方法 .............................................................................. 189
10.4 値を戻すファンクションの使用 .......................................................................... 190
10.5 値を戻さないファンクションの使用 ................................................................... 190
10.6 再帰呼び出し ....................................................................................................... 191
10.7 クラスのメソッドと再帰呼び出し ...................................................................... 192
10.8 メソッド内での変数の初期化 .............................................................................. 192
10.9 引数としてのアレイ ............................................................................................ 194
10.10 インポートとエクスポート ................................................................................. 195
11 クロッキングブロック ............................................................................................ 197
11.1 最も簡単なクロッキングブロック ...................................................................... 197
11.2 クロッキングスキュー ......................................................................................... 198
11.3 クロッキングイベントと OBSERVED領域 ........................................................... 200
11.4 サイクルディレー ................................................................................................ 201
12 プロセス間の同期と交信 ......................................................................................... 203
12.1 セマフォ .............................................................................................................. 203
12.2 メールボックス ................................................................................................... 206
12.3 パラメータ化したメールボックス ...................................................................... 210
12.4 名称付きイベント ................................................................................................ 211
12.4.1 概要 .............................................................................................................. 211
12.4.2 triggered .......................................................................................................... 213 12.4.3 引数としてのイベントオブジェクト ............................................................ 215
12.4.4 イベント資源の解放 ..................................................................................... 216
12.4.5 イベントの比較 ............................................................................................ 216
12.4.6 イベントの別名 ............................................................................................ 217
13 チェッカー ............................................................................................................. 218
13.1 概要 ...................................................................................................................... 218
13.2 チェッカーインスタンス ..................................................................................... 218
13.3 自由変数 .............................................................................................................. 220
14 プログラム ............................................................................................................. 222
14.1 シンタックス ....................................................................................................... 222
14.2 プログラムの特徴 ................................................................................................ 223
14.3 プログラムの制御 ................................................................................................ 225
14.4 シミュレーションの終了 ..................................................................................... 225
14.5 テストベンチ ....................................................................................................... 226
15 インターフェース ................................................................................................... 228
15.1 シンタックス ....................................................................................................... 228
15.2 インターフェースの機能概要 .............................................................................. 229
15.3 ジェネリックインターフェースに依る接続 ........................................................ 230
15.4 MODPORT ................................................................................................................. 230 15.5 パラメータ化したインターフェース ................................................................... 232
15.6 VIRTUAL インターフェース ..................................................................................... 233
15.7 インターフェース使用例 ..................................................................................... 234
15.7.1 概要 .............................................................................................................. 234
実践 SystemVerilog入門
6
Copyright 2020 © Artgraphics. All rights reserved.
15.7.2 simple_if .......................................................................................................... 235 15.7.3 driver ............................................................................................................... 235 15.7.4 collector ........................................................................................................... 236 15.7.5 dut.................................................................................................................... 236 15.7.6 top .................................................................................................................... 236 15.7.7 実行結果 ....................................................................................................... 237
16 パッケージ ............................................................................................................. 238
16.1 シンタックス ....................................................................................................... 238
16.2 パッケージの定義法 ............................................................................................ 239
16.3 パッケージの使用法 ............................................................................................ 239
16.4 STDパッケージ ........................................................................................................ 242
17 モジュール ............................................................................................................. 246
17.1 概要 ...................................................................................................................... 246
17.2 モジュールの定義 ................................................................................................ 247
17.3 ポートリスト ....................................................................................................... 249
17.3.1 Verilogスタイルと SystemVerilogスタイル.................................................. 249
17.3.2 ポートの方向に関するルール....................................................................... 249
17.4 モジュール記述例 ................................................................................................ 250
17.4.1 一般的な記述 ................................................................................................ 251
17.4.2 組み合わせ回路の検証 ................................................................................. 252 17.4.2.1 組み合わせ回路のセンシティビティリスト .......................................................... 252 17.4.2.2 組み合わせ回路を検証するタイミング ................................................................. 253
17.4.3 組み合わせ回路 ............................................................................................ 254 17.4.3.1 コンパレータ ......................................................................................................... 254 17.4.3.2 デコーダー ............................................................................................................ 255 17.4.3.3 エンコーダー ......................................................................................................... 256 17.4.3.4 Grayコード .......................................................................................................... 257
17.4.4 シーケンシャル回路の検証 .......................................................................... 258 17.4.4.1 シーケンシャル回路を検証するタイミング .......................................................... 258 17.4.4.2 シーケンシャル回路のレスポンス......................................................................... 259
17.4.5 シーケンシャル回路の検証手順 ................................................................... 259
17.4.6 シーケンシャル回路 ..................................................................................... 260 17.4.6.1 バイナリーカウンター .......................................................................................... 260 17.4.6.2 ラッチ ................................................................................................................... 262 17.4.6.3 インターフェースを使用する記述例 ..................................................................... 264 17.4.6.4 JK―フリップフロップ .......................................................................................... 265 17.4.6.5 バレルシフタ ......................................................................................................... 267 17.4.6.6 データシフタ ......................................................................................................... 268 17.4.6.7 Gated clockの記述例 ............................................................................................ 269
17.4.7 FSM ................................................................................................................. 270 17.4.7.1 概要 ....................................................................................................................... 270 17.4.7.2 Mealy FSM ........................................................................................................... 271 17.4.7.3 Moore FSM ........................................................................................................... 273
17.4.8 refポートの使用 .............................................................................................. 275
17.4.9 inoutポートを持つシーケンシャル回路 ......................................................... 275
17.5 パラメータ化したモジュール .............................................................................. 277
17.6 トップレベルモジュール ..................................................................................... 278
17.7 モジュールインスタンス ..................................................................................... 279
17.8 未定義モジュールの宣言 ..................................................................................... 279
17.9 階層名称 .............................................................................................................. 280
18 ジェネレート .......................................................................................................... 283
18.1 概要 ...................................................................................................................... 283
実践 SystemVerilog入門
7
Copyright 2020 © Artgraphics. All rights reserved.
18.2 使用法 .................................................................................................................. 284
19 システムタスクとシステム関数 .............................................................................. 287
19.1 DISPLAY及び WRITEタスク ..................................................................................... 287
19.2 $SFORMATと$SFORMATF ........................................................................................ 289
19.3 モニタリング ....................................................................................................... 289
19.4 シミュレーション時間取得関数 .......................................................................... 290
19.5 $PRINTTIMESCALE ................................................................................................... 291
19.6 値変換 .................................................................................................................. 292
19.7 情報取得関数 ....................................................................................................... 292
19.8 ビット VECTORシステム関数 .............................................................................. 295
19.9 サンプル値を参照するための関数 ...................................................................... 296
19.10 エラー処理タスク ................................................................................................ 298
19.11 確率分布関数 ....................................................................................................... 299
19.12 シミュレーション制御 ......................................................................................... 300
19.13 その他のシステムタスク及びシステム関数 ........................................................ 300
19.14 コマンドラインの操作 ......................................................................................... 301
19.15 VCDファイル ..................................................................................................... 302
19.15.1 VCDファイルの指定 ................................................................................... 303
19.15.2 VCDファイルへの記録 ................................................................................ 303
19.15.3 VCDファイルへの記録の一時的停止と再開 ............................................... 303
19.15.4 VCDファイル作成例 ................................................................................... 304
20 制約によるランダムスティミュラスの生成 ............................................................. 305
20.1 概要 ...................................................................................................................... 305
20.2 ランダム変数 ....................................................................................................... 306
20.2.1 ランダム変数の概要 ..................................................................................... 306
20.2.2 rand修飾子 ...................................................................................................... 307
20.2.3 randc修飾子 .................................................................................................... 307
20.2.4 randと randcの使用例 ................................................................................... 307
20.3 制約 ...................................................................................................................... 308
20.3.1 insideオペレータ ............................................................................................ 309
20.3.2 distオペレータ ................................................................................................ 311
20.3.3 uniqueオペレータ ........................................................................................... 314
20.3.4 implicationオペレータ ................................................................................... 316
20.3.5 if-else制約 ....................................................................................................... 317
20.3.6 foreach制約 ..................................................................................................... 319
20.3.7 乱数決定順序 ................................................................................................ 320
20.4 乱数発生関数 ....................................................................................................... 322
20.5 実行時に制約を定義する方法 .............................................................................. 324
20.6 ランダム変数の制御 ............................................................................................ 325
20.7 制約の制御 ........................................................................................................... 326
20.8 RANDOMIZE()関数によるランダム変数の制御 ........................................................ 327
20.9 条件の否定 ........................................................................................................... 328
20.10 ストラクチャ ....................................................................................................... 329
20.11 キューに乱数を発生 ............................................................................................ 330
20.12 チェッカーとしての制約 ..................................................................................... 331
20.13 制約をテストケース毎に指定する方法 ............................................................... 333
20.14 制約をクラス外部に定義する方法 ...................................................................... 334
20.15 STD::RANDOMIZE() ................................................................................................ 335 20.16 システム関数 ....................................................................................................... 336
20.17 RANDCASE ............................................................................................................ 337
実践 SystemVerilog入門
8
Copyright 2020 © Artgraphics. All rights reserved.
21 ファンクショナルカバレッジ .................................................................................. 339
21.1 概要 ...................................................................................................................... 339
21.2 カバレッジモデルの定義 ..................................................................................... 340
21.2.1 シンタックス ................................................................................................ 340
21.2.2 カバーグループへの引数 .............................................................................. 341
21.2.3 サンプリングのタイミング指定 ................................................................... 341
21.2.4 サンプリング関数 ......................................................................................... 341
21.2.5 クラス外でのカバレッジ定義....................................................................... 342
21.2.6 カバレッジレポート ..................................................................................... 343
21.2.7 簡単な使用例 ................................................................................................ 343
21.3 カバーポイントの定義 ......................................................................................... 344
21.3.1 カバレッジビンの定義 ................................................................................. 345 21.3.1.1 固定数のビン ......................................................................................................... 345 21.3.1.2 それぞれの値にビンを確保する方法 ..................................................................... 345 21.3.1.3 唯一つのビン ......................................................................................................... 346 21.3.1.4 autoビン ............................................................................................................... 346 21.3.1.5 defaultビン .......................................................................................................... 347 21.3.1.6 illegal_bins ........................................................................................................... 347 21.3.1.7 ignore_bins ........................................................................................................... 348
21.3.2 カバーポイントの使用例 .............................................................................. 348
21.3.3 信号値の遷移 ................................................................................................ 355
21.3.4 式のカバレッジ ............................................................................................ 357
21.3.5 制約とカバレッジ ......................................................................................... 359
21.4 クロスカバレッジ ................................................................................................ 360
21.5 自動カバレッジ収集 ............................................................................................ 362
21.5.1 カバレッジ計算と検証コンポーネント ........................................................ 362
21.5.2 カバーグループの定義 ................................................................................. 363
21.5.3 カバレッジのサンプリング .......................................................................... 363
21.5.4 自動カバレッジ収集例 ................................................................................. 363 21.5.4.1 simple_if ............................................................................................................... 364 21.5.4.2 simple_item .......................................................................................................... 364 21.5.4.3 simple_component ............................................................................................... 365 21.5.4.4 simple_driver ....................................................................................................... 365 21.5.4.5 simple_generator ................................................................................................. 366 21.5.4.6 simple_collector .................................................................................................... 366 21.5.4.7 simple_monitor .................................................................................................... 367 21.5.4.8 dut ........................................................................................................................ 367 21.5.4.9 top ......................................................................................................................... 367 21.5.4.10 自動カバレッジ取集のまとめ ................................................................................ 368
22 アサーション .......................................................................................................... 369
22.1 概要 ...................................................................................................................... 369
22.1.1 アサーションとは何か? .............................................................................. 369
22.1.2 アサーションの種類 ..................................................................................... 370
22.1.3 サンプリング ................................................................................................ 370
22.1.4 アサーションクロック ................................................................................. 370
22.1.5 アサーションの式 ......................................................................................... 371
22.2 即時実行型アサーション ..................................................................................... 371
22.3 並列型アサーション ............................................................................................ 372
22.3.1 概要 .............................................................................................................. 372
22.3.2 assert文 ........................................................................................................... 373
22.3.3 assume文 ........................................................................................................ 373
22.3.4 cover文 ............................................................................................................ 373
22.3.5 restrict文 ........................................................................................................ 374
22.4 IMPLICATION オペレータ ......................................................................................... 374
実践 SystemVerilog入門
9
Copyright 2020 © Artgraphics. All rights reserved.
22.4.1 機能 .............................................................................................................. 374
22.4.2 vacuous passの抑止 ........................................................................................ 375
22.5 アサーションスレッドダイアグラム ................................................................... 376
22.6 シーケンス ........................................................................................................... 376
22.6.1 シーケンスの定義 ......................................................................................... 376
22.6.2 シーケンス式の結合 ..................................................................................... 377
22.6.3 クロッキングイベント ................................................................................. 378
22.6.4 レベルセンシティブ とエッジセンシティブ ................................................ 378
22.6.5 triggered()メソッド ......................................................................................... 379
22.6.6 シーケンスの操作 ......................................................................................... 380 22.6.6.1 ##m ....................................................................................................................... 381 22.6.6.2 ##[m:n] ................................................................................................................. 382 22.6.6.3 [*m] ....................................................................................................................... 383 22.6.6.4 [*m:n] .................................................................................................................... 385 22.6.6.5 [=m] ...................................................................................................................... 386 22.6.6.6 [->m] .................................................................................................................... 387 22.6.6.7 sig throughout seq ............................................................................................... 389 22.6.6.8 seq1 within seq2................................................................................................... 390 22.6.6.9 seq1 and seq2 ....................................................................................................... 391 22.6.6.10 seq1 or seq2 .......................................................................................................... 393 22.6.6.11 seq1 intersect seq2 ............................................................................................... 394
22.7 プロパーティ(PROPERTIES) ............................................................................ 396
22.7.1 概要 .............................................................................................................. 396
22.7.2 シーケンスとプロパーティ .......................................................................... 397
22.8 プロパーティオペレータ ..................................................................................... 397 22.8.1.1 #=# ........................................................................................................................ 399 22.8.1.2 s_always [constant_range] .................................................................................. 400 22.8.1.3 until ...................................................................................................................... 401
22.9 マルチクロック ................................................................................................... 403
23 UVM ...................................................................................................................... 405
23.1 概要 ...................................................................................................................... 405
23.1.1 UVMとは何か? ............................................................................................. 405
23.1.2 検証技術のトレンド ..................................................................................... 405
23.1.3 UVMテストベンチの構成 ............................................................................... 407
23.1.4 UVMの構成..................................................................................................... 408 23.1.4.1 uvm_pkg ............................................................................................................... 408 23.1.4.2 uvm_object ........................................................................................................... 408 23.1.4.3 UVMマクロ .......................................................................................................... 408
23.1.5 ソースコードの準備 ..................................................................................... 409 23.1.5.1 インクルード ......................................................................................................... 409 23.1.5.2 uvm_pkgのインポート ......................................................................................... 409
23.2 TLM ........................................................................................................................ 410
23.2.1 概要 .............................................................................................................. 410
23.2.2 トランザクション ......................................................................................... 410
23.2.3 UVMコンポーネント間の通信........................................................................ 411 23.2.3.1 概要 ....................................................................................................................... 411 23.2.3.2 put操作 ................................................................................................................ 412 23.2.3.3 get操作 ................................................................................................................. 416 23.2.3.4 uvm_tlm_fifo ........................................................................................................ 420 23.2.3.5 analysis-portsと analysis-exports....................................................................... 423
23.3 代表的な UVMクラス ......................................................................................... 427
23.3.1 トランザクション関連の UVMクラス ........................................................ 427
23.3.2 メソドロジークラス ..................................................................................... 428
23.4 VIRTUAL インターフェース .................................................................................... 428
23.5 UVMシミュレーション制御 .................................................................................. 429
実践 SystemVerilog入門
10
Copyright 2020 © Artgraphics. All rights reserved.
23.5.1 シミュレーションフェーズ .......................................................................... 429
23.5.2 シミュレーションフェーズと super.method () ........................................... 431
23.5.3 サブコンポーネント作成とシミュレーションフェーズ ............................... 432
23.5.4 コンポーネント階層の情報取得関数 ............................................................ 433
23.5.5 シミュレーションの進行 .............................................................................. 433 23.5.5.1 raise_objection()と drop_objection() .................................................................... 433 23.5.5.2 raise_objection()と drop_objection()の使用例 ...................................................... 434
23.5.6 run_test ........................................................................................................... 436 23.5.6.1 概要 ....................................................................................................................... 436 23.5.6.2 使用法 ................................................................................................................... 436 23.5.6.3 run_test()と$finish ............................................................................................... 438
23.6 UVMクラスライブラリーの基礎 ........................................................................... 440
23.6.1 uvm_objectと uvm_component ...................................................................... 440
23.6.2 コンストラクタ ............................................................................................ 440
23.6.3 フィールドマクロ ......................................................................................... 441 23.6.3.1 トランザクション.................................................................................................. 441 23.6.3.2 メソドロジークラス .............................................................................................. 442
23.6.4 ファクトリ ................................................................................................... 442
23.6.5 コンフィギュレーションの設定変更 ............................................................ 444
23.6.6 メッセージ機能 ............................................................................................ 446
23.6.7 UVMプリンター ............................................................................................. 447
23.7 検証要素の定義 ................................................................................................... 448
23.7.1 トランザクション ......................................................................................... 448
23.7.2 ドライバー ................................................................................................... 450 23.7.2.1 概要 ....................................................................................................................... 450 23.7.2.2 ドライバー記述法.................................................................................................. 451
23.7.3 シーケンス ................................................................................................... 452 23.7.3.1 概要 ....................................................................................................................... 452 23.7.3.2 シーケンスの定義手順 .......................................................................................... 452 23.7.3.3 body()タスク ......................................................................................................... 453 23.7.3.4 `uvm_doマクロと`uvm_do_withマクロ .............................................................. 453 23.7.3.5 raise_objection()と drop_objection() .................................................................... 453 23.7.3.6 pre_body()と post_body()...................................................................................... 454 23.7.3.7 シーケンス定義例.................................................................................................. 455
23.7.4 シーケンサー ................................................................................................ 458 23.7.4.1 シーケンサーの定義 .............................................................................................. 458 23.7.4.2 シーケンサーとドライバーの基本的なハンドシェーク ........................................ 459 23.7.4.3 シーケンスの開始.................................................................................................. 460
23.7.5 モニターとコレクター ................................................................................. 460 23.7.5.1 コレクターの定義.................................................................................................. 460 23.7.5.2 モニターの定義 ..................................................................................................... 461
23.7.6 エージェント ................................................................................................ 462
23.7.7 エンバイロンメント ..................................................................................... 463
23.7.8 テストベンチの作成 ..................................................................................... 465 23.7.8.1 トップレベルの Environmentの作成 ................................................................... 465 23.7.8.2 ベーステスト ......................................................................................................... 466 23.7.8.3 テスト ................................................................................................................... 466 23.7.8.4 テストの選択 ......................................................................................................... 467
23.8 UVMによる検証環境構築例 .................................................................................. 467
23.8.1 検証環境の概要 ............................................................................................ 467
23.8.2 pkg_definitions.svファイル ........................................................................... 469
23.8.3 alu_if ................................................................................................................ 469 23.8.4 alu_item .......................................................................................................... 469 23.8.5 alu_driver ........................................................................................................ 469 23.8.6 alu_sequencer ................................................................................................. 470
実践 SystemVerilog入門
11
Copyright 2020 © Artgraphics. All rights reserved.
23.8.7 alu_sequence_base.......................................................................................... 471 23.8.8 alu_test_seq1 .................................................................................................. 472 23.8.9 alu_test_seq2 .................................................................................................. 472 23.8.10 alu_collector ................................................................................................ 473 23.8.11 alu_monitor ................................................................................................. 474 23.8.12 alu_agent ..................................................................................................... 474 23.8.13 alu_env ........................................................................................................ 475 23.8.14 alu_test_base ............................................................................................... 476 23.8.15 alu_test1 ...................................................................................................... 476 23.8.16 alu_test2 ...................................................................................................... 477 23.8.17 dut ................................................................................................................ 477 23.8.18 top ................................................................................................................ 478 23.8.19 テストの実行 ................................................................................................ 478
23.8.19.1 +UVM_TESTNAME=alu_test1 ........................................................................... 478 23.8.19.2 +UVM_TESTNAME=alu_test2 ........................................................................... 479
24 コンパイラーダイレクティブ .................................................................................. 480
24.1 `INCLUDE文 ............................................................................................................. 480
24.2 `DEFINE文 ............................................................................................................... 480
24.2.1 定数を定義する場合 ..................................................................................... 480
24.2.2 接頭辞及び接尾辞を持つ名称の創成 ............................................................ 481
24.3 文字列内のパラメータ展開 ................................................................................. 482
24.4 ‘ENDIF文 .................................................................................................................. 482
24.5 `__FILE__、`__LINE__ .......................................................................................... 482
25 シミュレーション実行モデル .................................................................................. 485
25.1 スケジューリング領域 ......................................................................................... 485
25.2 #0ディレーの効果 .................................................................................................. 486
25.2.1 スケジューリングの調節 .............................................................................. 486
25.2.2 タイミングの調節 ......................................................................................... 487
26 DPI ........................................................................................................................ 489
26.1 概要 ...................................................................................................................... 489
26.2 IMPORTと EXPORT ................................................................................................... 490
26.2.1 import .............................................................................................................. 490 26.2.2 export ............................................................................................................... 492
26.3 C LAYER .................................................................................................................. 492 26.3.1 概要 .............................................................................................................. 492
26.3.2 4-state型 ......................................................................................................... 493
26.3.3 openアレイ ...................................................................................................... 495
27 補足 ........................................................................................................................ 496
27.1 SYSTEMVERILOG全般 ............................................................................................. 496
27.2 UVM全般 ............................................................................................................... 499
28 参考文献 ................................................................................................................. 502
実践 SystemVerilog入門
1
Copyright 2020 © Artgraphics. All rights reserved.
1 概要
この章では、SystemVerilog の持つ機能を概説し、本書の目的と構成を明らかにします。最初
に、SystemVerilog誕生の歴史を簡単に紹介する事から始めます。
1.1 SystemVerilogの歴史
SystemVerilogは、Verilog HDLを拡張した言語ですが、実際には、その他の多く言語から影響
を受けています。デザイン分野に於いては、SUPERLOG、及び C、検証分野に於いては、
SUPERLOG、VERA C、C++、VHDL、OVA、PSL等の影響を受けています。
SystemVerilog言語仕様の主要部分は SUPERLOGを基にして Accellera standard groupsにより開
発され、2002 年に SystemVerilog 3.0 としてリリースされました。SystemVerilog 3.0 は第三世
代の Verilog 言語として位置付けられています。第一世代は、良く知られている Verilog-1995
で、第二世代は Verilog-2001です(表 1-1)。
表 1-1 世代別言語仕様
言語の世代 言語
第一世代 Verilog-1995
第二世代 Verilog-2001
第三世代 SystemVerilog 3.0
SystemVerilog 3.0は、その後、Accellera による SystemVerilog 3.1、及び SystemVerilog 3.1a等
の改訂版を経て、2005年 11月に IEEE Std 1800-2005として正式に公開されました。これが初
版の SystemVerilog言語仕様です。
SystemVerilog言語仕様は数年に一度の改訂が行われており、IEEE Std 1800-2012が次に公開さ
れ、現在の SystemVerilog言語仕様は、2018年 2月 21に規格 IEEE Std 1800-2017として公開さ
れています。本書の解説は、最新仕様に準拠しています。年代的な言語の変遷を表 1-2 にま
とめました。
表 1-2 SystemVerilog言語仕様の変遷
年 言語
1995 Verilog-1995(IEEE Std 1364-1995)
2001 Verilog-2001(IEEE Std 1364-2001)
2002 SystemVerilog 3.0
2003 SystemVerilog 3.1
2004 SystemVerilog 3.1a
2005 IEEE Std 1800-2005
2012 IEEE Std 1800-2012
2018 IEEE Std 1800-2017
SystemVerilogに関する詳しい歴史に関しては、文献[7]を参照して下さい。
1.2 SystemVerilog概要
1.2.1 言語としての SystemVerilog
SystemVerilog はハードウェア設計、仕様、及び検証を統一的に記述する事ができる言語です
(図 1-1)。単なる検証言語ではありません。仕様記述機能はデザインと検証の橋渡しをする
役割を果たします。ここで、デザインとは仕様を基にして実装した内容を指します。
実践 SystemVerilog入門
2
Copyright 2020 © Artgraphics. All rights reserved.
図 1-1 SystemVerilogの機能範囲
アサーション、及びファンクショナルカバレッジは橋渡しの良い例です。アサーションは、
デザインの動作と仕様が一致する事を確認します。また、ファンクショナルカバレッジはテ
ストの中に仕様の情報を記録して、その情報がどれだけ検証で使用されたかを計測します。
全ての情報が正しく使用されていれば、検証が正しく進行した事になります。SystemVerilog
は上位互換性の意味に於いて Verilog HDL を包含しています(図 1-2)。従って、従来の
Verilogユーザは、そのまま SystemVerilogのツール環境で作業を進める事ができます。
図 1-2 SystemVerilogと Verilog HDLの関係
デザインを正確に、且つ効率良く検証をするために SystemVerilog には仕様を記述する機能が
備えられています。そして、検証時に必要となる様々なデータ構造を支援するために
SystemVerilog は豊富なデータタイプを備えています。更に、検証に必要なアサーション、フ
ァンクショナルカバレッジ、ランダムスティミュラス生成等の機能を SystemVerilog は標準的
に備えています。要約すると、SystemVerilog は設計、及び検証に必要な全ての基本的機能を
包含しています。
1.2.2 設計言語としての SystemVerilog
Verilog HDLと比較して多くの機能が SystemVerilogに追加されました。特に RTL記述をより
効率良く正確に行なうための機能が備えられています。具体的には、以下の様な機能が追加
デザイン 検証
SystemVerilog
ハードウェア仕様
Verilog
bit, byte,
shortint, int,
longint
logic
enum, struct,
union, class,
package,
program
interface,
modport,
clocking block
mailbox,
semaphore
assertions
functional
coverage
constrained
random value
generation
dynamic arrays,
associative arrays,
queues, multi-
dimensional
arrays
continue, break,
return, do-while,
foreach
fork-join_any,
fork-join_none
SystemVerilog
実践 SystemVerilog入門
3
Copyright 2020 © Artgraphics. All rights reserved.
されています。
モジュール間、及びテストベンチと DUT間の通信を簡素化するための interface機能
メモリー使用量と実行効率に於いて優れた 2-state 型のデータタイプ(bit、byte、shortint、
int、longint等)
文字列型データタイプ(string)
値を戻さない void型 function
ユーザデータタイプを定義するための typedef
C/C++の様な structures及び unionsデータタイプ
enum型データタイプ
packageスコープ
便利な複合オペレータ(++、--、+=、&=、等)
論理合成可能性を促進する機能(always_comb、always_latch、always_ff、unique_if、
priority-if、unique-case、priority-case等)
プログラミング機能の強化(continue、break、return文等)
これらの拡張機能は短期間で高品質な RTL 設計を可能にします。但し、これらの拡張機能の
中には、RTL 論理合成可能ではない機能も含まれています。例えば、文字列型データタイプ
は、一般的には、論理合成可能ではありません。
1.2.3 検証言語としての SystemVerilog
Verilog HDLには検証機能は皆無であり、SystemVerilogには多くの検証機能、及び検証に必要
な機能が付け加わりました。具体的には、以下の様な機能が追加されています。
多次元アレイ
アレイタイプ(ダイナミックアレイ、associativeアレイ、キュー)
クラス(class)
インターフェース
パッケージ
テストベンチ機能(program)
プロセス間通信機能(mailbox、semaphore等)
プロセス制御機能(fork/join_any、fork/join_none)
クロック信号に同期する信号の管理(clocking block)
ランダムスティミュラス生成機能
ファンクショナルカバレッジ
アサーション
これらの拡張機能は検証作業の生産性を向上し、検証技術の蓄積に大きな役割を果たします。
特に、クラスは再利用可能な検証環境を構築するために必要不可欠な機能です。
1.3 本書の対象者と目的
本書は SystemVerilog の知識を持たない人を対象に書かれています。Verilog HDL に関する知
識は必要がありませんが、一般のプログラミング言語に関する知識を持っている事が必要で
す。特に、OOP に関する知識を持つ事は望ましいです。OOP に関する記述は多くの文献に見
当たるため、本書では OOPの解説を含んでいません。
本書は入門書ではありますが、SystemVerilog LRMの構成に沿い、できるだけ多くの重要な内
容を含む様に題材を選択してあります。従って、本書を読了後は設計、及び検証作業に必要
な一通りの知識を習得する事ができています。具体的には、以下の内容を包含しています。
設計に必要な SystemVerilogの基礎知識(Verilog HDLに対する拡張機能、enum、インタ
ーフェース、パッケージ等)
検証に必要な SystemVerilogの基礎知識(検証時に使用するクラス等の高度なデータタイ
プ、並列処理機能、プロセス間通信機能等)