上位階層でタスク実行
対向モデル内のタスク実行についてです。
例えば、UARTが2ポート以上あるターゲット回路に便利です。
下図のような場合です。
対向モデルの構想
TestScenarioで対向モデル(MODEL_UART)を制御し、送受信を考えます
対向モデルにデータを渡すと対向モデルからUserLogicにシリアル送信し、対向モデルがシリアル受信を完了すると読めるようにします。
これを実現する為、タスクを利用します。
しかも、TestBenchに記述するとUARTポートが増えた時に面倒なので、対向モデル内に記述することで、ポートが増えれば、その分配置すればよくなります。
尚、「.」で下階層の信号にアクセスできるので、それを利用します。
対向モデルの記述例
前回のテストベンチ同様、ボーレートを自由に変更できるように、parameterを使用せず、real宣言を使用します。
下が、MODEL_UARTの記述例となります。
ここでは、タスクTXを実行するとtcTXとtsTXの時間に従って、シリアル送信します。
また、受信も同様に、RXがHigh→LowになるとtcRXに従って受信データを取り込み、tsRX後にタスクRXで受信データを読み取れるようになっています。
受信側では、信号RXはtcRX時間は状態を保持していることが前提(ひげ、ハザードは無い)の為、tcRX未満の変化があるとRxErrorが1になるようになっています。
テストシナリオ記述例
テストシナリオでは、対向モデルのインスタンスUART1又はUART2を指定してタスクを実行するだけとなります。
また、ボーレートを変更したい場合も、同様にして変更することができます。
下にテストシナリオの記述例を示します。
ボーレートを変更し、送信と受信をテストシナリオから制御しています。
タスクTXは、実行するとシリアル送信を開始し、送信を完了するとタスクが終了します。
また、RXは、8bit分のシリアル受信が終了するとタスクが終了します。
タスクRXが終了すると次の受信の為にタスクRXを実行しておく必要があります。
タイミング波形
最後に
対向モデル内でタスク記述し、上位階層で実行することが可能です。
オブジェクト指向に近い考え方です。
また、
案件の機能や検証内容に合わせて、どのような対抗モデルにするか検討する必要があります。
今回の例では、タスクTXを実行すると送信完了までタスクが終了しない、受信が完了する前にタスクRXを実行しないといけない構成になっています。
やり方次第(記述次第)で、
タスクTXを実行すると内部バッファにデータを格納し、内部バッファが空になるまでシリアル送信を継続する構成や、8bit分のシリアル受信する度に内部バッファに格納し、タスクRXを実行する度に内部バッファのデータを読み出せる構成にすることで、タスクがWaitすることは無くなります。