Article #1118

既に発行済みのブログであっても適宜修正・追加することがあります。
We may make changes and additions to blogs already published.
posted by sakurai on September 13, 2026 #1118

7. 読み出しで rready を下げたまま待つ

図1118.1
図1118.1

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

8. 読み出しと書き込みを同じサイクルに出す

図1118.2
図1118.2

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

9. 順序の罠、同じアドレスへの書き込みと読み出しを同時に出す

図1118.3
図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

Your email address will not be published.

You may use Markdown syntax. If you include an ad such as http://, it will be invalidated by our AI system.

Please enter the numbers as they are shown in the image above.