nao-milkの経験ブログ

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

タスク内で制御

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

テストベンチでのタスク記述についてです。

 

例えば、

NIOSとUser LogicをAvalon-MMでつなげ、レジスタアクセスする場合、

シミュレーションのテストベンチでは、ターゲット回路をUser Logicとし、NIOS部分をテストシナリオで処理を記述し、TaskでAvalon-MMの生成を行ったりします。

 

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

 

ただ、Avalon-MMでは、WaitRequestがHighの時は待たせたり、ReadValidがHighの時にリードデータが確定するなど、Task内でも制御が必要になります。

 

こういう時、私は、Task内でwhile文を使って待たせています。

 

Avalon-MMライトタスク

タスクWrCPUがテストシナリオで実行すると、CLOCK↑で制御信号(AVA_WE,AVA_AD,AVA_WD)がアサートし、AVA_WT(WaitRequest)がLowになると終了します。

 

ライトタスクの記述例を以下に示します。

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

16行目でAVA_WTがLowの時、Flagが1になり、

Loopで14行目に行った時にFlagが1のため、while文を抜けます。

 

これをタイミング図を示したものを下に示します。

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

 

Avalon-MMリードタスク

タスクRdCPUがテストシナリオで実行すると、CLOCK↑で制御信号(AVA_RE,AVA_AD)がアサートし、AVA_WT(WaitRequest)がLowになるとAVA_RE,AVA_ADをネゲートします。

また、リードバリッド(AVA_VL)がHighになるとリードデータを取得し、終了します。

 

リードタスクの記述例を以下に示します。

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

15行目でAVA_WTがLowの時、AVA_REとAVA_ADは0になり、

19行目でAVA_VLがHighの時、リードデータをDataに格納し、Flagを1にします。

Loopで13行目に行った時にFlagが1のため、while文を抜けます。

ポイントは、19行目で「else if」では無く、「if」としている所です。

 

これをタイミング図を示したものを下に示します。

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

 

テストシナリオの記述例

上記タスクを使って、テストシナリオを記述する場合を以下に示します。

これは、一例ですので、エンジニアそれぞれの記述があるかと思います。

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

 

最後に

タスクは同じ事を繰り返す時によく使います。

verilogの参考書では、このような説明は無いかと思います。

テストベンチに限り、こういう記述ができますので、実際の回路にする部分では論理合成が通らないので、注意してください。