自作CPUにおいて、ある程度ベクトル移動命令が動作するようになってきた。
ある程度基本的な算術演算命令が動くようになってきたので、今度はVLEN != DLENの動作について考えてみる。 VLEN != DLENの場合は、VLEN/DLENの回数だけ命令が流れていき、順番に処理が進んでいくことになる。
このためには、命令発行ステージにてVLEN/DLEN回数だけ発行するための機構が必要になる。 さらに、命令スケジューリングの命令を選択する部分について、ベクトル命令が発行されている間はスケジューラがほかの命令を選ばないように留意する必要がある。
scariv_pkg::WAIT : begin if (w_entry_flush) begin w_state_next = scariv_pkg::SCHED_CLEAR; w_dead_next = 1'b1; end else begin if (o_entry_valid & w_pc_update_before_entry & w_oldest_ready) begin w_state_next = scariv_pkg::DONE; end else if (o_entry_ready & i_entry_picked & !w_rs_pred_mispredicted_or) begin w_issued_next = 1'b1; w_state_next = scariv_pkg::ISSUED; w_entry_next.vec_step_index = r_entry.vec_step_index + 'h1; end end end scariv_pkg::ISSUED : begin if (w_entry_flush) begin w_state_next = scariv_pkg::SCHED_CLEAR; w_dead_next = 1'b1; end else begin if (w_rs_pred_mispredicted_or) begin w_state_next = scariv_pkg::WAIT; w_issued_next = 1'b0; w_entry_next.rd_regs[0].predict_ready = 1'b0; w_entry_next.rd_regs[1].predict_ready = 1'b0; w_entry_next.rd_regs[2].predict_ready = 1'b0; end else begin if (r_entry.vec_step_index == scariv_vec_pkg::VEC_STEP_W-1) begin w_state_next = scariv_pkg::SCHED_CLEAR; end else begin w_entry_next.vec_step_index = r_entry.vec_step_index + 'h1; end end end end // case: scariv_pkg::ISSUED
波形を確認すると、4サイクルのビートを刻みながら命令が発行されていることがわかる。テストも結構PASSするようになってきた。