メモリ・コンシステンシ・モデルとAXI
RVWMO(RISC-Vメモリ・コンシステンシ・モデル)ではメモリアクセスに入れ替えが起きる場合を許していますが、具体的にどういう機構で入れ替えが起きるのか、今知ってることを整理しておきます。
AXIの順序制約
AXIバスを持つCPUが仮にプログラム順にトランザクションの発行を行ったとしても、AXIバスの構成によってはそれがメモリに到着する順序には保証がありません。
AXIは以下のことを守ってくれます。
・バスインターコネクトはAxIDが同じで、同じメモリへのアドレスの被るアクセスを受けたら、出し側ではWrite間、Read間のメモリへの発行順序を守る
・バスインターコネクトはAxIDが同じで、同じデバイスへのアクセスを受けたら、出し側ではWrite間、Read間のメモリへの発行順序を守る
・受け手(メモリやバスインターコネクトの受け側)はAxIDが同じアクセスならば、Write間、Read間の完了順序を守る
逆に以下のような入れかえはあり得ます。
・Read-Write間のメモリへの到着順序、CPUへの完了順序は守られません。Read-Write間はいくらでも追い越しえます。
・メモリへのアドレスの宛先が異なっていたらRead間やWrite間でもメモリ到着順序は入れ替わります。
・AxIDが異なっていたらRead間やWrite間でもメモリ到着順序は入れ替わりますし、CPUへの完了順序は守られません。
・バスインターコネクトは異なる出し手が出したトランザクションはAxIDが同じでもメモリ到着順序を守りませんし、それぞれの出し手への完了順序も守りません。(AxIDは仮想的に1Chで複数マスターのトランザクションが流すためのものなので上のことと実質同じことを言っています。)
・異なるメモリやデバイスへの到着順序は守りません。
CPUが発行するメモリアクセスは、ふつうはAxIDを変えないで発行されるので(ロード命令とキャッシュリフィルが別ということはよくある)、同じメモリへの完了の順序は守ってくれます。でもメモリへの到着順はアドレスも同じでないと守られないので、メモリアクセス順で見れば入れ替わっており、まさにRVWMOになります。
CPUのストアバッファ
CPUにはストアバッファがあります。ストア命令はメモリへのライト・トランザクションの完了を待って完了となるわけではなく、ストアバッファに入れたらそこで完了となります。ストアバッファからいつ出てくかは、デバイスメモリであれば即時に書かれますがメモリ宛ならば待たされて他のストアとマージされる場合もあります。その間にロード命令がストア命令を追い越してメモリアクセスが入れ替わって発行されることもあるわけです。
CPUのOut of Order実行
Out of Order実行を行うCPUでは、命令実行順序自体が入れ替わるので、リードメモリアクセスが入れ替わって発行されます。ただしストア命令についてはプログラムオーダで発行されます。そうでないと分岐予測ミスや例外発生時に困るからです。仮にストア命令を投機的に発行したら、発行後にやっぱりその命令は分岐予測ミスだったから行ってはならなかったと判明しても、メモリの状態を元に戻すことがかなり困難です。だから確実にストア命令を実行していいと分かるまでストア命令はバスには発行されません。