For Good FPGA Design

UVMのTLMとは?(1) 解説編

今回は、UVM (Universal Verification Methodology) のコンポーネント(機能ブロック)間の通信で使われる、TLMについて説明します。

目次

TLM

TLMは、Transaction Level Modelingの略です。TLM、回路記述で使われるシグナルレベルよりも高位の記述法です。

「高位」というのは、より人間の思考に近いということです。例えば、「アドレス0x0004に対して、データ0x1234をライトする」というかんじです。これに対してシグナルレベルは、例えば、「データをライトするために、valid信号をhighにして…ack信号を待って…」というかんじです。

TLMでやりとりされるデータのひとかたまりを、トランザクションといいます。

検証対象の回路はシグナルレベルで動作するので、UVMでは、トランザクションとシグナルレベルの変換をDriverとCollectorが行います。UVMコンポーネント間の通信はTLMであり、トランザクションのやりとりで行います(図1)。

図1 TLMとSignal Level

TLMのポート

TLMを使うためには、TLMのポートを定義して接続します。ポートの種類を表1に示します。

ポート説明
TLM port何らかのトランザクションに対する動作を発生させるポートです。これは、put( )メソッドやget( )メソッドの呼び出しをのことです。
TLM export何らかのトランザクションに対する処理を定義します。TLM port側でput( )メソッドやget( )メソッドを呼ぶと、そのポートに接続されたTLM export側のput( )やget( )が呼ばれます。TLM export側では、この時の動作をタスクとして定義しておく必要があります。
Analysis port1対Nの接続で使います。このポートが1側です。TLM portと同様に、動作を発生させるポートです。Analysis portでは、write( )メソッドの呼び出しを行います。
Analysis export1対Nの接続で使います。このポートがN側です。接続されたAnalysis port側でwrite( )メソッドを呼ぶと、Analysis export側でwrite( )が呼ばれます。Analysis exportでは、write( )の処理を定義しておく必要があります。Analysis exportは複数個ある前提なので、時間を消費できません。したがって、ファンクションで処理を定義します。
表1 TLMのポート

図2にTLMポートの記号と接続を示します。TLM portは□(四角)、Analysis portは◇(菱形)、TLM exportとAnalysis exportは○(丸)で示します。

  • 図2(a)では、Consumerがget( )を呼び出します。Producerがput( )の動作と定義しておく必要があります
  • 図2(b)では、Producerがput( )を呼び出します。Consumerがput( )の動作を定義しておく必要があります
  • 図2(c)では、Producerがwrite( )を呼び出します。Subscriberたちはwrite( )の動作を定義しておく必要があります
図2(a) get_port/get_export
図2(b) put_port/put_export
図2(c) analysis_port/analysis_export

トランザクションの定義

トランザクションはuvm_sequence_item (またはそのサブクラス) を継承して定義します。

例を示します。

simple_transaction.sv

  • 2, 3行目:フィールドを定義します。フィールドが無いと、トランザクションとして意味がありません。また、必要に応じてランダム属性(rand)を付けます。
  • 5, 6行目:ランダム属性を付けたフィールドについて、制約を与えます。この例の場合、data_eは偶数、data_oは奇数のランダム値が生成されます。
  • 8~11行目:UVMマクロを定義します。これは必ず必要です。
  • 13~15行目:コンストラクタを定義します。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
class simple_transaction extends uvm_sequence_item;
rand bit[7:0] data_e;
rand bit[7:0] data_o;
 
constraint CE { data_e[0] == 1'b0; }    // Even number
constraint CO { data_o[0] == 1'b1; }    // Odd number
 
`uvm_object_utils_begin(simple_transaction)
    `uvm_field_int(data_e, UVM_DEFAULT)
    `uvm_field_int(data_o, UVM_DEFAULT)
`uvm_component_utils_end
 
function new (string name = "simple_transaction");
    super.new(name);
endfunction
 
endclass

TLMの使用例

記事を分けてTLMの使用例を示します。

まとめ

今回は、UVMのコンポーネント間の通信で使用されるTLMについて解説しました。使用例を見ると、動作がよりイメージできると思いますので、ぜひご覧ください。

アバター画像
この記事を書いた人
ジーノ。大手電機メーカーで、基板設計の全般と、FPGAの設計に従事した経験を活かし、FPGAについて情報発信中。
RTL設計、シミュレーション、タイミング・クロージャ、FPGAまわりのハードウェア開発まで、幅広く取り扱っております。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

CAPTCHA