artgraphics...実践 uvm 入門 ©2020 アートグラフィックス 〒124-0012...

30
Artgraphics 実践 UVM 入門 ~SystemVerilog による検証環境の構築手法~ Document Identification Number: ARTG-TD-002-2019 Document Revision: 1.4 2020.09.18 アートグラフィックス 篠塚一也

Upload: others

Post on 03-Aug-2020

0 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: Artgraphics...実践 UVM 入門 ©2020 アートグラフィックス 〒124-0012 東京邴葛飾区立石 8-14-1  A Practical Guide to Learning UVM ©2020

Artgraphics

実践 UVM 入門 ~SystemVerilog による検証環境の構築手法~

Document Identification Number: ARTG-TD-002-2019

Document Revision: 1.4 2020.09.18

アートグラフィックス

篠塚一也

Page 2: Artgraphics...実践 UVM 入門 ©2020 アートグラフィックス 〒124-0012 東京邴葛飾区立石 8-14-1  A Practical Guide to Learning UVM ©2020

実践 UVM 入門

SystemVerilog による検証環境の構築手法

©2020 アートグラフィックス

〒124-0012 東京都葛飾区立石 8-14-1

www.artgraphics.co.jp

A Practical Guide to Using UVM

Methodology to Develop Reusable and Configurable Verification Components using SystemVerilog

©2020 Artgraphics. All rights reserved.

8-14-1, Tateishi, Katsushika-ku, Tokyo, 124-0012 Japan

www.artgraphics.co.jp

注意事項

弊社の技術資料の内容の一部、あるいは全部を無断で複写、複製、転載する事は、

禁じます。

弊社の技術資料の譲渡、転売、模倣、又は、改造等の行為を禁止致します。

Page 3: Artgraphics...実践 UVM 入門 ©2020 アートグラフィックス 〒124-0012 東京邴葛飾区立石 8-14-1  A Practical Guide to Learning UVM ©2020

実践 UVM 入門

1

Copyright 2020 © Artgraphics. All rights reserved.

はじめに

UVM は IEEE Std 1800.2-2017 規格となり、検証分野では今後ますます採用される事になると

思われます。実際、UVM は再利用可能な検証コンポーネントを開発する手段として次第に普

及しつつあります。しかし、現在市販されている UVM に関する書物、および入手可能な技

術書(ユーザガイド、リファレンスマニュアル等)の殆どは英文で上級技術者向けに書かれ

ているため、SystemVerilog の多くのユーザが UVM に関する基礎的な知識を得る事が難しい

と感じているのが実情です。本書は、初心者を対象に SystemVerilog 以外の知識を仮定せずに、

UVM とは何か、UVM は何故必要なのか、UVM はどのように構成されているか、また、

UVM をどのように使用するかを詳しく解説しています。

予備知識なしで UVM を理解する事が難しいのは、近年の検証技術の動向、および UVM が開

発された背景等に関する解説が十分では無い事にも起因していると考えられます。歴史的な

背景を理解する事により、UVM 誕生の所以、および UVM が齎す効果を知る事ができます。

そのような知識は、UVM が備える機能一つ一つを理解するのと同程度に重要な概念で、

UVM の全容を知る手助けとなります。UVM の存在意義、および UVM を構成する機能を合

理的に理解する事ができるように、背景を重視した解説手順を採用しているのが本書の特徴

です。

本書の第 1章では、近年の検証技術手法の概要を解説し、その検証手法と UVMの構成には多

くの共通点が存在する事を指摘します。その共通点を知る事により、UVM の全容を理解し易

くなります。更に、第 1 章では、UVM を使用した検証環境の概要を解説し、検証環境構築に

必要となる主な検証コンポーネントを概説します。その知識を基にすれば、UVM の全体像を

確実に理解する事ができ、第 2章以降の UVM機能の詳細解説へとスムーズに移行する事がで

きます。

本書の 2 章以降は、UVM を構成する個々の概念を具体的に解説しています。UVM では、ト

ランザクションを用いて RTL よりも高位なレベルでシステム全体の流れを記述します。それ

が、第 2 章の TLM です。この章では、検証コンポーネント間でデータ授受をするための基本

的な手順法を紹介します。シーケンサーとドライバー間に見られる 1 対 1 データ通信に加え

て、モニターと他の検証コンポーネント間に見られる 1 対 N のデータ通信の詳細を解説しま

す。TLM に関する知識は、UVM コンポーネントを開発する際には、必要不可欠な知識です。

この章では、シーケンサーやドライバー等のメソドロジークラスを使用せずに、素朴なコン

ポーネントを使用して TLM 通信を詳しく解説します。これにより、TLM を適用するための

厳密な技術を習得する事ができると共に、メソドロジークラスが持つ利便性を理解する事が

できます。

さて、UVM は手法であり、ユーザは UVM が規定している原則、およびルールに従う事が必

要です。例えば、SystemVerilogによる記述としては正しくても、UVMの検証コードとして考

えると不備な記述が多々存在します。しかも、それらの不備な記述の発見が遅れれば遅れる

ほど解決に時間がかかります。しかし、UVM のマニュアルやユーザガイドには、そうした規

定を簡潔に明記していないため、UVM への初心者は貴重な時間を浪費しかねない状況に陥る

のが常です。第 3章では UVMが推奨しているルール、記述法、および手順を簡潔明瞭に解説

し、第 4 章以降の検証環境構築の準備をします。

第 4 章は、検証環境を構築するための主要な要素であるトランザクション、ドライバー、シ

ーケンサー、シーケンス、モニター、コレクター、エージェント、エンバイロンメント、テ

スト等を詳しく解説します。この章は、検証環境を構築するための重要な内容を含みます。

特に、シーケンスは、UVM の中で最も重要で、かつ難解な概念の一つであるため、シーケン

スの機能と使用法を詳しく解説します。更に、シミュレーションを進行させるために必要な

raise_objection()と drop_objection()の呼び出しをシーケンスに自動的に行なわせる方法も解説

します。シーケンサーとドライバーはシーケンスとの関連において機能、役割、および使用

法を詳しく解説します。総じて、第 4 章の内容を理解すれば、UVM を実践に適用する知識を

完全に身に付ける事ができます。

Page 4: Artgraphics...実践 UVM 入門 ©2020 アートグラフィックス 〒124-0012 東京邴葛飾区立石 8-14-1  A Practical Guide to Learning UVM ©2020

実践 UVM 入門

2

Copyright 2020 © Artgraphics. All rights reserved.

第 5 章は、第 4 章までに習得した知識を応用した検証環境構築例を紹介します。各検証コン

ポーネントを省略せずに記述しているので、実践に適用する際のコードスニペットの役割を

果たします。この章に記述されている例を通して、シーケンサー、ドライバー、コレクター、

モニター等の UVM コンポーネント開発法を再確認する事ができます。また、シーケンスを

利用して実行時に制約を与えてトランザクションを生成する技術を習得する事ができます。

本書は、他の書物、および技術情報と異なり、検証環境構築の具体例を簡潔に示してありま

す。簡単な DUT を使用して再利用可能な UVM 検証コンポーネントの開発例を示しているた

め、検証環境全体を把握し易いだけでなく、検証コンポーネントの開発自身に集中する事が

できる利点を齎しています。

尚、本書の記述は UVM 1.2 をベースにしています。また、紙面の都合上、一部の記述は小さ

な書体で記述されています。

アートグラフィックス

篠塚一也

Page 5: Artgraphics...実践 UVM 入門 ©2020 アートグラフィックス 〒124-0012 東京邴葛飾区立石 8-14-1  A Practical Guide to Learning UVM ©2020

実践 UVM 入門

1

Copyright 2020 © Artgraphics. All rights reserved.

変更履歴

日付 Revision 変更点

2019.11.30 1.0 初版。

2020.05.30 1.1 表、ソースコード、実行例などの体裁を統一。

2020.06.14 1.2 タイムアウト設定機能の記述を追加。

2020.07.10 1.3 全体的に、記述を追加。

2020.09.18 1.4 第 6 章を全面改訂し、スケジューリング領域と UVM マクロに

関する解説を充実。その他、全体的に改訂を実施。

Page 6: Artgraphics...実践 UVM 入門 ©2020 アートグラフィックス 〒124-0012 東京邴葛飾区立石 8-14-1  A Practical Guide to Learning UVM ©2020

実践 UVM 入門

1

Copyright 2020 © Artgraphics. All rights reserved.

目次

1 概要 .................................................................................................................................. 1

1.1 IEEE STD 1800.2-2017 規格 ....................................................................................... 1 1.2 UVM とは何か ............................................................................................................ 1 1.3 検証技術のトレンド .................................................................................................... 1 1.4 UVM テストベンチの構成 .......................................................................................... 3 1.5 トランザクション ....................................................................................................... 4 1.6 代表的な UVM クラス ................................................................................................ 6

1.6.1 トランザクションとシナリオに関連する UVM クラス ...................................... 6 1.6.2 メソドロジークラス ............................................................................................. 7

1.7 ファクトリ .................................................................................................................. 9 1.8 VIRTUAL インターフェース ...................................................................................... 10 1.9 UVM マクロ .............................................................................................................. 12 1.10 UVM の使用手順....................................................................................................... 12

1.10.1 UVM の引用....................................................................................................... 13 1.10.2 uvm_pkg パッケージ ......................................................................................... 13 1.10.3 uvm_pkg のインポート ..................................................................................... 13 1.10.4 UVM の全体的な使用例 .................................................................................... 13

1.11 本書の構成と目的 .................................................................................................. 14 1.12 例題に関して ......................................................................................................... 15 1.13 本書の記法 ............................................................................................................. 15

2 TLM ............................................................................................................................... 17

2.1 概要 ........................................................................................................................... 17 2.2 UVM コンポーネント間の通信 ................................................................................. 18

2.2.1 概要 .................................................................................................................... 18 2.2.2 put 操作 ............................................................................................................. 19 2.2.3 get 操作 .............................................................................................................. 24 2.2.4 uvm_tlm_fifo ..................................................................................................... 28 2.2.5 analysis-ports と analysis-exports ................................................................... 31

2.3 TLM を使用した検証環境例 ..................................................................................... 38 2.3.1 検証環境の概要 .................................................................................................. 39 2.3.2 インターフェース .............................................................................................. 40 2.3.3 トランザクション .............................................................................................. 40 2.3.4 ドライバー ......................................................................................................... 41 2.3.5 シーケンサー ..................................................................................................... 42 2.3.6 コレクター ......................................................................................................... 43 2.3.7 モニター ............................................................................................................. 44 2.3.8 エージェント ..................................................................................................... 45 2.3.9 dut...................................................................................................................... 45 2.3.10 トップモジュール ........................................................................................... 46 2.3.11 実行結果 ......................................................................................................... 46

3 UVM クラスライブラリーの基礎 ................................................................................... 47

3.1 UVM_OBJECT と UVM_COMPONENT ........................................................................... 47 3.2 コンストラクタ ......................................................................................................... 47

3.2.1 トランザクション .............................................................................................. 47 3.2.2 メソドロジークラス ........................................................................................... 48

3.3 フィールドマクロ ..................................................................................................... 49 3.3.1 概要 .................................................................................................................... 49 3.3.2 フィールドマクロの種類 ................................................................................... 54 3.3.3 フィールドマクロフラグ ................................................................................... 56

Page 7: Artgraphics...実践 UVM 入門 ©2020 アートグラフィックス 〒124-0012 東京邴葛飾区立石 8-14-1  A Practical Guide to Learning UVM ©2020

実践 UVM 入門

2

Copyright 2020 © Artgraphics. All rights reserved.

3.3.4 `uvm_object_param_utils*と`uvm_component_param_utils*マクロ ............ 56 3.4 プリント機能 ............................................................................................................. 56

3.4.1 メッセージユーティリティ ................................................................................ 56 3.4.2 UVM プリンター ............................................................................................... 61 3.4.3 アレイのプリント .............................................................................................. 63

3.5 ファクトリ ................................................................................................................ 66 3.6 UVM シミュレーション ............................................................................................ 68

3.6.1 シミュレーションフェーズ ................................................................................ 69 3.6.2 シミュレーションフェーズと super.method () ................................................. 73 3.6.3 サブコンポーネント作成とシミュレーションフェーズ .................................... 74 3.6.4 コンポーネント階層の情報取得メソッド .......................................................... 75 3.6.5 シミュレーションの進行 ................................................................................... 81

3.7 コンフィギュレーションの設定変更 ........................................................................ 84 3.7.1 設定変更の概要 .................................................................................................. 84 3.7.2 uvm_config_db#(type)クラス ............................................................................ 84 3.7.3 設定変更例 ......................................................................................................... 85

3.8 コマンドラインの操作 .............................................................................................. 88 3.9 RUN_TEST()メソッド ................................................................................................. 89

3.9.1 概要 .................................................................................................................... 89 3.9.2 使用法 ................................................................................................................ 90 3.9.3 run_test()と$finish ........................................................................................... 92

3.10 タイムアウトの設定 .............................................................................................. 93 3.11 検証コンポーネントライブラリー ........................................................................ 94 3.12 PROGRAM ブロックとテストベンチ .......................................................................... 95 3.13 クラスの記述法 ..................................................................................................... 95 3.14 UVM クラス定義のチェックリスト.......................................................................... 97

4 UVM 検証コンポーネントの開発 ................................................................................... 99

4.1 トランザクション ..................................................................................................... 99 4.1.1 トランザクションの定義 ................................................................................... 99 4.1.2 クラスインヘリタンスと制約の追加 ............................................................... 100 4.1.3 シーケンスによる実行時の制約の追加 ............................................................ 102 4.1.4 制御フィールド ................................................................................................ 102 4.1.5 simple_item ..................................................................................................... 104

4.2 SIMPLE_IF インターフェース .................................................................................. 104 4.3 ドライバー .............................................................................................................. 105

4.3.1 概要 .................................................................................................................. 105 4.3.2 標準的なドライバー記述法 .............................................................................. 106 4.3.3 ドライバーのライブラリー化 .......................................................................... 107

4.4 シーケンス .............................................................................................................. 111 4.4.1 概要 .................................................................................................................. 111 4.4.2 シーケンスの定義手順 ..................................................................................... 111 4.4.3 body()タスク .................................................................................................... 112 4.4.4 `uvm_do マクロと`uvm_do_with マクロ ........................................................ 112 4.4.5 raise_objection()と drop_objection() ............................................................... 112 4.4.6 pre_body()と post_body() ................................................................................ 113 4.4.7 シーケンス定義例 ............................................................................................ 114

4.5 シーケンサー ........................................................................................................... 117 4.5.1 シーケンサーの定義 ......................................................................................... 117 4.5.2 シーケンサーとドライバーの基本的なハンドシェーク .................................. 118 4.5.3 トランザクションを取得する流れ ................................................................... 118 4.5.4 シーケンスの開始 ............................................................................................ 119

4.6 モニターとコレクター ............................................................................................ 119

Page 8: Artgraphics...実践 UVM 入門 ©2020 アートグラフィックス 〒124-0012 東京邴葛飾区立石 8-14-1  A Practical Guide to Learning UVM ©2020

実践 UVM 入門

3

Copyright 2020 © Artgraphics. All rights reserved.

4.6.1 概要 .................................................................................................................. 119 4.6.2 コレクター ....................................................................................................... 120 4.6.3 モニターの定義 ................................................................................................ 123

4.7 エージェント ........................................................................................................... 126 4.8 エンバイロンメント ................................................................................................ 128 4.9 テストとテストベンチ ............................................................................................ 130

4.9.1 ベーステスト ................................................................................................... 130 4.9.2 テスト .............................................................................................................. 130 4.9.3 テストベンチ ................................................................................................... 131

4.10 UVM クラスと標準プロパーティ ........................................................................... 132 4.11 UVM の設定変更..................................................................................................... 133 4.12 検証環境の実行例 ................................................................................................ 134

4.12.1 検証環境の概要 ............................................................................................ 134 4.12.2 simple_env ...................................................................................................... 135 4.12.3 simple_test ...................................................................................................... 135 4.12.4 dut.................................................................................................................... 136 4.12.5 pkg ................................................................................................................... 136 4.12.6 top .................................................................................................................... 137 4.12.7 ファクトリメソッドによる検証コンポーネントの置き換え ....................... 138

5 UVM 検証環境構築例 ................................................................................................... 142

5.1 記述例の概要 ........................................................................................................... 142 5.2 DUT .......................................................................................................................... 143 5.3 SHIFT_IF .................................................................................................................. 144 5.4 SHIFT_ITEM ............................................................................................................. 144 5.5 SHIFT_DRIVER .......................................................................................................... 145 5.6 SHIFT_SEQUENCER .................................................................................................. 146 5.7 SHIFT_SEQUENCE_BASE .......................................................................................... 146 5.8 SHIFT_TEST_SEQ1 .................................................................................................... 147 5.9 SHIFT_TEST_SEQ2 .................................................................................................... 148 5.10 SHIFT_COLLECTOR ................................................................................................... 149 5.11 SHIFT_MONITOR ....................................................................................................... 149 5.12 SHIFT_AGENT ........................................................................................................... 150 5.13 SHIFT_ENV ............................................................................................................... 151 5.14 SHIFT_TEST_BASE .................................................................................................... 151 5.15 SHIFT_TEST1 ............................................................................................................ 152 5.16 SHIFT_TEST2 ............................................................................................................ 153 5.17 PKG .......................................................................................................................... 154 5.18 TOP .......................................................................................................................... 154 5.19 実行結果 .............................................................................................................. 155

5.19.1 +UVM_TESTNAME=shift_test1 ................................................................... 155 5.19.2 +UVM_TESTNAME=shift_test2 ................................................................... 155

6 補足 .............................................................................................................................. 156

6.1 スケジューリング領域 ............................................................................................ 156 6.1.1 Active と Inactive 領域の差異 ......................................................................... 157 6.1.2 Active、NBA、Observed 領域の差異............................................................. 159

6.2 UVM マクロの必要性 ............................................................................................. 161 6.3 SYSTEMVERILOG マクロの予備知識 ....................................................................... 162

6.3.1 トークンを空白なしに置換する機能 ............................................................... 162 6.3.2 名称を文字列に変換するマクロ機能 ............................................................... 163

6.4 インターフェースクラス ......................................................................................... 163 6.4.1 概要 .................................................................................................................. 164 6.4.2 インターフェースクラスの定義と応用 ............................................................ 165

6.5 イベントによるプロセス制御 ................................................................................. 166

Page 9: Artgraphics...実践 UVM 入門 ©2020 アートグラフィックス 〒124-0012 東京邴葛飾区立石 8-14-1  A Practical Guide to Learning UVM ©2020

実践 UVM 入門

4

Copyright 2020 © Artgraphics. All rights reserved.

6.5.1 イベント制御 ................................................................................................... 166 6.5.2 正しいプロセス制御法 ..................................................................................... 168

6.6 ENUM ....................................................................................................................... 169 6.7 UVM とファンクショナルカバレッジ .................................................................... 170

6.7.1 概要 .................................................................................................................. 170 6.7.2 カバレッジ計算 ................................................................................................ 170 6.7.3 カバレッジモデルの定義 ................................................................................. 171 6.7.4 カバレッジ計算例 ............................................................................................ 171

6.8 $SFORMAT()と$SFORMATF() .................................................................................... 179

7 参考文献 ....................................................................................................................... 180

本書で使用する略語一覧

略語 定義

ALU Arithmetic Logic Unit

BCL Base Class Library

DDR Double Data Rate

DMA Direct Memory Access

DUT Design Under Test、又は、Device Under Test

EDA Electronic Design Automation

FC Functional Coverage

FIFO First In First Out

IP Intellectual Property

LRM Language Reference Manual

SystemVerilog 言語仕様書(IEEE Std 1800-2017)を意味します。

PCIE Peripheral Component Interconnect Express

RTL Register Transfer Level

SoC System-on-Chip

TLM Transaction Level Modeling

USB Universal Serial Bus

UVM Universal Verification Methodology

Page 10: Artgraphics...実践 UVM 入門 ©2020 アートグラフィックス 〒124-0012 東京邴葛飾区立石 8-14-1  A Practical Guide to Learning UVM ©2020

実践 UVM 入門

1

Copyright 2020 © Artgraphics. All rights reserved.

1 概要

本章では、近年知られ始めた検証ライブラリーUVM を概説し、第 2 章以降の準備をします。

UVM は複合体であり極めて複雑な構成を持ちます。更に、UVM は近代的な検証手法等の影

響を深く受けているため、UVM を順序立てて解説する事は不可能に近いと言えます。例えば、

説明中に未説明の用語を使用しなければならない相互参照が必然的に発生します。第 2 章以

降での解説を容易にするため、本章では重要な UVM 用語をできるだけ多く紹介します。最

初に、規格としての UVM と「UVM とは何か」を解説します。そして、UVM の基礎概念に

触れ、本書の目的、および内容等を明確にします。

1.1 IEEE Std 1800.2-2017 規格

UVM は IEEE Std 1800.2-2017 規格となり、検証技術者だけでなくハードウェア設計者を含む

SystemVerilog ユーザ全体が習得しなければならない知識となりつつあります。本書は、

SystemVerilog の基礎知識だけを仮定して、誰でもが UVM を理解できるように簡潔明瞭な解

説を提供します。

UVM は IEEE 規格であるので、文献[5]が UVM のマニュアルとして準備されていますが、

UVM に関する歴史的背景の解説や UVM 全体構造の梗概などの解説が欠乏しているため、初

心者が参考にするには難し過ぎます。本章では、その欠乏を補う目的で、UVM の歴史的背景

と UVM の梗概を簡潔に紹介します。第 2 章以降では、UVM を詳細に解説します。

1.2 UVM とは何か

UVM とは、検証分野で推奨されている技術、ルール、慣習、規律等をコードとして具体化し

た SystemVerilog のクラスライブラリーです(図 1-1)。UVM は検証技術の再利用性を促進し

て生産性向上をさせる目的を持っています。UVM は Accellera Systems Initiative により開発さ

れました。

図 1-1 UVM の成り立ち

UVM は SystemVerilog をベースにして記述されているので、SystemVerilog をサポートしてい

る検証ツールの環境で使用する事ができます。ただし、使用している EDA ツールが UVM の

全ての機能を実装しているとは限りません。UVM を使用する前に、使用可能な機能を確認す

るようにして下さい。

参考 1-1

UVM は SystemVerilog の DPI を利用しているので、ユーザが使用している EDA ツールは DPI

の機能をサポートしている事が求められます。

1.3 検証技術のトレンド

近年の検証技術では階層的テストベンチ記述法が採用されています([3])。階層のレイヤー

には表 1-1 のような種類があります。図 1-2 は、それぞれぞれのレイヤーの役割とトランザク

ションの流れを検証環境として表現しています。

検証作業

検証技術手法

ルール

規律

慣習

SystemVerilog

Class Library

UVM コード化

Page 11: Artgraphics...実践 UVM 入門 ©2020 アートグラフィックス 〒124-0012 東京邴葛飾区立石 8-14-1  A Practical Guide to Learning UVM ©2020

実践 UVM 入門

3

Copyright 2020 © Artgraphics. All rights reserved.

図 1-2 の environment に含まれる検証コンポーネントは再利用可能であるように開発するのが

特徴です。特に、それらのコンポーネントは各テストケースで共有できるように開発します。

ファンクショナルカバレッジ(FC)はテストケースに依存するため、再利用可能にはなり得

ないので、environment には含まれていません。

次第に明らかになるように、UVM は検証技術のトレンドである階層的テストベンチ技術を実

現しています。実際問題として、上記のレイヤーの機能を遂行するための UVM クラスが存

在します。ユーザは、それらのクラスを使用して検証作業の生産性を向上する事ができます。

1.4 UVM テストベンチの構成

図 1-3 は、UVM のテストベンチの構成を示しています。図における包含関係はクラスまたは

モジュールのインスタンスを持つという関係を意味します。例えば、テストベンチは DUT の

インスタンスを保有します。包含関係は、一般的に、階層を意味します。図から明らかなよ

うに、UVM のテストベンチの構成は階層的にテストベンチを記述する手法の構造を反映して

います。階層を構成する要素の意味を表 1-2 に記します。

図 1-3 UVM のテストベンチ構成([2])

表 1-2 UVM のテストベンチを構成する要素([2])

階層を構成する要素 意味

UVM Testbench

テストベンチ

これは、いわゆる、トップレベルのモジュールを指します。この

テストベンチは DUT、および検証機能等をインスタンスとして保

有します。

UVM Test 検証用のテストケースのトップレベルのクラスインスタンスを意

DUT

UVM Agent

UVM Agent

UVM Environment

UVM Environment

UVM Sequencer

UVM Scoreboard

UVM Testbench

Sequences

Config

UVM Test

UVM Environment

Page 12: Artgraphics...実践 UVM 入門 ©2020 アートグラフィックス 〒124-0012 東京邴葛飾区立石 8-14-1  A Practical Guide to Learning UVM ©2020

実践 UVM 入門

4

Copyright 2020 © Artgraphics. All rights reserved.

テスト 味します。このインスタンスが該当するテストを実行します。コ

ンフィギュレーション(Config)の設定を変更する事により、各種

のテストケースの選別をする事ができます。

UVM Environment

エンバイロンメント

階層的に構築した検証コンポーネントです。例えば、トップレベ

ルのエンバイロンメントとしては、SoC、IP(PCIe エンバイロンメ

ント、USB エンバイロンメント、Memory Controller エンバイロン

メント)等があります。

UVM Scoreboard

スコアボード

スコアボードの主目的は、DUT の動作を確認する事です。すなわ

ち、エージェントから取得した DUT のレスポンスが期待される結

果と一致するかのチェックを遂行します。

UVM Agent

エージェント

基本的な検証コンポーネントで、シーケンサー、ドライバー、モ

ニター、コレクター等のインスタンスで構成されます。エージェ

ントは DUT と virtual インターフェースを介して接続されます。

UVM Sequencer

シーケンサー

トランザクションを生成する制御を司るメインコンポーネントで

す。シーケンサーはシーケンスを作り、シーケンスを実行する事

によりトランザクションを生成します。

UVM Sequences

シーケンス

トランザクションを生成するための手順を含むオブジェクトで

す。オブジェクトであるため、コンポーネント階層には含まれま

せん。シーケンスは複雑なテストシナリオを定義する事ができま

す。シーケンスはテストに依存するため、エンバイロンメントに

は含まれていません。

UVM Driver

ドライバー

ドライバーはシーケンサーからトランザクションを取得し、シグ

ナルレベルに変換した後、DUT をドライブします。シーケンサー

とドライバーの通信には TLM が使用されます。

UVM Monitor

モニター

モニターは DUT からのレスポンスを他の検証コンポーネントにト

ランザクションとして送信する役目を持ちます。モニター自身も

カバレッジ計算、およびレスポンスに関するチェックも行いま

す。DUT からのレスポンスはシグナルレベルであるため、レスポ

ンスをトランザクションに変換する機能をコレクターとして分離

するのが一般的です。

参考 1-2

図 1-3 は重要な意味を持っています。例えば、以下のような UVM の概念が含まれています。

UVM エンバイロンメントは階層を構成する。

階層を構成するコンポーネントには、エージェント、エンバイロンメント、シーケンサ

ー、スコアボード等が含まれる。

スコアボードはトップレベルのエンバイロンメントに配置する。

テストケースの依存するコンフィギュレーションパラメータはテスト(UVM Test)に保

有する。

これらの概念を一般的なガイドラインとして理解しておくと UVM による検証環境の構築が

円滑に進みます。

1.5 トランザクション

UVM では TLM を採用し、シグナルレベルよりも高位の記述法を用いてシステムを表現しま

す。検証コンポーネント間の通信にはトランザクションが使用され、UVM はトランザクショ

ンを使用してシミュレーションを実行します。

一般に、トランザクションは二つのコンポーネント間の通信をモデルするために必要な情報

を意味します(図 1-4 (a))。デバイス(回路)がネットで接続されている RTL とは対照的で

す(図 1-4 (b))。

Page 13: Artgraphics...実践 UVM 入門 ©2020 アートグラフィックス 〒124-0012 東京邴葛飾区立石 8-14-1  A Practical Guide to Learning UVM ©2020

実践 UVM 入門

5

Copyright 2020 © Artgraphics. All rights reserved.

図 1-4 トランザクション接続とネット接続

RTL ではデバイス間はネットで接続されているため、接続されているネットの信号値が変化

する事で通信が行われます。一方、TLM ではネットが存在しないためタスクやファンクショ

ンの呼び出しを使用してトランザクションの授受を行います。

通常、トランザクションはクラスオブジェクトとして存在します。クラスには、制約付き乱

数発生機能、カバレッジ計算機能等が備えられているので、トランザクションを検証自動化

の重要な手段として活用する事ができます。UVM における最も代表的なトランザクション処

理はシーケンサーとドライバーにおいて行われます(図 1-5)。

図 1-5 典型的なトランザクション処理の例

ドライバーがシーケンサーにトランザクションを要求すると、シーケンサーは制約を満たす

トランザクションを作成してドライバーに引き渡します。ドライバーは取得したトランザク

ションをシグナルレベルに変換して DUT をドライブします。その際、ドライバーは virtual イ

ンターフェース(vif)を使用します。

尚、UVM では、uvm_sequence_item クラス、またはそのサブクラスからトランザクションを

定義しなければなりません。SystemVerilog クラスにはビルトイン randomize()メソッドが定義

されているので、トランザクションのフィールドに制約を満たす乱数を発生する事は容易に

行えます。

一方、DUT からのレスポンスはシグナルレベルなので、UVM で詳細な解析をするためには

トランザクションに逆変換する必要があります。この変換をするコンポーネントは、一般的

に、コレクターと呼ばれています。コレクターは、DUT からのレスポンスをサンプリングし、

トランザクションに変換します。変換されたトランザクションは、モニターに送信されます。

モニターは、カバレッジ計算や簡単な解析処理等を行い、更に詳細な解析を任せるために他

の検証コンポーネントにトランザクションを送信します(図 1-6)。コレクターからモニター、

モニターから他の検証コンポーネントへのトランザクション送信は、write()メソッドで行わ

component1 component2 transaction

device1 device2

(a) TLM

(b) RTL

net

sequencer driver transaction

get

DUT

vif

interface

Page 14: Artgraphics...実践 UVM 入門 ©2020 アートグラフィックス 〒124-0012 東京邴葛飾区立石 8-14-1  A Practical Guide to Learning UVM ©2020

実践 UVM 入門

10

Copyright 2020 © Artgraphics. All rights reserved.

...

endclass

UVM では、このようなインスタンスの作り方をファクトリメソッド(あるいは、単にファク

トリ)と呼びます。ファクトリは、標準設定を実行時に変更する事を可能にする機能を意味

します。上記のようにファクトリを使用すると、実行時に agent のサブクラス(例えば、

new_agent)を master に割り当てる事ができます(図 1-8)。ファクトリは、ソースコードを

修正せずにクラスタイプの変更が可能になる便利な機能です。

図 1-8 ファクトリメソッドによる検証コンポーネンの実行時置換

1.8 Virtual インターフェース

UVMは SystemVerilogクラスの集合体です。UVMが DUTと通信するためには、virtualインタ

ーフェースを使用します。virtual インターフェースとは DUT に接続されているインターフェ

ースのインスタンスへのポインターです。UVM の検証コンポーネントは virtualインターフェ

ースを使用して、DUTの信号をドライブ、またはDUTからのレスポンスをサンプリングしま

す。UVM と DUT との接点はインターフェース内に宣言されている信号だけです。このため、

UVM で開発した検証機能は、必然的に汎用化されます。

ドライバー、およびコレクターは DUTとのデータ授受に virtual インターフェース(vif)を使

用します(図 1-9)。インターフェースのインスタンスはテストベンチ(トップモジュール)

で作られます。そのインスタンスが DUT と関連する検証コンポーネントの virtual インターフ

ェースに引き渡さなれればなりません。その割り当てをハードコーディングすると検証技術

の再利用性に反するため、実行時に virtual インターフェースの情報を vifに設定する様にしま

す。その際、前述したコンポーネントインスタンスの階層構造が利用されます。

図 1-9 Virtual インターフェースによる UVM と DUT の信号授受

virtual インターフェースを使用する UVM コンポーネントは、主としてドライバーとコレクタ

ーです。テストベンチにはインターフェースのインスタンスが実在するので、テストベンチ

ではそのインスタンスと UVM 側の virtual インターフェースのプロパーティ名称 vif との対応

表を準備しておきます。この準備を UVM の run_test()を呼ぶ前に完了しなければなりません。

UVM 側は、UVM コンポーネントの build_phase()、または connect_phase()実行中に、その対応

表を使用して vif にインターフェースのインスタンスを割り当てます。

テストベンチに配置するインターフェースのインスタンスはコンパイル時に決定される情報

master

(agent)

master

(new_agent)

vif interface

UVM を使用した

検証コード DUT

Page 15: Artgraphics...実践 UVM 入門 ©2020 アートグラフィックス 〒124-0012 東京邴葛飾区立石 8-14-1  A Practical Guide to Learning UVM ©2020

実践 UVM 入門

11

Copyright 2020 © Artgraphics. All rights reserved.

ですが、virtual インターフェースはシミュレーション実行時に決定するダイナミックな情報

です。virtual インターフェースを使用する事により検証環境をダイナミックに構築できる事

が分かります。つまり、モジュールインスタンスを用いる手法と異なり、UVM では DUT と

の接続を実行時に決定する事ができます。

参考 1-4

DUT 側ではポートとしてインターフェースを使用していなくても構いません。例えば、DUT

が Verilog スタイルのモジュールでも virtual インターフェースは正しく動作します(図 1-10)。

図 1-10 virtual インターフェースによる UVM と Verilog スタイル DUT の信号授受

インターフェースには直接または間接的に DUT のポートが接続されているため、ドライバー

が virtual インターフェースの信号をドライブする事により、DUT をドライブする事ができま

す。同様に、コレクターは virtual インターフェースを介して、DUT の信号の変化を常時監視

する事ができます。

参考 1-5

SystemVerilog のルールにより、パッケージ、およびクラス内にインターフェースを定義する

事はできません。したがって、インターフェースはグローバルスコープに定義されなければ

なりません(図 1-11)。また、当然の帰着として、インターフェース内では UVM に関する

機能を使用する事はできません。このためファイル間の依存関係に矛盾がないように検証環

境を設計しなければなりません。

図 1-11 インターフェースを定義するスコープ

一般的に、以下に示すような順序でファイルをインクルードすると、依存関係での問題を解

vif Verilog スタイル

DUT UVM を使用した

検証コード

interface simple_if(input bit clk);

...

clocking cb @(posedge clk); endclocking

...

endinterface

package uvm_pkg;

...

endpackage

package pkg; ... endpackage

`include "uvm_pkg.sv"

`include "uvm_macros.svh"

`include "simple_if.sv"

`include "pkg.sv"

module top;

...

endmodule

インターフェース UVM パッケージ

パッケージ テストベンチ

Page 16: Artgraphics...実践 UVM 入門 ©2020 アートグラフィックス 〒124-0012 東京邴葛飾区立石 8-14-1  A Practical Guide to Learning UVM ©2020

実践 UVM 入門

17

Copyright 2020 © Artgraphics. All rights reserved.

2 TLM

本章では、UVM 検証コンポーネント間の通信の基礎を成す TLM を詳しく解説します。本章

では、意図的に、メソドロジークラスを使用せずに検証コンポーネントを記述します。第 4

章では、メソドロジークラスの使用がそれらの検証コンポーネントの記述を簡略化する効果

がある事を学びます。

実際、メソドロジークラスを使用すると準備作業が簡略化されます。例えば、uvm_driver ク

ラスは TLM-port として seq_item_port を定義しているので、uvm_driver クラスを利用すればト

ランザクションを取得する際に特別な準備は必要ありません。また、シーケンサーのベース

クラスuvm_sequencerクラスも同様に、TLM-exportとして seq_item_exportを定義しています。

したがって、シーケンサーとドライバー間でのトランザクションを送受信する処理は、特別

な準備をせずに開始する事ができます。すなわち、シーケンサーとドライバーを、それぞれ

uvm_sequencer と uvm_driver のサブクラスとして定義すれば、TLM を使用するための準備作

業は軽減されます。

しかし、本章の目的は、UVM で TLM 通信をするために必要な基本手順を解説する事です。

そのためには、TLM-port と TLM-export を検証コンポーネント内に具体的に宣言して、put お

よび get という基本的な操作をモデルにして解説を進めます。

2.1 概要

UVM は TLM を採用し、シグナルレベルよりも高位の記述法を用いて検証タスクを表現しま

す。このアプローチはシステムの動作を考察する際の自然な方法です。SystemCのTLM 1.0に

対応していますが、UVM の TLM はそれよりも高速に動作します。以降の節で示す例により

明らかになりますが、同じ種類の TLM-port と TLM-export のプロトコルに従う限り、UVM コ

ンポーネント間の通信は接続する相手方のコンポーネントを選びません。例えば、図 2-1 で

示すように put_producer と get_consumer を変更せずに、FIFO キューに接続する事ができます。

この事実は、以降の解説により次第に明らかになります。

図 2-1 TLM 接続の効果

UVM ではトランザクションはオブジェクトであり、UVM コンポーネントがトランザクショ

ンを処理します。その特別なコンポーネントとしてドライバー(uvm_driver のサブクラス)

が存在します。ドライバーはトランザクションをシグナルレベルに変換して DUT をドライブ

する役目を持ちます。DUT 側からのレスポンスを収集する役目を持つ UVM コンポーネント

も必要になります。そのコンポーネントは、一般的には、コレクターと呼ばれます。ドライ

バーとコレクターの存在により、UVM ではトランザクションレベルでシステムを記述する事

ができる様になります(図 2-2)。

get_consumer get_producer put_consumer put_producer

tlm_fifo get_consumer put_producer

put_producer を変更せずに使用可能 get_consumer を変更せずに使用可能

Page 17: Artgraphics...実践 UVM 入門 ©2020 アートグラフィックス 〒124-0012 東京邴葛飾区立石 8-14-1  A Practical Guide to Learning UVM ©2020

実践 UVM 入門

18

Copyright 2020 © Artgraphics. All rights reserved.

図 2-2 TLM と RTL の分離

参考 2-1

RTL ではポートはネットで接続されますが、TLM ではポートをタスクやファンクションの呼

び出しで表現します。したがい、TLM では抽象的、かつ汎用的なトランザクション処理を実

現する事ができるようになります。

2.2 UVM コンポーネント間の通信

2.2.1 概要

UVMコンポーネント間の通信には TLM-portと TLM-exportが使用されます。TLM-portはトラ

ンザクションを操作するための動作(put や get)を引き起こし、TLM-export はトランザクシ

ョンを処理するために必要な実処理(putやgetの実装内容)を記述します。TLM-portとTLM-

export の概念は、トランザクションを取得(get)する場合と作成(put)する場合では異なり

ます(図 2-3)。何れにしても TLM-export 側がトランザクションの処理内容を実装しなけれ

ばなりません。

図 2-3 TLM-port と TLM-export([2])

TLM-port と TLM-export は一対一の関係を確立しますが、モニターの様に一対 N の関係を持

つ通信には適していません。その場合には、UVM では analysis-port を使用します。一つの

analysis-port に対して複数個の analysis-exports を接続する事ができます。UVM では analysis-

port を菱形◇で表現します。これらのポートの接続図を図 2-4 に紹介します。

analysis-portは TLM-portと異なり、複数の analysis-exportsに同時にトランザクションを送信し

なければならないので、analysis-exportsを持つコンポーネント側で実装する write()メソッドは、

時間を消費しないファンクションで記述されなければなりません。

検証コード (TLM)

DUT (RTL)

driver

collector

TLM-export

TLM-port

component component

TLM-export

TLM-port

component component

put

get

Page 18: Artgraphics...実践 UVM 入門 ©2020 アートグラフィックス 〒124-0012 東京邴葛飾区立石 8-14-1  A Practical Guide to Learning UVM ©2020

実践 UVM 入門

19

Copyright 2020 © Artgraphics. All rights reserved.

図 2-4 analysis-port と analysis-export([2])

UVM で使用する TLM ポートを表 2-1 のようにまとめる事ができます。

表 2-1 TLM 接続に使用される記号一覧

ポートタイプ 記号 意味

TLM-port □

トランザクションに対する動作を引き起こすポートを表現しま

す。例えば、get()や put()メソッドの呼び出しが該当します。

TLM-port でこれらのメソッドを呼び出すと、接続されている

TLM-export に対して定義されているメソッドが起動されます。

TLM-export

analysis-export ○

トランザクションに対する処理法を定義するポートを表現しま

す。このポートには、処理法を定義するタスクおよびファンク

ションが対応します。したがって、export 側ではこれらのメソ

ッドを実装しなければなりません。TLM-export に対してはタス

クを定義し、analysis-export に対してはファンクションを定義し

ます。

analysis-port ◇

一対 N の N 個のサブスクライバーに対する動作を引き起こすポ

ートを表現します。例えば、write()メソッドの呼び出しが該当

します。N 個のサブスクライバーでは write()メソッドの内容を

実装しなければなりません。

2.2.2 put 操作

UVM ではトランザクションを送信するための通信を図 2-5 のように表現します。この操作で

は、put_producer が put 動作を起こす主人公になり、put_consumer は呼ばれる側で put 動作の

内容を定義します。

図 2-5 UVM の put 操作の表現法([2])

図 2-6 に示すように、put_port の put()メソッドを呼び出すと、put_consumer に定義されている

put()メソッドが起動します。したがって、put_consumer はトランザクションを処理するため

の手順を put()メソッドに実装しなければなりません。

analysis-port

analysis-export analysis-export analysis-export

component

component component component

write

put_producer put_consumer put_port

put_export

put

Page 19: Artgraphics...実践 UVM 入門 ©2020 アートグラフィックス 〒124-0012 東京邴葛飾区立石 8-14-1  A Practical Guide to Learning UVM ©2020

実践 UVM 入門

47

Copyright 2020 © Artgraphics. All rights reserved.

3 UVM クラスライブラリーの基礎

UVM を使用する際、遵守しなければならないルール、および推奨されている使用法がありま

す。それらの約束事は、UVM 自身からの制約であり SystemVerilog 言語が規定しているわけ

ではありません。したがって、UVM が定めた約束事に違反する使用法があっても

SystemVerilogコンパイラーはエラーとして報告をしない場合がありますが、UVMのコードと

しては正しく動作しません。そして、動作しない場合、UVM 使用上の何処に問題があるかを

突き止める事は決して容易な作業ではありません。そのような問題に遭遇する事を未然に防

ぐためには、UVM が設けた約束事を正しく理解して UVM を使用する事が必要です。本章で

は、基本的な約束事を解説します。

3.1 uvm_object と uvm_component

uvm_objectクラスが他の全ての UVM クラスのベースクラスになっています。uvm_objectクラ

スはアブストラクトクラスであるため、uvm_object のインスタンスを作る事はできません。

但し、uvm_object クラスのハンドルを定義する事は可能です。例えば、メソッドの引数とし

てジェネリックなハンドルを宣言するために使用する事ができます。

uvm_object クラスから定義された重要なクラスとして、uvm_sequence_item と uvm_component

の 2 つのクラスがあります(図 3-1)。前者はデータ(トランザクション)を記述するために

使用します。後者は、シミュレーションのエンティティ(コンポーネント)を記述するため

に使用します。UVM はコンポーネントインスタンスを実行する事によりシミュレーションを

遂行します。トランザクションはシミュレーションの対象ではありません。図 3-1 における、

uvm_report_object および uvm_transaction クラスは、ユーザが直接使用すべきではありません

が、UVM クラス階層上の厳密性のため紹介しています。

図 3-1 uvm_object、uvm_sequence_item、uvm_component クラスの関連

コンポーネントは、デザインにおけるモジュールと同様に階層を構成します。階層はシミュ

レーション実行開始直前に決定します。通常は、コンポーネントの build_phase() と

connect_phase()で階層、および構成を決定します。コンポーネントのコンストラクタではコン

ポーネントのインスタンスを作らないのが一般的です。特別な場合を除き、コンストラクタ

ではコンポーネントのインスタンスを作るべきではありません。

3.2 コンストラクタ

UVM では、コンストラクタに対して一般的なルールがあります。ルールに従う事でコンパイ

ル時に発生する解析不能な問題を未然に防ぐ事ができます。ルールは、トランザクションと

コンポーネントでは多少異なります。

3.2.1 トランザクション

トランザクションは自動生成の対象になるので、特別な配慮が必要です。すなわち、データ

オブジェクトでは、次のように名称に対して標準値を設定します。また、コンストラクタの

先頭で super.new(name)を呼び出す事も必要です。

uvm_report_object uvm_transaction

uvm_object

uvm_component uvm_sequence_item

アブストラクトクラス

Page 20: Artgraphics...実践 UVM 入門 ©2020 アートグラフィックス 〒124-0012 東京邴葛飾区立石 8-14-1  A Practical Guide to Learning UVM ©2020

実践 UVM 入門

48

Copyright 2020 © Artgraphics. All rights reserved.

class simple_item extends uvm_sequence_item;

...

function new(string name="simple_item"); super.new(name); endfunction

...

endclass

このように定義するとトランザクションの生成を自動的に行なえます。以下の例を参考にし

て下さい。名称に標準値を設定しておかないと、生成する時には名称が必要となるため、ト

ランザクションの自動生成が複雑になります。

例 3-1 トランザクションのコンストラクタ定義例

最も簡単なトランザクションは以下のようになります。この定義にはフィールドが含まれて

いないため、実用的ではありませんが、UVM のルールを説明するには十分な内容を含んでい

ます。

class simple_item extends uvm_sequence_item;

`uvm_object_utils(simple_item)

function new(string name="simple_item"); super.new(name); endfunction

endclass

このように定義すると、名称を指定せずにトランザクションを機械的に作成する事ができま

す。以下に示す例では、ファクトリメソッドを使用してトランザクションの生成をしていま

す。

simple_item item;

item = simple_item::type_id::create();

3.2.2 メソドロジークラス

コンポーネントは階層を構築するため、コンストラクタには階層上での親コンポーネントの

指定が必要になります。また、インスタンス名称には標準値を設定しません。同じ階層レベ

ル内には、ユニークなインスタンス名称が必要なため、このような配慮が必要になります。

例えば、コンストラクタでは次のようにインスタンス名称と親コンポーネントを指定する必

要があります。

class simple_comp extends uvm_component;

...

function new(string name,uvm_component parent); super.new(name,parent); endfunction

...

endclass

更に、上記のようにコンストラクタの先頭で super.new()を呼び出す事が必要です。ここで、

parent==null であれば、作成されるインスタンスは階層上のトップレベルに配置されます。

コンストラクタの引数に標

準値を設定し、 super.new()

を最初に呼び出す

標準値を設定しない

Page 21: Artgraphics...実践 UVM 入門 ©2020 アートグラフィックス 〒124-0012 東京邴葛飾区立石 8-14-1  A Practical Guide to Learning UVM ©2020

実践 UVM 入門

99

Copyright 2020 © Artgraphics. All rights reserved.

4 UVM 検証コンポーネントの開発

本章では UVM 検証環境を構成する UVM 検証コンポーネントの開発法を解説します。主とし

て、表 4-1 に示すクラス、およびモジュールの定義法を詳しく解説します。

表 4-1 検証環境を構成する主な検証コンポーネント

検証環境の要素 機能

トランザクション トランザクションは DUT を検証するために使用される RTL より高

位のデータ表現です。

ドライバー ドライバーは、トランザクションをシーケンサーから取得し、シグ

ナルレベルに変換して DUT をドライブします。

シーケンス シーケンスは、トランザクションを自動的に生成するためのシナリ

オです。バッチコマンド処理用のスクリプトのような役割を果たし

ます。

シーケンサー シーケンサーは、ドライバーの要求に応じてトランザクションを生

成します。実際には、シーケンサーはシーケンスのオブジェクトを

作成して実行する事によりトランザクションを生成します。

コレクター コレクターは、DUT からのレスポンスをサンプリングしてトラン

ザクションに変換し、モニターに送信します。

モニター モニターは、トランザクションをコレクターから受信して、カバレ

ッジ計算、レスポンスチェック等を行います。そして、更に詳細な

解析を任せるために、トランザクションを他の検証コンポーネント

に転送します。

エージェント エージェントは、シーケンサー、ドライバー、コレクター、モニタ

ーを備えた基本的な検証コンポーネントです。

エンバイロンメント エンバイロンメントは、各種のエージェント、および他のエンバイ

ロンメントを含む階層的な検証コンポーネントです。例えば、IP、

および SoC 等が対応します。

テスト テストは、具体的なテスト項目を指定するためのクラスです。

テストベンチ

(モジュール)

テストベンチは、テストを実行するためのトップモジュールです。

テストベンチは一つでも複数のテストケースの実行制御をする事が

できます。

本章の記述では以下の enum を参照します。

typedef enum { ADD, GT, MUL } operation_e;

4.1 トランザクション

4.1.1 トランザクションの定義

トランザクションは DUT をドライブするために必要な高レベルなデータアイテムです。トラ

ンザクションは uvm_sequence_item、またはそのサブクラスを使用して定義します。手順をま

とめると以下のようになります。

① uvm_sequence_item、またはそのサブクラスからトランザクションを定義する。

② トランザクションに必要なフィールドを定義する。フィールドを定義しないと、トラン

ザクションとしては役目を果たしません。

③ フィールドを定義する場合、幾つかのフィールドには rand、または randc 属性を付加す

る必要性が出て来ます。

④ フィールドにランダム属性を定義した場合、乱数発生に関する制約が必要になります。

⑤ 必要に応じて制御フィールドを定義する。トランザクション生成を効果的に行なうため

には、生成法を制御する必要があります。制御フィールドは DUTには渡されないため、

フィールドマクロの指定にオプションが必要です。

Page 22: Artgraphics...実践 UVM 入門 ©2020 アートグラフィックス 〒124-0012 東京邴葛飾区立石 8-14-1  A Practical Guide to Learning UVM ©2020

実践 UVM 入門

100

Copyright 2020 © Artgraphics. All rights reserved.

⑥ UVM マクロを定義する。フィールドの存在に関わらず UVM マクロは必須です。

⑦ コンストラクタを定義する。省略可能ですが、定義する方が望ましいと言われています。

⑧ コンストラクタ内で super.new(name)を呼び出す。

例 4-1 トランザクションの定義例

以下に簡単なトランザクションの定義例を示します。このトランザクションは、

uvm_sequence_item から直接定義しています。

class simple_item_base extends uvm_sequence_item; rand bit [31:0] a, b;

bit [31:0] q;

rand operation_e op_code;

rand int unsigned delay;

`uvm_object_utils_begin(simple_item_base) `uvm_field_int(a,UVM_DEFAULT) `uvm_field_int(b,UVM_DEFAULT) `uvm_field_enum(operation_e,op_code,UVM_DEFAULT) `uvm_field_int(q,UVM_DEFAULT|UVM_NOCOMPARE|UVM_NOPACK) `uvm_field_int(delay,UVM_DEFAULT|UVM_NOCOMPARE|UVM_NOPACK) `uvm_object_utils_end

function new(string name="simple_item_base");

super.new(name);

endfunction

endclass

一般的に、トランザクションのプロパーティには rand/randc属性を付加する必要があります。

プロパーティ delayは制御フィールドで、トランザクション生成のタイミングを制御するため

に使用しされます。したがって、このプロパーティは DUT に渡されないので、フィールドマ

クロで以下のようなオプションを指定しています。

`uvm_field_int(delay,UVM_DEFAULT|UVM_NOCOMPARE|UVM_NOPACK)

4.1.2 クラスインヘリタンスと制約の追加

トランザクションにはランダム変数が定義されています。ランダム変数に制約を課さずに乱

数を割り当てる事は意味のないテストデータを生成する事になります。そのため、ランダム

変数に制約を定義します。その際、トランザクションに定義されている全てのランダム変数

に制約を定義すると、管理が複雑になるだけでなく、様々なテストケースに対応する事が難

しくなります。多くのテスト条件に柔軟に対応するためには、以下の方法は効果的です。

仕様を基にしてトランザクションのベースクラスを定義する。テストケースに依存する

項目には、rand、又は、randc 属性を付加する。

原則として、ベースクラスには制約を定義しない。

テストケースに依存する条件をクラスインヘリタンスにより追加して行く。

例 4-2 クラスインヘリタンスによる制約の追加例

例えば、次のようにしてクラスインヘリタンスを利用して制約を定義します。このトランザ

クション(small_operand_item)では、ランダム変数 a、および b の値を 10 より小さくなるよ

うに調節しています。

Page 23: Artgraphics...実践 UVM 入門 ©2020 アートグラフィックス 〒124-0012 東京邴葛飾区立石 8-14-1  A Practical Guide to Learning UVM ©2020

実践 UVM 入門

105

Copyright 2020 © Artgraphics. All rights reserved.

4.3 ドライバー

4.3.1 概要

ドライバーは以下のような機能を持ちます。

シーケンサーからトランザクションを取得する。

取得したトランザクションをシグナルレベルに変換する。

ドライバーは virtual インターフェースを使用して DUTに信号を送る。インターフェース

には DUT のポートが接続されているので、virtual インターフェースでその信号値を変更

すると、DUT にその変化が反映されて DUT が反応する。

UVM では、シーケンサーとドライバーの接続は、図 4-1 のように表現されます。

図 4-1 シーケンサーとドライバーの通信([2])

ドライバーを定義する手順をまとめると以下のようになります。

① uvm_driver、または、そのサブクラスからドライバーを定義する。直接 uvm_driver から

定義する場合には、トランザクションの型(REQ)、およびシーケンサーに戻すトラン

ザクションの型(RSP)を指定する。

② virtual インターフェースを宣言する。

③ UVM マクロを定義する。

④ build_phase()又は connect_phase()で virtual インターフェースを設定する。

⑤ run_phase()にトランザクションの処理手順を定義する。

ベースクラスの uvm_driver は以下のように宣言されています。RSP を省略すると RSP==REQ

と仮定されます。

class uvm_driver #(type REQ=uvm_sequence_item, type RSP=REQ) extends uvm_component;

uvm_driverには、表 4-2のような重要なプロパーティが定義されているので、ドライバーの記

述で自由に使用する事ができます。特に、seq_item_port はトランザクションを取得する際に

使用する事ができるので非常に便利です。また、トランザクションをシーケンサーから受け

取るために変数 reqを指定する事ができます。このように、重要なプロパーティが定義されて

いる事実から、メソドロジークラスを使用する利点があります。もし、uvm_driver を使用し

ないと、全ての準備作業をユーザ自身で記述しなければなりません。

表 4-2 uvm_driver が備えている重要なプロパーティ

重要なプロパーティ 意味

req REQ 型のプロパーティでトランザクションを意味します。

rsp RSP型のプロパーティでシーケンサーに戻すレスポンスを指定する

際に使用します。

seq_item_port シーケンサーと通信するための TLM-port です。

この TLM-port は uvm_driver のコンストラクタで作成されます。

sequencer driver seq_item_export

seq_item_port vif

Page 24: Artgraphics...実践 UVM 入門 ©2020 アートグラフィックス 〒124-0012 東京邴葛飾区立石 8-14-1  A Practical Guide to Learning UVM ©2020

実践 UVM 入門

106

Copyright 2020 © Artgraphics. All rights reserved.

実際問題として、seq_item_port は uvm_driver クラス内で以下のように宣言されています。

uvm_seq_item_pull_port #(REQ, RSP) seq_item_port;

ドライバーはトランザクションを取得するために、get_next_item()メソッドを呼び出します。

すると、uvm_sequencer に定義されている get_next_item()メソッドが呼ばれてトランザクショ

ンが準備されます(図 4-2)。

図 4-2 ドライバーがトランザクションを取得する流れ

ドライバーには二つのアプローチがあります。全ての機能を含んだドライバーを必要に応じ

て記述する標準的な方法と、ドライバーの一般的な機能をベースクラスと定義して再利用可

能にする方法があります。両者の方法を順に解説します。

4.3.2 標準的なドライバー記述法

標準的なアプローチでドライバーを記述する事から始めます。すなわち、ドライバーのクラ

スに全ての機能を実装するようにします。

例 4-7 標準的なアプローチによるドライバー記述例

ドライバーの全容は以下のようになります。

class simple_driver extends uvm_driver #(simple_item); virtual simple_if vif;

`uvm_component_utils(simple_driver)

function new(string name,uvm_component parent);

super.new(name,parent);

endfunction

extern function void build_phase(uvm_phase phase);

extern task run_phase(uvm_phase phase);

extern task get_and_drive();

extern task drive_item(input simple_item item);

endclass

このクラスは以下のような役割を持ちます。

virtual インターフェースの変数 vif を宣言する。

build_phase()で virtual インターフェースの設定処理をする。

run_phase()は DUT をドライブするための実行制御を行う。

get_and_drive()はシーケンサーからトランザクションを取得して DUT をドライブする。

drive_item()が DUT をドライブする。

task get_next_item (output REQ t); ... endtask

class simple_driver extends uvm_driver #(simple_item); ... task run_phase(uvm_phase phase); ... seq_item_port.get_next_item(s_item); ... endtask endclass

uvm_sequencer

Page 25: Artgraphics...実践 UVM 入門 ©2020 アートグラフィックス 〒124-0012 東京邴葛飾区立石 8-14-1  A Practical Guide to Learning UVM ©2020

実践 UVM 入門

111

Copyright 2020 © Artgraphics. All rights reserved.

4.4 シーケンス

4.4.1 概要

シーケンスは単にトランザクションを作るだけでなく、他のシーケンスと組み合わせて複雑

なシナリオを生成する事もできます。例えば、シーケンス 1 とシーケンス 2 を組み合わせて

複雑なシーケンスを構築する事ができます。この機能を利用する事によりシナリオの再利用

性は拡大します。個々の目的別シーケンスをライブラリーとして準備し、ライブラリーに登

録されている小さなシーケンスを組み合わせて意義のある大きなシナリオを構築する事がで

きます。図 4-4は 3つのシーケンスを組み合わせ一つのシナリオを構築している様子を示して

います。シーケンス main sequence は階層のルートシーケンスになります。

図 4-4 階層的シーケンスによるシナリオ構築

4.4.2 シーケンスの定義手順

テストシナリオの作成はシーケンスの作成に尽きます。シーケンスが実行する事により有意

義なトランザクションが作成されます。シーケンスを定義する手順は以下のようになります。

① uvm_sequence、またはそのサブクラスからシーケンスを定義する。その際、トランザク

ションのタイプ(REQ)、およびドライバーがシーケンサーに戻すレスポンスのタイプ

(RSP)を指定する。

② シーケンスに対して、`uvm_object_utilsマクロを定義する。シーケンスは、コンポーネン

トではないので、`uvm_component_utils マクロを使用する事はできません。

③ 必要に応じて、`uvm_declare_p_sequencer マクロを使用してシーケンサーへのポインター

を宣言する。

④ シーケンスに body()タスクを定義する。

ベースクラスの uvm_sequence は以下のように宣言されています。

virtual class uvm_sequence #(type REQ = uvm_sequence_item, type RSP = REQ) extends uvm_sequence_base;

uvm_sequence クラスはプロパーティとして req(REQ 型)、および rsp(RSP 型)を以下のよ

うに確保しているので、ユーザが定義したシーケンス内ではそれらの変数を自由に使用する

事ができます。

virtual class uvm_sequence #(type REQ = uvm_sequence_item,

type RSP = REQ) extends uvm_sequence_base;

...

REQ req;

main sequence

subsequence 1 subsequence 2 subsequence 3

transaction 1-1 transaction 1-2 transaction 2-1 transaction 2-2 transaction 3-1

Page 26: Artgraphics...実践 UVM 入門 ©2020 アートグラフィックス 〒124-0012 東京邴葛飾区立石 8-14-1  A Practical Guide to Learning UVM ©2020

実践 UVM 入門

112

Copyright 2020 © Artgraphics. All rights reserved.

RSP rsp; ...

endclass

実際問題として body()タスクを除くと、シーケンスは殆ど標準的な記述になります。

4.4.3 body()タスク

一般的に、body()タスクの内容は以下のようになります。

task body();

repeat( num_seq )

`uvm_do(req) endtask

即ち、シーケンスはトランザクションを作りシーケンサーに渡します。これを num_seq 回繰

り返して終了します。`uvm_do マクロに加えて`uvm_do_with マクロを使用する事ができます。

num_seq の値は、シーケンスが作られた後に randomize()メソッドで決定されます。

4.4.4 `uvm_do マクロと`uvm_do_with マクロ

`uvm_do マクロは以下の機能を展開します。

トランザクションの要求があるまで待ちます。

トランザクションの要求があると、トランザクションを生成しトランザクションのフィ

ールドに乱数を発生させます。

トランザクションをシーケンサーに送信し、シーケンサーはドライバーにトランザクシ

ョンを送信します。

ドライバーが item_done()でトランザクションの処理を終了するのを待ちます。

別のマクロ`uvm_do_with はトランザクションの乱数発生に対する制約条件を追加する場合に

使用します。例えば、以下のように制約を追加する事ができます。

`uvm_do_with(req,{(req.a > 2} && (req.b > 2);})

ここで、制約を{…}で指定しましたが、制約内はトランザクションのスコープを意味するの

で、以下のように簡略化した記述が可能です。但し、a、または b と同じ名称がシーケンス内

に定義されている時は、この簡略記述法を避けなければなりません。

`uvm_do_with(req,{(a > 2} && (b > 2);})

4.4.5 raise_objection()と drop_objection()

既に紹介したようにシミュレーションが進行するためには、 raise_objection() と

drop_objection()を呼ばれなければなりません。便利な事に、シーケンス内でこの呼び出しを

行う事ができます。例えば、次のようにすると、シーケンスがルートシーケンスである時の

み、シーケンスの開始時に raise_objection()を呼び、終了時に drop_objection()を呼ぶようにな

ります。

task body();

uvm_phase ph;

ph = get_starting_phase();

if( ph != null )

ph.raise_objection(this);

repeat( num_data )

Page 27: Artgraphics...実践 UVM 入門 ©2020 アートグラフィックス 〒124-0012 東京邴葛飾区立石 8-14-1  A Practical Guide to Learning UVM ©2020

実践 UVM 入門

117

Copyright 2020 © Artgraphics. All rights reserved.

`uvm_do_with(sub1,{sub1.starting_a == 5;})

$display("----------------------------------------");

repeat( 2 ) `uvm_do_with(sub2,{sub2.starting_op_code == GT;}) endtask

endclass

このシーケンスは二つのステップで構成されます。ステップ 1はサブシーケンス 1を実行し、

ステップ 2 ではサブシーケンス 2 を実行します。

ステップ 1 は a の値を 5 より小さいように制限しています。ステップ 2 では op_code を GT に

固定しています。

4.5 シーケンサー

シーケンサーは、ドライバーの要求に応じてトランザクションを生成します。トランザクシ

ョンを生成するための手順はシーケンスに定義されているため、シーケンサーはシーケンス

のオブジェクトを作り、トランザクションを生成します。したがって、ドライバー、シーケ

ンサー、シーケンスの間で複雑な処理が行われて、トランザクションが生成されます。本節

では、シーケンサーの定義法、およびこれら一連の処理を解説します。

4.5.1 シーケンサーの定義

シーケンサーはドライバーから get_next_tem()が呼ばれるとトランザクションを作り乱数を設

定した後、ドライバーに戻します。実際には、データの準備をシーケンスが行い、シーケン

サーはシーケンスの制御をするだけです。このため、一般的には、シーケンサーは以下に示

すように簡単な構造を持ちます。

シーケンス、およびトランザクションはオブジェクトでありコンポーネントではありません。

一方、シーケンサーはコンポーネントです。したがって、シーケンサーはコンポーネントイ

ンスタンスの階層構造に含まれて実行エントリーになります。実際問題として、シーケンサ

ーの run_phase()は非常に重要な働きをします。通常、このフェーズに関して default_sequence

の設定が行われます。シーケンサーを定義する手順は以下のようになります。

① uvm_sequencer、またはそのサブクラスからシーケンサーを定義する。

② UVM マクロを定義する。

③ コンストラクタを定義する。

ベースクラスの uvm_sequencer は以下のように宣言されています。

class uvm_sequencer #(type REQ=uvm_sequence_item,RSP=REQ) extends uvm_sequencer_param_base #(REQ, RSP);

シーケンサーには、以下のような重要なプロパーティが宣言されています。

uvm_seq_item_pull_imp #(REQ, RSP, this_type) seq_item_export;

この TLM-export を使用してトランザクションを送信する事ができます。次に、シーケンサー

の定義例を示します。

例 4-13 シーケンサーの定義例

シーケンサーは、通常、以下に示すような簡単な定義で済みます。

Page 28: Artgraphics...実践 UVM 入門 ©2020 アートグラフィックス 〒124-0012 東京邴葛飾区立石 8-14-1  A Practical Guide to Learning UVM ©2020

実践 UVM 入門

118

Copyright 2020 © Artgraphics. All rights reserved.

class simple_sequencer extends uvm_sequencer #(simple_item);

`uvm_component_utils(simple_sequencer)

function new(string name,uvm_component parent);

super.new(name,parent);

endfunction

endclass

ベースクラスの uvm_sequencer、uvm_sequencer_param_base、uvm_sequencer_base 等が複雑な

処理を担当しています。

4.5.2 シーケンサーとドライバーの基本的なハンドシェーク

基本的なハンドシェークは get_next_item()と item_done()を用いて行います。ドライバーが

get_next_item()を呼ぶとトランザクションが戻されるまでドライバーは待ち状態に入ります。

トランザクションの準備が完了すると、get_next_item()が終了し、ドライバーの実行が再開し

ます。ドライバーは DUT をドライブしてトランザクションの処理を終了すると、そのトラン

ザクションに関する処理を終了した旨を item_done()により知らせます。すると、シーケンサ

ーはシーケンスに item_done()の情報を知らせます。ドライバーの処理は、一般的に、以下の

ようになります。

class driver extends uvm_driver #(simple_item);

...

task run_phase(uvm_phase phase);

...

forever begin

seq_item_port.get_next_item(req); send_to_dut(req);

seq_item_port.item_done(); end

endtask

...

endclass

ここで、get_next_item()タスクはブロッキングですが、その他のタスクとしてノンブロッキン

グ try_next_item()を使用する事ができます。

参考 4-2

ドライバーはトランザクション取得を無限回繰り返しますが、drop_objection()によりオブジ

ェクションの数が 0 になると全ての run_phase()は終了させられます。したがって、forever ル

ープ処理の記述は安全です。既に述べたように、一般的には、シーケンスの処理が終了する

と drop_objection()が呼ばれる仕組みに設定されています。

ここで示したように、ドライバーはトランザクションの取得処理と DUT をドライブする処理

に専念する記述スタイルは機能的にも明瞭で、実装と維持が容易になると期待する事ができ

ます。ドライバー内で、raise_objection()や drop_objection()を呼び出す制御を避ける必要があ

ります。

4.5.3 トランザクションを取得する流れ

図 4-6 はドライバーがトランザクションを取得する際の実行の流れを示しています。

item_done()によりトランザクシ

ョンの使用を終了する

トランザクション

を取得する

Page 29: Artgraphics...実践 UVM 入門 ©2020 アートグラフィックス 〒124-0012 東京邴葛飾区立石 8-14-1  A Practical Guide to Learning UVM ©2020

実践 UVM 入門

170

Copyright 2020 © Artgraphics. All rights reserved.

typedef enum bit [1:0] { ST0=0, ST1, ST2 } state_e;

あるいは、以下のようにしても良いです。こうすると、stateと next_stateの初期値は ST0とな

ります。

typedef enum { ST0=0, ST1, ST2 } state_e;

6.7 UVM とファンクショナルカバレッジ

6.7.1 概要

検証の自動化を推進するためには、ファンクショナルカバレッジは必須の手段となります。

UVM による検証環境では、コレクターやモニターがカバレッジ計算を行います。もちろん、

他の検証コンポーネント、例えば、スコアボード等でもカバレッジ計算を行う事ができます。

図 6-6 は、検証環境でファンクショナルカバレッジが使用される環境構成を示しています。

図 6-6 検証環境でのファンクショナルカバレッジの使用

カバレッジは、トランザクションに定義されているフィールドに関する検証状況を集計する

目的を持ちます。しかし、トランザクションは一時的に発生するオブジェクトであるので、

カバレッジモデルの定義をトランザクション内に定義する事は正しくありません。この意味

において、クラス内に定義する標準的なカバレッジ定義と異なる手法が求められます。以下

では、UVM による検証環境を前提として、カバレッジモデルの定義、およびカバレッジ計算

の方法を解説します。ただし、ここで紹介する判断記述は絶対的ではなく、実践状況に依存

すると理解して下さい。

6.7.2 カバレッジ計算

トランザクションを生成するのはシーケンスですが、シーケンスには DUT に関する知識が全

くないため、シーケンスがカバレッジ計算をするのは不適切です。同様に、シーケンサーも

不適切です。何故なら、シーケンサーは、DUT からのレスポンスに関する知識がありません。

一方、ドライバーはDUTに関する知識を持ちますが、DUTからのレスポンスには関与してい

ません。それ故、ドライバー内でカバレッジ計算をするのも不適切です。

さて、コレクターとモニターがカバレッジ計算をする候補として残りますが、何れのコンポ

ーネントも技術的には、カバレッジ計算をする事は可能です。しかし、コレクターは DUT か

vif

driver

interface

DUT

vif: virtual interface

monitor/ collector

vif

generator

test components

testbench class packet_t; ...

endclass

class monitor_t; covergroup cg; ... endgroup endclass

Page 30: Artgraphics...実践 UVM 入門 ©2020 アートグラフィックス 〒124-0012 東京邴葛飾区立石 8-14-1  A Practical Guide to Learning UVM ©2020

実践 UVM 入門

171

Copyright 2020 © Artgraphics. All rights reserved.

らのレスポンスをトランザクションに変換し、モニターに送信する機能だけに徹しておく方

が構造的には明確に機能分離をできます。したがって、モニター内にカバレッジモデルを定

義して、カバレッジ計算を行う事にします。

モニターがカバレッジ計算をする際には、トランザクションに定義されている殆どのフィー

ルドが検証に使用されている状態にあります。すなわち、モニターが受け取るトランザクシ

ョンには、DUT に使用された入力、および DUT からの出力が正しく記録されています。

参考 6-4

モニターがカバレッジ計算をするように設計したとしても、実際にカバレッジ計算を遂行す

るか否かを選択できるようにコンフィギュレーションパラメータを準備しておくと便利です。

6.7.3 カバレッジモデルの定義

モニターの内部にカバレッジモデルを定義するので、embedded カバーグループになります。

したがって、モニターのコンストラクタはカバーグループのオブジェクトを作らなければな

りません。そして、カバレッジ計算の対象は、モニター内に定義されていないので、必ず、

カバーポイントを明示的に定義し、外部からカバーポイントの値を取得するようにしなけれ

ばなりません。つまり、embedded カバーグループ内にビルトイン sample()メソッドを定義し

なければなりません。

6.7.4 カバレッジ計算例

シーケンサー、ドライバー、コレクター、モニター、DUT 等を含んだ検証環境を作り、モニ

ターがカバレッジ計算をする例を提示します。記述には多少の冗長性はありますが、以下に

紹介する記述例はコードスニペットとしての利用価値もあります。この例では、図 6-7 に示

す検証環境を使用します。

図 6-7 カバレッジ計算に使用する検証環境

dut (RTL)

vif interface

adder _driver

vif: virtual interface

adder _collector adder _monitor

vif

adder_sequencer

adder_agent

module top; bit clk; // ... adder_if aif(clk); dut DUT(.a(aif.a),...); endmodule

interface adder_if(input bit clk); // ... clocking cb @(posedge clk); // ... endclocking endinterface

adder_env

adder_test

adder_

sequence

default_

sequence