タスク内で制御
テストベンチでのタスク記述についてです。
例えば、
NIOSとUser LogicをAvalon-MMでつなげ、レジスタアクセスする場合、
シミュレーションのテストベンチでは、ターゲット回路をUser Logicとし、NIOS部分をテストシナリオで処理を記述し、TaskでAvalon-MMの生成を行ったりします。
ただ、Avalon-MMでは、WaitRequestがHighの時は待たせたり、ReadValidがHighの時にリードデータが確定するなど、Task内でも制御が必要になります。
こういう時、私は、Task内でwhile文を使って待たせています。
Avalon-MMライトタスク
タスクWrCPUがテストシナリオで実行すると、CLOCK↑で制御信号(AVA_WE,AVA_AD,AVA_WD)がアサートし、AVA_WT(WaitRequest)がLowになると終了します。
ライトタスクの記述例を以下に示します。
16行目でAVA_WTがLowの時、Flagが1になり、
Loopで14行目に行った時にFlagが1のため、while文を抜けます。
これをタイミング図を示したものを下に示します。
Avalon-MMリードタスク
タスクRdCPUがテストシナリオで実行すると、CLOCK↑で制御信号(AVA_RE,AVA_AD)がアサートし、AVA_WT(WaitRequest)がLowになるとAVA_RE,AVA_ADをネゲートします。
また、リードバリッド(AVA_VL)がHighになるとリードデータを取得し、終了します。
リードタスクの記述例を以下に示します。
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」としている所です。
これをタイミング図を示したものを下に示します。
テストシナリオの記述例
上記タスクを使って、テストシナリオを記述する場合を以下に示します。
これは、一例ですので、エンジニアそれぞれの記述があるかと思います。
最後に
タスクは同じ事を繰り返す時によく使います。
verilogの参考書では、このような説明は無いかと思います。
テストベンチに限り、こういう記述ができますので、実際の回路にする部分では論理合成が通らないので、注意してください。