SV
port, export は TLM の抽象度でデータを送受する仕組み
port がマスター、export がスレーブ
記号
port □
export 〇
矢印はデータの流れる方向らしい(リクエストを出す方向ではないらしい)
https://www.chipverify.com/images/uvm/tlm.png
マスターからスレーブにデータを送る
こちらを参照
ポイント:
リクエストを出す側の component に以下のメンバーを作る
uvm_blocking_put_port # ( my_packet ) m_put_port ; build_phase で m_put_port を new
run_phase などで m_put_port.put ( data )
リクエストを受ける側の component に以下の実装を行う
uvm_blocking_put_imp # ( my_packet, component ) m_put_imp ; build_phase で m_put_imp を new
task put ( my_packet data ) ; の中を実装する
上位でポート同士を接続する
comp_A.m_put_port.connect ( comp_B.m_put_imp ) ; // port に export をつなぐ
blocking なので、スレーブ側の put が終わるまで、マスター側は put の次に進めない
nonblocking なのでマスター側はリクエストを出してすぐ次に進む
クラスは uvm_nonblocking_put_port # ( my_packet )
マスターは put ではなく try_put を使う。1 が返るとリクエストが成功
can_put も使える
スレーブは try_put, can_put を実装する。function bit try_put ( my_packet ) として実装する
こちら を参照
マスター側の親階層に同じタイプの port を定義し、子供の port から 親の port を接続する
スレーブ側の親階層に put_export を定義し、それを子の port_imp に接続する
スレーブからマスターにデータを送る
ポイント:
リクエストを出す側の component に以下のメンバーを作る
uvm_blocking_get_port # ( my_packet ) m_put_port ; build_phase で m_get_port を new
run_phase などで m_get_port.get ( data )
リクエストを受ける側の component に以下の実装を行う
uvm_blocking_get_imp # ( my_packet, component ) m_get_imp ; build_phase で m_get_imp を new
task get ( my_packet data ) ; の中を実装する ( データを送る )
上位でポート同士を接続する
comp_A.m_put_port.connect ( comp_B.m_put_imp ) ; // port に export をつなぐ
blocking なので、スレーブ側の get が終わるまで、マスター側は get の次に進めない
put の場合とほぼ同じ説明になるので割愛