| /* |
| description: |
| 1. Dispatch unit receives uop instructions from uop queue |
| 2. Dispatch unit check rules to determine if the uops are sent to reservation stations(RS). |
| There are two ways to solve: |
| a. stall pipeline |
| b. foreward data from ROB |
| 3. Dispatch unit read vector data from VRF for uops. |
| |
| feature list: |
| 1. Dispatch module can issue 2 uops at most. |
| a. Uop sequence must be in-order. |
| b. Issuing uop(s) use valid-ready handshake mechanism. |
| 2. Dispatch rules |
| a. RAW data hazard: |
| I. uop0 Vs rob_entry(s). if rob_entry.vd_valid is 'b0, then stall pipeline (do not issue uop0) |
| II.uop1 Vs rob_entry(s). if rob_entry.vd_valid is 'b0, then do not issue uop1 |
| II.uop1 Vs uop0. if uop0.vd_valid is the src of uop1, then do not issue uop0 |
| b. Structure hazard: |
| I. the src-operand number of uops is more than 4, then only issue uop0 |
| */ |
| |
| `include "rvv.svh" |
| |
| module rvv_dispatch |
| ( |
| clk, |
| rstn, |
| uops_valid_de2dp, |
| uops_de2dp, |
| uops_ready_dp2de, |
| rs_valid_dp2alu, |
| rs_dp2alu, |
| rs_ready_alu2dp, |
| rs_valid_dp2pmt, |
| rs_dp2pmt, |
| rs_ready_pmt2dp, |
| rs_valid_dp2mul, |
| rs_dp2mul, |
| rs_ready_mul2dp, |
| rs_valid_dp2div, |
| rs_dp2div, |
| rs_ready_div2dp, |
| rs_valid_dp2lsu, |
| rs_dp2lsu, |
| rs_ready_lsu2dp, |
| rc_valid_dp2rob, |
| rc_dp2rob, |
| rc_ready_rob2dp, |
| vs_index_dp2vrf, |
| vs_data_vrf2dp, |
| v0_mask_vrf2dp, |
| rob_entry |
| ); |
| // global signal |
| input logic clk; |
| input logic rstn; |
| |
| // Uops Queue to Dispatch unit |
| input logic uops_valid_de2dp[`NUM_DP_UOP-1:0]; |
| input UOP_QUEUE_t uops_de2dp[`NUM_DP_UOP-1:0]; |
| output logic uops_ready_dp2de[`NUM_DP_UOP-1:0]; |
| |
| // Dispatch unit sends oprations to reservation stations |
| // Dispatch unit to ALU reservation station |
| // rs_*: reservation station |
| output logic rs_valid_dp2alu[`NUM_DP_RS-1:0]; |
| output ALU_RS_t rs_dp2alu[`NUM_DP_RS-1:0]; |
| input logic rs_ready_alu2dp[`NUM_DP_RS-1:0]; |
| |
| // Dispatch unit to PMT+RDT reservation station |
| output logic rs_valid_dp2pmt[`NUM_DP_RS-1:0]; |
| output PMT_RDT_RS_t rs_dp2pmt[`NUM_DP_RS-1:0]; |
| input logic rs_ready_pmt2dp[`NUM_DP_RS-1:0]; |
| |
| // Dispatch unit to MUL reservation station |
| output logic rs_valid_dp2mul[`NUM_DP_RS-1:0]; |
| output MUL_RS_t rs_dp2mul[`NUM_DP_RS-1:0]; |
| input logic rs_ready_mul2dp[`NUM_DP_RS-1:0]; |
| |
| // Dispatch unit to DIV reservation station |
| output logic rs_valid_dp2div[`NUM_DP_RS-1:0]; |
| output DIV_RS_t rs_dp2div[`NUM_DP_RS-1:0]; |
| input logic rs_ready_div2dp[`NUM_DP_RS-1:0]; |
| |
| // Dispatch unit to LSU reservation station |
| output logic rs_valid_dp2lsu[`NUM_DP_RS-1:0]; |
| output LSU_RS_t rs_dp2lsu[`NUM_DP_RS-1:0]; |
| input logic rs_ready_lsu2dp[`NUM_DP_RS-1:0]; |
| |
| // Dispatch unit pushes operations to ROB unit |
| // rc_*: register completation |
| output logic rc_valid_dp2rob[`NUM_DP_RC-1:0]; |
| output RC_t rc_dp2rob[`NUM_DP_RC-1:0]; |
| input logic rc_ready_rob2dp[`NUM_DP_RC-1:0]; |
| |
| // Dispatch unit sends read request to VRF for vector data. |
| // Dispatch unit to VRF unit |
| // Vs_data would be return from VRF at the current cycle. |
| output [`REGFILE_INDEX_WIDTH-1:0] vs_index_dp2vrf[`NUM_DP_VRF-1:0]; |
| input [`VLEN-1:0] vs_data_vrf2dp[`NUM_DP_VRF-1:0]; |
| input [`VLEN-1:0] v0_mask_vrf2dp; |
| |
| // Dispatch unit accept all ROB entry to determine if vs_data of RS is from ROB or not |
| // ROB unit to Dispatch unit |
| input ROB_t rob_entry[`ROB_DEPTH-1:0]; |
| |
| endmodule |