nao-milkの経験ブログ

25年間の半導体エンジニア経験で知り得た内容を記載したブログです。

上位階層でタスク実行

f:id:nao-milk:20210320012140p:plain

対向モデル内のタスク実行についてです。

 

例えば、UARTが2ポート以上あるターゲット回路に便利です。

下図のような場合です。

f:id:nao-milk:20210320003559p:plain

 

対向モデルの構想

TestScenarioで対向モデル(MODEL_UART)を制御し、送受信を考えます

対向モデルにデータを渡すと対向モデルからUserLogicにシリアル送信し、対向モデルがシリアル受信を完了すると読めるようにします。

 

これを実現する為、タスクを利用します。

しかも、TestBenchに記述するとUARTポートが増えた時に面倒なので、対向モデル内に記述することで、ポートが増えれば、その分配置すればよくなります。

尚、「.」で下階層の信号にアクセスできるので、それを利用します。

 

対向モデルの記述例

前回のテストベンチ同様、ボーレートを自由に変更できるように、parameterを使用せず、real宣言を使用します。

 

下が、MODEL_UARTの記述例となります。

f:id:nao-milk:20210320005028p:plain

 

ここでは、タスクTXを実行するとtcTXとtsTXの時間に従って、シリアル送信します。

また、受信も同様に、RXがHigh→LowになるとtcRXに従って受信データを取り込み、tsRX後にタスクRXで受信データを読み取れるようになっています。

 

受信側では、信号RXはtcRX時間は状態を保持していることが前提(ひげ、ハザードは無い)の為、tcRX未満の変化があるとRxErrorが1になるようになっています。

 

テストシナリオ記述例

テストシナリオでは、対向モデルのインスタンスUART1又はUART2を指定してタスクを実行するだけとなります。

また、ボーレートを変更したい場合も、同様にして変更することができます。

 

下にテストシナリオの記述例を示します。

f:id:nao-milk:20210320010015p:plain

ボーレートを変更し、送信と受信をテストシナリオから制御しています。

 

タスクTXは、実行するとシリアル送信を開始し、送信を完了するとタスクが終了します。

また、RXは、8bit分のシリアル受信が終了するとタスクが終了します。

タスクRXが終了すると次の受信の為にタスクRXを実行しておく必要があります。

 

タイミング波形

 

f:id:nao-milk:20210320010436p:plain

送信波形

f:id:nao-milk:20210320010527p:plain

受信波形

 

最後に

対向モデル内でタスク記述し、上位階層で実行することが可能です。

オブジェクト指向に近い考え方です。

また、

案件の機能や検証内容に合わせて、どのような対抗モデルにするか検討する必要があります。

 

今回の例では、タスクTXを実行すると送信完了までタスクが終了しない、受信が完了する前にタスクRXを実行しないといけない構成になっています。

 

やり方次第(記述次第)で、

タスクTXを実行すると内部バッファにデータを格納し、内部バッファが空になるまでシリアル送信を継続する構成や、8bit分のシリアル受信する度に内部バッファに格納し、タスクRXを実行する度に内部バッファのデータを読み出せる構成にすることで、タスクがWaitすることは無くなります。