blob: 4b9331405b9d9d082ea7f3b1d46668aa555538e0 [file] [log] [blame]
/*
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