FPGA開発日記

カテゴリ別記事インデックス https://msyksphinz.github.io/github_pages , English Version https://fpgadevdiary.hatenadiary.com/

自作RISC-Vアウトオブオーダコアの命令発行方法再考

自作RISC-Vアウトオブオーダコアの、命令発行ポリシについて少し考えなおした。 これまでは命令グループ内において、若い命令から順番に同じ演算ユニットに渡していた(その方が論理が簡単)が、やっぱり特定の演算器に命令が偏りそうだということで、少し考え直して、複数の演算ユニットが搭載されている場合にはなるべく公平に割り当てるようにいろいろ考えなおした。


命令の分配

MSRHでは各命令は命令の種類に応じて異なるバックエンド実行ユニットに渡されます。 1サイクルで命令発行可能な命令数が決まっており、msrh_conf_pkg::DISP_SIZE によって定義されています。

さらでコア内でバックエンドの実行ユニットが何個インスタンス化されているかに応じてそれぞれの実行ユニットに対して発行命令数が決められます。 算術演算命令は msrh_conf_pkg::ALU_DISP_SIZE によってALU命令の発行可能な命令数が定義されています。 また、同様に msrh_conf_pkg:ALU_INST_NUM によりコア内に何個のALU実行ユニットがインスタンス化されるかも決められています。 従って、 ALU_DISP_SIZE / ALU_INST_NUM は整数でなければなりません。

ALU実行ユニットはそれぞれ ALU_DISP_SIZE / ALU_INST_NUM の命令数だけフロントエンドから命令を受け取ることができます。

メモリアクセス命令は、ロード命令とストア命令で1サイクル当たり発行可能な命令数が決めれており、 それぞれ msrh_conf_pkg::MEM_DISP_SIZE で定義した命令数分の命令を受け取ることができます。 また、LSUは内部に msrh_conf_pkg::LSU_INST_NUM で定義される数だけLSUアクセス実行ユニットをインスタンス化することができます。

FPU命令もALU命令と同様に、 FPU_DISP_SIZE によって定義された命令数だけ命令を同時に発行することができ、 また FPU_INST_NUM に定義された数だけFPU実行ユニットがインスタンス化されています。 従って、FPU_DISP_SIZE / FPU_INST_NUM は整数でなければならず、 FPU実行ユニットはそれぞれ FPU_DISP_SIZE / FPU_INST_NUM の命令数だけフロントエンドから命令を受け取ることができます。

ALU/FPU命令の分配方法

ALU実行ユニットとFPU実行ユニットにコア内に複数個インスタンスし同時に実行することができます。 命令がどの実行ユニットに発行されるかは、命令発行時に決定されます。 ALUが n 個インスタンスされる場合、それぞれの実行ユニットをALU0, ALU1, ... ALUn-1とすると、 算術演算命令は、命令グループ内の若い順番にALU0, ALU1 の順番に発行されます。これにより、命令発行が特定のALUに偏ることを防ぎます。

FPUも同様の方式により発行されます。

図xxxに、ALUの最大同時発行命令数 ALU_DISP_SIZE=8, ALU実行ユニット数 ALU_INST_NUM=4 の場合にALU命令の配分を示します。

ALUの最大同時発行命令数 ALU_DISP_SIZE=8, ALU実行ユニット数 ALU_INST_NUM=4 の場合にALU命令の発行実行ユニット

Inst0 Inst1 Inst2 Inst3 Inst4 Inst5 Inst6 Inst7
命令 ADDI SUB ADD LD ADD MUL ST ADD
命令タイプ ALU ALU ALU LOAD ALU ALU STORE ALU
ALU発行実行ユニット ALU0 ALU1 ALU2 ALU3 ALU0 ALU1

LSU命令の分配方法

LSU命令は、命令発行時にロード命令・ストア命令の種類によってLDQ, STQに発行されるかが決定されますが、 どのLSU実行ユニットを使用して実行されるかについても命令発行時に決定されます。 LSU実行ユニットが n 個インスタンスされる場合、それぞれの実行ユニットをLSU0, LSU1, ... LSUn-1とすると、 命令発行時に、命令グループ内の若い順番にLSU0, LSU1 の順番に発行されます。これにより、命令発行が特定のLSU実行ユニットに偏ることを防ぎます。

表xxxに、LSUの最大同時発行命令数 MEM_DISP_SIZE=8, LSU実行ユニット LSU_INST_NUM=3 の場合のロードストア命令の割り当てを示します。

Inst0 Inst1 Inst2 Inst3 Inst4 Inst5 Inst6 Inst7
命令 LD ST LD LD ST ST LD LD
命令タイプ LOAD STORE LOAD LOAD STORE STORE LOAD LOAD
LSU発行実行ユニット LSU0 LSU1 LSU2 LSU0 LSU1 LSU2 LSU3 LSU0

LSUの最大同時発行命令数 MEM_DISP_SIZE=8, LSU実行ユニット数 LSU_INST_NUM=4 の場合にLSU命令の発行される実行ユニット