階層構造を理解する
OVMは、定義済みclassを継承してコードを書いていきますが、ビヘイビアモデルを記述するには
基本構造を理解しておく必要があります。
Hello Worldのページでovm_testというclassを継承したのですが、このovm_testというclassが
基本構造の最上位になります。構成を以下に説明します。
ovm_test
|- ovm_env (TB environment)
|- ovm_env (BFM environment)
|- ovm_agent
|- ovm_driver
|- ovm_sequencer
|- ovm_monitor
ovm_sequence
ovm_sequence_item
これらは、すべてclass名として存在するもので、ユーザが継承して使います。
黄色で塗られた階層は、例えばUSBモデルであったりSATAモデルであったり、そういう1つ1つの
モデルがovm_env単位で定義されて、上位のovm_envにぶら下がるイメージです。
個々の階層を説明していくと
- ovm_testは、各モデル (下位のovm_envとそれ以下の固まり) をどのように動かすかを決める階層です。
- ovm_env (TB environment) は、テストベンチを定義する階層です。
- ovm_env (BFM environment) は、モデルの設定をしたりする階層です。
- ovm_agentは、1種類の機能を統括する階層です。例えばPCIならmaster agent, slave agentという
- 具合に1まとまりの機能毎に定義します。
- ovm_driverは、インターフェースと接続して信号をドライブする階層です。このclassに動作を定義します。
- ovm_sequencerは、ovm_sequenceからパラメータを受け取ってovm_driverに渡す役割をする階層です。
- ovm_monitorは、信号を参照してバスの動きをログとして表示する階層です。
- ovm_sequenceは、いわゆるテストベクタに相当しますが、実際にはより高度な実装が可能です。
- ovm_sequence_itemは、ovm_sequenceからovm_sequencerを介してovm_driver
- と情報のやり取りをするのに使います。
8と9は機能階層ではありません。