News and Views 2012 Summer / Vol. 2: 上流設計&組込み

UVM Connectのご紹介

今回はUVM Connectと呼ばれるオープンソースのライブラリについてご紹介しましょう。このライブラリは、Verification Academyのウェブサイト(www.verificationacademy.com)からダウンロードできます。

UVM Connect(UVMC)を使用すると、SystemCとSystemVerilogのモデルやコンポーネント間におけるTLM 1.0とTLM 2.0の接続やオブジェクト渡しが可能になります。さらにUVMで定義されたコマンドAPIを用いて、SystemC、C、C++側からUVMシミュレーションを制御させることもできます。

図1.UVM Connectを使用するとSystemCとSystemVerilog間のTMLを介した接続などが可能に図1.UVM Connectを使用するとSystemCとSystemVerilog間のTMLを介した接続などが可能に

IPや検証IP(VIP)の再利用性を可能にするテクノロジ

また、UVM Connectを用いることで、IP、検証IP(VIP)の再利用性を最大限にまで引き出します。そのいくつかの使用例についてご紹介します。

抽象度の詳細化
UVMを用いた機能検証において、SystemCのアーキテクチャ上のモデルをリファレンスモデルとして再利用します。SystemVerilogで記述されたスティミュラス生成のエージェントを再利用してSystemCのモデルを検証することも可能です。

既存VIPの拡張
SystemCかSystemVerilogの言語で記述されたVIPがある場合、その言語の壁をなくし、より多くの状況で使用可能になることから、まさにIPの再利用性を最大にします。ちょうど、VerilogシミュレーションにおけるVHDLのIPの使用や、その逆での混在シミュレーションに似ています。大規模なSoCシステムを検証する場合、設計上の問題よりも統合上の問題の方が顕著になります。

言語の強みを活かす
それぞれの言語には強みがあります。SystemVerilogではパワフルな制約ソルバを用いてUVMシーケンスによってランダム・スティミュラスを発生させ、SystemCのアーキテクチャモデルを検証することが可能です。また一方、SystemCの強みであるUntimedやLT(Loosely Timed)のモデルを用いて検証のスピードやキャパシティにおけるメリットを得ることができます。

SystemCからSystemVerilogへのアクセス
UVMのコマンドAPIを用いて、SystemVerilogによるUVMシミュレーションとSystemCの間を橋渡しします。このAPIを用いることで、UVMのあるフェーズから次のフェーズへと移行するのを待ったり、あるいは制御したり、コンフィギュレーション情報を設定したり取得したり、UVMスタイルのレポートを生成させたり、さらにはファクトリタイプの設定やインスタンスの上書きなど、さまざまな機能を得ることができます。

UVM Connectは標準のUVMに対してオプション的な機能を提供するパッケージで、AccelleraのUVM 1.1aとそれ以降のバージョンに対して適用できます。またUVM Connectの使用には、既存のUVMコードやベースライブラリをそのまま使うことができます。追加作業となる変更や修正は一切発生しません。

UVM Connectでのコンポーネント接続

検証コンポーネントが通信するためには、そのデータやインタフェースについて、事前に決められたルールに従う必要があります。TLM接続ではオブジェクトのタイプに対するパラメータ化が可能で、これにより統合上のコストを低く押さえることができ、再利用性を高めます。UVM Connectでは「connect」と「connect_hier」という関数を定義し、SystemCとSystemVerilogの言語間での壁を超えた接続を可能にしています。

SystemVerilog SystemC

図2. 「connect」関数を使ったSystemCとSystemVerilogの接続/通信 図2. 「connect」関数を使ったSystemCとSystemVerilogの接続/通信

ここで「trans」は、SystemVerilogで必要となる単方向TLM 1.0の「port」、「export」、そしてその実装のトランザクションのタイプを指定します。「port_handle」や「port_ref」は、「port」、「export」、そしてその実装、インタフェース、接続するインスタンスのソケットを指示するハンドルやリファレンスとなります。また「lookup」は、対象となるポートを登録する際に必要なルックアップ用文字列を指定します。

UVM Connectは、ポートの階層的な名前や任意で指定されたルックアップ用文字列を登録し、他のポートの登録に対するマッチングをすることで、SystemCでもSystemVerilogでも関連付けることができます。2つの登録されたポート間で文字列によるマッチが合えば、結果としてポートが接続されたことになります。それはコンポーネント同士が同じ言語内であっても、他の異なる言語に及んだとしても変わりません。

ここで、「connect」関数を使って接続する実例を見てみましょう。以下は、SystemVerilogの「producer」とSystemCの「consumer」コンポーネントが、TLMソケットによる接続を介して通信する様子です。

以下のコードは、テストベンチにおけるSystemCとSytemVerilogをUVM Connectに接続させる例です。部分的なコードではないため、このまま実行できます。ここで扱っている「tlm_generic_payload」というトランザクションをSystemCとSystemVerilogのコンポーネント間でやり取りするには、このコードだけで事が足ります。

SystemVerilog SystemC

「sv_main」は、SystemVerilogで構成するトップレベルのモジュールです。ここでは「producer」というコンポーネントをインスタンス化し、次に「producer」の「out」イニシエータ・ソケットをUVM Connectで「foo」というルックアップ用文字列を使ってレジストレーションしています。そしてUVMのテストフローを始めるために、「run_test()」を呼び出しています。

「sc_main」は、SystemCで構成するトップレベルの関数です。ここでは「consumer」という「sc_module」をインスタンス化し、また「consumber」の「in」のターゲット・ソケットを、UVMCで「foo」というルックアップ用文字列を使ってレジストレーションしています。次にSystemCのシミュレーションを開始するために「sc_start」を呼び出します。

同じルックアップの文字列が使われているので、UVM Connectによるエラボレーション時に、「producer」と「consumer」のソケットが接続します。

トランザクションの変換

SystemCとSystemVerilogの言語の境界を超えてオブジェクトを転送するには、オブジェクトの変換が必要になります。UVM ConnectにはTLM GP(TLM Generic Payload)のサポートが組み込まれており、TLM GPを使用する限り、トランザクション変換については何もする必要がありません。このことから、TLM GPを使用することで、複数のIPサプライヤが各社独立して開発したコンポーネント間の相互運用性を最も高められる可能性があります。つまり可能な限り、GP – Generic Payloadを使用することが望ましいと言えます。しかし、たとえTLM GPを用いていなかったとしても、SystemCとSystemVerilog間の変換機能を作ることは、比較的単純な作業と言えます。

例として、コマンド、アドレス、そしてデータメンバの長さを示す変数を持つトランザションについて見てみましょう。基本的な定義としては以下のようになります。

SystemVerilog SystemC

UVM Connectではトランザクションのパック、アンパックに、異なるコンバータのクラスを使います。コンバータは、扱うトランザクションに関係なく定義できます。UVM Connectでは、デフォルトで使用可能なコンバータ実装を定義しています。UVM Connectは、どのようなアプリケーションでも扱えるように自由度が高いため、各言語のメソドロジ内で参照可能な実装として用意されています。