実装の考え直しをして、Uop Generatorを移動して、アドレス生成の調整を行う。 1uop分しかReplay Queueには格納されないので、再度パイプラインに流すときのアドレスの調整を行う必要がある。
通常は、最初のアドレスがrs1+0
でそれをベースにaddress generatorの中でDLENBを加算しているのだが、途中の要素からリプレイが入るとrs+DLEN*N
からのアドレス再計算が必要になる。
この部分は、リプレイキューに途中まで計算した仮想アドレスを覚えておいて、そこから再計算が必要になるのはやむを得ないところだ。
VLE32.v v10, a10
0. v10[0] <= XPR[a10] + 0 (=vaddr_temp) 1. v10[1] <= XPR[a10] + DLENB (=vaddr_temp + DLENB) 2. v10[2] <= XPR[a10] + DLENB*2 (=vaddr_temp + DLENB) 3. v10[3] <= XPR[a10] + DLENB*3 (=vaddr_temp + DLENB)
ここで、1. からリプレイが入るとすると、XPR[a10] + DLENB
から再スタートしないといけないので、リプレイキューに入る命令は、このアドレスを覚えておかなければならない。
1. v10[1] <= XPR[a10] + DLENB (=vaddr_temp + DLENB) 2. v10[2] <= XPR[a10] + DLENB*2 (=vaddr_temp + DLENB) 3. v10[3] <= XPR[a10] + DLENB*3 (=vaddr_temp + DLENB)