|
13 |
BSVによるAXIモジュールの設計 (4) |
7. 読み出しで rready を下げたまま待つ

図1118.1
場面 6 の読み出し版です。740 で rready を下げ、750 で AR を出します。770 で rvalid と rdata=44444444 が立ち、rready が上がる 810 まで4サイクル保持されます。810 で成立し、820 でマスタが rdReg に記録します。
8. 読み出しと書き込みを同じサイクルに出す

図1118.2
860 で AW、W、AR を同時に出します。三つとも 860 で成立し、スレーブは書き込み FSM と読み出し FSM で並行に処理して、880 で bvalid と rvalid が同時に立ちます。書き込み経路と読み出し経路が独立に動くこと、それが AW と AR を分けている理由であることが見えます。
9. 順序の罠、同じアドレスへの書き込みと読み出しを同時に出す

図1118.3
930 で 0x08 への書き込みと 0x08 の読み出しを同じサイクルに出します。950 で返った rdata は AAAA0008 で、場面 5 で書いた古い値です。同じ 950 で B も返っていて、regs_2 が 99999999 に変わるのも 950 です。読み出し FSM が regs を読んだのは 940 のサイクルで、書き込み FSM が regs を書いたのも 940 のサイクルなので、読めるのは書く前の値です。AXI は読み出しと書き込みの間の順序を保証しません。以下のコードのようにマスタが B を待たずに AR を出せば、こうなります。
Stmt s9 = seq
mark (9, "RAW hazard: write and read same address together");
par
seq
par
putAW (8'h08);
putW (32'h99999999, 4'hF);
endpar
getB;
endseq
seq
putAR (8'h08);
getR; // 古い値 (場面5で書いた AAAA0008) が読める
endseq
endpar
endseq;
seqの中では順序が保たれるので、書き込みアドレスとデータを同時に出し、次にBを待ちますが、それと読み出しは並行して行われます。
Leave a Comment