ベクトル命令における、LMUL>1の対応というのは結構難易度の高い問題だ。
今回はその解決方法として、LMULの値がVSETVL命令で変更されると、例外を出して物理レジスタの構成を整列し直す方式を考えたい。
ここでは、Spikeの実装のみを示すが、同様にハードウェア側も実装を変更する。
前回に続いて、もうちょっと調整が必要だ。まず、基本的にRISC-Vの例外は例外復帰後に例外を発生させた命令をもう一度実行する想定だが、このVSETVLI命令の例外は、もう一度は実行せずに次の命令に進める。 したがって、MEPCを自分の命令の1つ前に進めておく必要がある。
if (t.cause() == CAUSE_LMUL_CHANGE) { fprintf(log_file, "detect lmul change\n"); state.pc = 0x2000; state.mepc = epc + 4; return; }
これで、一応例外ルーティングが動くようになった。つぎは、LMUL>1でちゃんと複数レジスタかけるようにするのと、レジスタリネームをLMUL>1でLMULの倍数分しか取れないように改造することだ。 あとは、Replay Queueの構成も改造しないといけない。
MR1(0x00000000800020fe)=>0000000000000000 MR1(0x00000000800020ff)=>0000000000000000 ========================================== Wrong VPR[00](16): ISS[00] = 28038082_e19c0785_619c00a7_8023619c_80824501_f6759696_02068027_40560633_95960205_80070c36_72d786aa_10000613_05b62585_000405b7_05322505_00080537_ RTL[00] = 00000000_00000000_00000000_00000000_00000000_00000000_00000000_00000000_00000000_00000000_00000000_00000000_05b62585_000405b7_05322505_00080537_ ~~~~~~~~ ~~~~~~~~ ~~~~ ~~ ~~~~~~~~ ~~~~~~~~ ~~~~~~~~ ~~~~~~~~ ~~~~~~~~ ~~~~~~~~ ~~~~~~~~ ~~~~~~~~ ~~ ~~~~ =============================== SIMULATION FINISH : FAIL (CODE=100) RUNNING TIME : 5185 ===============================