|
14 |
BSVによるAXIモジュールの設計 (5) |
10. 順序の正しい手順、B を受け取ってから読む

図1119.1
場面 9 と同じ 0x08 に、今度は順序を守って書いて読みます。1000 で AW と W を出し、1000 で成立します。1020 で B が返り、getB がその握手で受け取ります。regs_2 が 77777777 になるのも 1020 です。getB の次の文が putAR なので、1030 のサイクルに文が実行されて 1040 から arvalid が立ち、1060 の R で 77777777 が返って 1070 で rdReg に入ります。
書いた値を読みたければ B を受け取ってから AR を出す、という責任はマスタにあり、以下のコードのようにgetB の後に putAR を置くことがその手順の記述です。場面 9 との違いは AR を出す位置だけで、スレーブは何も変わっていません。
Stmt s10 = seq
mark (10, "RAW ordered: write, wait B, then read");
par
putAW (8'h08);
putW (32'h77777777, 4'hF);
endpar
getB; // ここで書き込みの完了が確定する
putAR (8'h08); // B を受け取った次の文で AR
getR; // 77777777
endseq;
putAW
putW → getB → putAR → getR
11. エラー応答

図1119.2
範囲外の 0x10 に書きます。握手は通常どおり 1110 で成立し、1130 の B で bresp が 2、SLVERR になります。regs はどれも変わりません。1170 で 0x10 を読むと、1190 の R で rresp が 2、rdata は 0 です。エラーは握手の失敗として現れるのではなく、握手は成立させたうえで応答コードで伝える、というのが AXI の流儀です。
場面と見どころの対応
| 場面 | 出すもの | 見るもの |
|---|---|---|
| 1 | AW と W を同時 | 三つの握手が独立に成立、B は処理の後 |
| 2 | AR | rdata は rvalid と同時にだけ有効 |
| 3 | W の後に AW | スレーブは揃うまで動かない |
| 4 | AW の後に W | 同上、順序に決まりはない |
| 5 | AW を3件連続 | awready が落ちる、マスタは保持、B は順に返る |
| 6 | bready を下げて書く | bvalid と bresp が保持される |
| 7 | rready を下げて読む | rvalid と rdata が保持される |
| 8 | AW、W、AR を同時 | 読み書きが並行に進む |
| 9 | 同じ番地へ書きながら読む | 古い値が返る、順序は保証されない |
| 10 | 書いて B を受け取ってから読む | 新しい値が返る、順序はマスタの責任 |
| 11 | 範囲外の番地 | 握手は成立、応答コードで SLVERR |