// 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 | |
`ifndef HDL_VERILOG_RVV_DESIGN_RVV_SVH | |
`include "rvv_backend.svh" | |
`endif | |
`ifndef RVV_DISPATCH__SVH | |
`include "rvv_backend_dispatch.svh" | |
`endif | |
module rvv_backend_dispatch | |
( | |
clk, | |
rst_n, | |
uop_valid_uop2dp, | |
uop_uop2dp, | |
uop_ready_dp2uop, | |
rs_valid_dp2alu, | |
rs_dp2alu, | |
rs_ready_alu2dp, | |
rs_valid_dp2pmtrdt, | |
rs_dp2pmtrdt, | |
rs_ready_pmtrdt2dp, | |
rs_valid_dp2mul, | |
rs_dp2mul, | |
rs_ready_mul2dp, | |
rs_valid_dp2div, | |
rs_dp2div, | |
rs_ready_div2dp, | |
rs_valid_dp2lsu, | |
rs_dp2lsu, | |
rs_ready_lsu2dp, | |
mapinfo_valid_dp2lsu, | |
mapinfo_dp2lsu, | |
mapinfo_ready_lsu2dp, | |
uop_valid_dp2rob, | |
uop_dp2rob, | |
uop_ready_rob2dp, | |
uop_index_rob2dp, | |
rd_index_dp2vrf, | |
rd_data_vrf2dp, | |
v0_mask_vrf2dp, | |
rob_entry | |
); | |
// ---port definition------------------------------------------------- | |
// global signal | |
input logic clk; | |
input logic rst_n; | |
// Uops Queue to Dispatch unit | |
input logic [`NUM_DP_UOP-1:0] uop_valid_uop2dp; | |
input UOP_QUEUE_t [`NUM_DP_UOP-1:0] uop_uop2dp; | |
output logic [`NUM_DP_UOP-1:0] uop_ready_dp2uop; | |
// Dispatch unit sends oprations to reservation stations | |
// Dispatch unit to ALU reservation station | |
// rs_*: reservation station | |
output logic [`NUM_DP_UOP-1:0] rs_valid_dp2alu; | |
output ALU_RS_t [`NUM_DP_UOP-1:0] rs_dp2alu; | |
input logic [`NUM_DP_UOP-1:0] rs_ready_alu2dp; | |
// Dispatch unit to PMT+RDT reservation station | |
output logic [`NUM_DP_UOP-1:0] rs_valid_dp2pmtrdt; | |
output PMT_RDT_RS_t [`NUM_DP_UOP-1:0] rs_dp2pmtrdt; | |
input logic [`NUM_DP_UOP-1:0] rs_ready_pmtrdt2dp; | |
// Dispatch unit to MUL reservation station | |
output logic [`NUM_DP_UOP-1:0] rs_valid_dp2mul; | |
output MUL_RS_t [`NUM_DP_UOP-1:0] rs_dp2mul; | |
input logic [`NUM_DP_UOP-1:0] rs_ready_mul2dp; | |
// Dispatch unit to DIV reservation station | |
output logic [`NUM_DP_UOP-1:0] rs_valid_dp2div; | |
output DIV_RS_t [`NUM_DP_UOP-1:0] rs_dp2div; | |
input logic [`NUM_DP_UOP-1:0] rs_ready_div2dp; | |
// Dispatch unit to LSU | |
// to LSU RS | |
output logic [`NUM_DP_UOP-1:0] rs_valid_dp2lsu; | |
output UOP_RVV2LSU_t [`NUM_DP_UOP-1:0] rs_dp2lsu; | |
input logic [`NUM_DP_UOP-1:0] rs_ready_lsu2dp; | |
// to LSU MAP INFO | |
output logic [`NUM_DP_UOP-1:0] mapinfo_valid_dp2lsu; | |
output LSU_MAP_INFO_t [`NUM_DP_UOP-1:0] mapinfo_dp2lsu; | |
input logic [`NUM_DP_UOP-1:0] mapinfo_ready_lsu2dp; | |
// Dispatch unit pushes operations to ROB unit | |
output logic [`NUM_DP_UOP-1:0] uop_valid_dp2rob; | |
output DP2ROB_t [`NUM_DP_UOP-1:0] uop_dp2rob; | |
input logic [`NUM_DP_UOP-1:0] uop_ready_rob2dp; | |
input logic [`ROB_DEPTH_WIDTH-1:0] uop_index_rob2dp; | |
// Dispatch unit sends read request to VRF for vector data. | |
// Dispatch unit to VRF unit | |
// rd_data would be return from VRF at the current cycle. | |
output logic [`NUM_DP_VRF-1:0][`REGFILE_INDEX_WIDTH-1:0] rd_index_dp2vrf; | |
input logic [`NUM_DP_VRF-1:0][`VLEN-1:0] rd_data_vrf2dp; | |
input logic [`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 ROB2DP_t [`ROB_DEPTH-1:0] rob_entry; | |
// ---internal signal definition-------------------------------------- | |
SUC_UOP_RAW_t [`NUM_DP_UOP-1:0] suc_uop; | |
PRE_UOP_RAW_t [`ROB_DEPTH-1:0] pre_uop_rob; | |
PRE_UOP_RAW_t [`NUM_DP_UOP-2:0] pre_uop_uop; | |
RAW_UOP_ROB_t [`NUM_DP_UOP-1:0] raw_uop_rob; | |
// uop0 is the first uop so no need raw check between uops for it | |
RAW_UOP_UOP_t [`NUM_DP_UOP-1:1] raw_uop_uop; | |
STRCT_UOP_t [`NUM_DP_UOP-1:0] strct_uop; | |
ARCH_HAZARD_t arch_hazard; | |
UOP_OPN_t [`NUM_DP_UOP-1:0] uop_operand; | |
UOP_OPN_t [`NUM_DP_UOP-1:0] vrf_byp; | |
ROB_BYP_t [`ROB_DEPTH-1:0] rob_byp; | |
UOP_CTRL_t [`NUM_DP_UOP-1:0] uop_ctrl; | |
UOP_INFO_t [`NUM_DP_UOP-1:0] uop_info; | |
UOP_OPN_BYTE_TYPE_t [`NUM_DP_UOP-1:0] uop_operand_byte_type; | |
logic [`NUM_DP_UOP-1:0][`VL_WIDTH-1:0] vlmax; | |
logic [`NUM_DP_UOP-1:0][$clog2(`VSTART_WIDTH)-1:0] vlmax_shift; | |
logic [`NUM_DP_UOP-1:0][`ROB_DEPTH_WIDTH-1:0] rob_address; | |
// ---code start------------------------------------------------------ | |
genvar i; | |
// vlmax = lmul * `VLENB / sew | |
generate | |
for (i=0; i<`NUM_DP_UOP; i++) begin : gen_vlmax | |
assign vlmax_shift[i] ={1'b0, uop_uop2dp[i].vector_csr.lmul[1:0]} + $clog2(`VLENB) - uop_uop2dp[i].vector_csr.sew - {uop_uop2dp[i].vector_csr.lmul[2],2'b00}; | |
assign vlmax[i] = 'h1 << vlmax_shift[i]; | |
end | |
endgenerate | |
generate | |
for (i=0; i<`NUM_DP_UOP; i++) begin : gen_suc_uop | |
assign suc_uop[i].vs1_index = uop_uop2dp[i].vs1; | |
assign suc_uop[i].vs1_valid = uop_uop2dp[i].vs1_index_valid; | |
assign suc_uop[i].vs2_index = uop_uop2dp[i].vs2_index; | |
assign suc_uop[i].vs2_valid = uop_uop2dp[i].vs2_valid; | |
assign suc_uop[i].vd_index = uop_uop2dp[i].vd_index; | |
assign suc_uop[i].vs3_valid = uop_uop2dp[i].vs3_valid; | |
assign suc_uop[i].vm = uop_uop2dp[i].vm; | |
end | |
endgenerate | |
// RAW data hazard check between uop[*] and ROB | |
generate | |
for (i=0; i<`ROB_DEPTH; i++) begin : gen_pre_uop_rob | |
assign pre_uop_rob[i].w_index = rob_entry[i].w_index; | |
assign pre_uop_rob[i].w_type = rob_entry[i].w_type; | |
assign pre_uop_rob[i].w_valid = rob_entry[i].w_valid; | |
assign pre_uop_rob[i].valid = rob_entry[i].valid; | |
end | |
for (i=0; i<`NUM_DP_UOP; i++) begin : gen_raw_uop_rob | |
rvv_backend_dispatch_raw_uop_rob #( | |
) u_raw_uop_rob ( | |
.raw_uop_rob (raw_uop_rob[i]), | |
.suc_uop (suc_uop[i]), | |
.pre_uop (pre_uop_rob) | |
); | |
end | |
endgenerate | |
// RAW data hazard check between uop(s) | |
generate | |
for (i=0; i<`NUM_DP_UOP-1; i++) begin : gen_pre_uop_uop | |
assign pre_uop_uop[i].w_index = uop_uop2dp[i].vd_index; | |
assign pre_uop_uop[i].w_valid = 1'b0; | |
assign pre_uop_uop[i].w_type = uop_uop2dp[i].rd_index_valid ? XRF : VRF; | |
assign pre_uop_uop[i].valid = uop_uop2dp[i].vd_valid & uop_valid_uop2dp[i]; | |
end | |
for (i=1; i<`NUM_DP_UOP; i++) begin : gen_raw_uop_uop | |
rvv_backend_dispatch_raw_uop_uop #( | |
.PREUOP_NUM (i) | |
) u_raw_uop_uop ( | |
.raw_uop_uop (raw_uop_uop[i]), | |
.suc_uop (suc_uop[i]), | |
.pre_uop (pre_uop_uop[i-1:0]) | |
); | |
end | |
endgenerate | |
// Structure hazard check and set read index for VRF | |
generate | |
for (i=0; i<`NUM_DP_UOP; i++) begin : gen_strct_uop | |
assign strct_uop[i].vs1_index = uop_uop2dp[i].vs1; | |
assign strct_uop[i].vs1_valid = uop_uop2dp[i].vs1_index_valid; | |
assign strct_uop[i].vs2_index = uop_uop2dp[i].vs2_index; | |
assign strct_uop[i].vs2_valid = uop_uop2dp[i].vs2_valid; | |
assign strct_uop[i].vd_index = uop_uop2dp[i].vd_index; | |
assign strct_uop[i].vs3_valid = uop_uop2dp[i].vs3_valid; | |
assign strct_uop[i].uop_exe_unit = uop_uop2dp[i].uop_exe_unit; | |
assign strct_uop[i].uop_class = uop_uop2dp[i].uop_class; | |
end | |
endgenerate | |
rvv_backend_dispatch_structure_hazard #( | |
) u_structure_hazard ( | |
.rd_index (rd_index_dp2vrf), | |
.arch_hazard (arch_hazard), | |
.strct_uop (strct_uop) | |
); | |
// Bypass data for source operand of uop(s) | |
generate | |
for (i=0; i<`ROB_DEPTH; i++) begin : gen_rob_byp | |
assign rob_byp[i].w_data = rob_entry[i].w_data; | |
assign rob_byp[i].byte_type = rob_entry[i].byte_type; | |
`ifdef AGNOSTIC_ONE | |
assign rob_byp[i].tail_one = rob_entry[i].vector_csr.vtype.vta; | |
assign rob_byp[i].inactive_one = rob_entry[i].vector_csr.vtype.vma; | |
`else | |
assign rob_byp[i].tail_one = 1'b0; | |
assign rob_byp[i].inactive_one = 1'b0; | |
`endif | |
end | |
rvv_backend_dispatch_operand | |
u_operand | |
( | |
.vrf_byp (vrf_byp ), | |
.uop_uop2dp (uop_uop2dp ), | |
.rd_data_vrf2dp (rd_data_vrf2dp), | |
.v0_mask_vrf2dp (v0_mask_vrf2dp) | |
); | |
for (i=0;i<`NUM_DP_UOP;i++) begin: gen_bypass_data | |
rvv_backend_dispatch_bypass | |
#( | |
) | |
u_bypass ( | |
.uop_operand (uop_operand[i]), | |
.rob_byp (rob_byp), | |
.vrf_byp (vrf_byp[i]), | |
.raw_uop_rob (raw_uop_rob[i]) | |
); | |
end | |
endgenerate | |
// Control handshae mechanism for uop_queue <-> dispath, dispatch <-> rs and dispatch <-> rob | |
generate | |
for (i=0; i<`NUM_DP_UOP; i++) begin : gen_uop_ctrl | |
assign uop_ctrl[i].uop_exe_unit = uop_uop2dp[i].uop_exe_unit; | |
assign uop_ctrl[i].last_uop_valid = uop_uop2dp[i].last_uop_valid; | |
end | |
endgenerate | |
rvv_backend_dispatch_ctrl #( | |
) u_ctrl ( | |
// ctrl input signal | |
.raw_uop_rob (raw_uop_rob), | |
.raw_uop_uop (raw_uop_uop), | |
.arch_hazard (arch_hazard), | |
.uop_ctrl (uop_ctrl), | |
// handshake signals | |
.uop_valid_uop2dp (uop_valid_uop2dp), | |
.uop_ready_dp2uop (uop_ready_dp2uop), | |
.rs_valid_dp2alu (rs_valid_dp2alu), | |
.rs_ready_alu2dp (rs_ready_alu2dp), | |
.rs_valid_dp2pmtrdt (rs_valid_dp2pmtrdt), | |
.rs_ready_pmtrdt2dp (rs_ready_pmtrdt2dp), | |
.rs_valid_dp2mul (rs_valid_dp2mul), | |
.rs_ready_mul2dp (rs_ready_mul2dp), | |
.rs_valid_dp2div (rs_valid_dp2div), | |
.rs_ready_div2dp (rs_ready_div2dp), | |
.rs_valid_dp2lsu (rs_valid_dp2lsu), | |
.rs_ready_lsu2dp (rs_ready_lsu2dp), | |
.mapinfo_valid_dp2lsu (mapinfo_valid_dp2lsu), | |
.mapinfo_ready_lsu2dp (mapinfo_ready_lsu2dp), | |
.uop_valid_dp2rob (uop_valid_dp2rob), | |
.uop_ready_rob2dp (uop_ready_rob2dp) | |
); | |
// determine the type for each byte in uop's vector operands | |
generate | |
for (i=0; i<`NUM_DP_UOP; i++) begin : gen_opr_bype_type | |
assign uop_info[i].uop_index = (uop_uop2dp[i].uop_exe_unit==LSU)&(uop_uop2dp[i].uop_funct6.lsu_funct6.lsu_is_seg==IS_SEGMENT)? | |
{1'b0,uop_uop2dp[i].seg_field_index} : uop_uop2dp[i].uop_index; | |
assign uop_info[i].uop_exe_unit = uop_uop2dp[i].uop_exe_unit; | |
assign uop_info[i].vd_eew = uop_uop2dp[i].vd_eew; | |
assign uop_info[i].vs1_eew = uop_uop2dp[i].vs1_eew; | |
assign uop_info[i].vs2_eew = uop_uop2dp[i].vs2_eew; | |
assign uop_info[i].vstart = uop_uop2dp[i].vector_csr.vstart; | |
assign uop_info[i].vl = uop_uop2dp[i].vs_evl; | |
assign uop_info[i].vm = uop_uop2dp[i].vm; | |
assign uop_info[i].ignore_vma = uop_uop2dp[i].ignore_vma; | |
assign uop_info[i].ignore_vta = uop_uop2dp[i].ignore_vta; | |
rvv_backend_dispatch_opr_byte_type #( | |
) u_opr_byte_type ( | |
.operand_byte_type (uop_operand_byte_type[i]), | |
.uop_info (uop_info[i]), | |
.v0_enable (uop_operand[i].v0) | |
); | |
end | |
endgenerate | |
// output signals for RS+ROB | |
generate | |
for (i=0; i<`NUM_DP_UOP; i++) begin : gen_output_sig | |
// rob_address | |
if (i==0) | |
assign rob_address[0] = uop_index_rob2dp; | |
else begin | |
assign rob_address[i] = (uop_uop2dp[i].uop_exe_unit==RDT||uop_uop2dp[i].uop_exe_unit==CMP)&(!uop_uop2dp[i].first_uop_valid) ? rob_address[i-1] : rob_address[i-1]+1'b1; | |
end | |
// ALU RS | |
`ifdef TB_SUPPORT | |
assign rs_dp2alu[i].uop_pc = uop_uop2dp[i].uop_pc; | |
`endif | |
assign rs_dp2alu[i].rob_entry = rob_address[i]; | |
assign rs_dp2alu[i].uop_funct6 = uop_uop2dp[i].uop_funct6; | |
assign rs_dp2alu[i].uop_funct3 = uop_uop2dp[i].uop_funct3; | |
assign rs_dp2alu[i].vstart = uop_uop2dp[i].vector_csr.vstart; | |
assign rs_dp2alu[i].vl = uop_uop2dp[i].vs_evl; | |
assign rs_dp2alu[i].vm = uop_uop2dp[i].vm; | |
assign rs_dp2alu[i].vxrm = uop_uop2dp[i].vector_csr.xrm; | |
assign rs_dp2alu[i].v0_data = uop_operand[i].v0; | |
assign rs_dp2alu[i].v0_data_valid = uop_uop2dp[i].v0_valid; | |
assign rs_dp2alu[i].vd_data = uop_operand[i].vd; | |
assign rs_dp2alu[i].vd_data_valid = uop_uop2dp[i].vs3_valid; | |
assign rs_dp2alu[i].vd_eew = uop_uop2dp[i].vd_eew; | |
assign rs_dp2alu[i].vs1 = uop_uop2dp[i].vs1; | |
assign rs_dp2alu[i].vs1_data = uop_operand[i].vs1; | |
assign rs_dp2alu[i].vs1_data_valid= uop_uop2dp[i].vs1_index_valid; | |
assign rs_dp2alu[i].vs2_data = uop_operand[i].vs2; | |
assign rs_dp2alu[i].vs2_data_valid= uop_uop2dp[i].vs2_valid; | |
assign rs_dp2alu[i].vs2_eew = uop_uop2dp[i].vs2_eew; | |
assign rs_dp2alu[i].rs1_data = uop_uop2dp[i].rs1_data; | |
assign rs_dp2alu[i].rs1_data_valid= uop_uop2dp[i].rs1_data_valid; | |
assign rs_dp2alu[i].uop_index = uop_uop2dp[i].uop_index; | |
// PMTRDT RS | |
`ifdef TB_SUPPORT | |
assign rs_dp2pmtrdt[i].uop_pc = uop_uop2dp[i].uop_pc; | |
`endif | |
assign rs_dp2pmtrdt[i].rob_entry = rob_address[i]; | |
assign rs_dp2pmtrdt[i].uop_exe_unit = uop_uop2dp[i].uop_exe_unit; | |
assign rs_dp2pmtrdt[i].uop_funct6 = uop_uop2dp[i].uop_funct6; | |
assign rs_dp2pmtrdt[i].uop_funct3 = uop_uop2dp[i].uop_funct3; | |
assign rs_dp2pmtrdt[i].vstart = uop_uop2dp[i].vector_csr.vstart; | |
assign rs_dp2pmtrdt[i].vl = uop_uop2dp[i].vs_evl; | |
assign rs_dp2pmtrdt[i].vlmax = vlmax[i]; | |
assign rs_dp2pmtrdt[i].vm = uop_uop2dp[i].vm; | |
assign rs_dp2pmtrdt[i].v0_data = uop_operand[i].v0; | |
assign rs_dp2pmtrdt[i].v0_data_valid = uop_uop2dp[i].v0_valid; | |
assign rs_dp2pmtrdt[i].vs1_data = uop_operand[i].vs1; | |
assign rs_dp2pmtrdt[i].vs1_eew = uop_uop2dp[i].vs1_eew; | |
assign rs_dp2pmtrdt[i].vs1_data_valid = uop_uop2dp[i].vs1_index_valid; | |
assign rs_dp2pmtrdt[i].vs2_data = uop_operand[i].vs2; | |
assign rs_dp2pmtrdt[i].vs2_eew = uop_uop2dp[i].vs2_eew; | |
assign rs_dp2pmtrdt[i].vs2_type = uop_operand_byte_type[i].vs2; | |
assign rs_dp2pmtrdt[i].vs2_data_valid = uop_uop2dp[i].vs2_valid; | |
assign rs_dp2pmtrdt[i].vs3_data = uop_operand[i].vd; | |
assign rs_dp2pmtrdt[i].vs3_data_valid = uop_uop2dp[i].vs3_valid; | |
assign rs_dp2pmtrdt[i].rs1_data = uop_uop2dp[i].rs1_data; | |
assign rs_dp2pmtrdt[i].rs1_data_valid = uop_uop2dp[i].rs1_data_valid; | |
assign rs_dp2pmtrdt[i].first_uop_valid = uop_uop2dp[i].first_uop_valid; | |
assign rs_dp2pmtrdt[i].last_uop_valid = uop_uop2dp[i].last_uop_valid; | |
assign rs_dp2pmtrdt[i].uop_index = uop_uop2dp[i].uop_index; | |
// MUL/MAC RS | |
`ifdef TB_SUPPORT | |
assign rs_dp2mul[i].uop_pc = uop_uop2dp[i].uop_pc; | |
`endif | |
assign rs_dp2mul[i].rob_entry = rob_address[i]; | |
assign rs_dp2mul[i].uop_funct6 = uop_uop2dp[i].uop_funct6; | |
assign rs_dp2mul[i].uop_funct3 = uop_uop2dp[i].uop_funct3; | |
assign rs_dp2mul[i].vxrm = uop_uop2dp[i].vector_csr.xrm; | |
assign rs_dp2mul[i].vs1_data = uop_operand[i].vs1; | |
assign rs_dp2mul[i].vs1_data_valid = uop_uop2dp[i].vs1_index_valid; | |
assign rs_dp2mul[i].vs2_data = uop_operand[i].vs2; | |
assign rs_dp2mul[i].vs2_data_valid = uop_uop2dp[i].vs2_valid; | |
assign rs_dp2mul[i].vs2_eew = uop_uop2dp[i].vs2_eew; | |
assign rs_dp2mul[i].vs3_data = uop_operand[i].vd; | |
assign rs_dp2mul[i].vs3_data_valid = uop_uop2dp[i].vs3_valid; | |
assign rs_dp2mul[i].rs1_data = uop_uop2dp[i].rs1_data; | |
assign rs_dp2mul[i].rs1_data_valid = uop_uop2dp[i].rs1_data_valid; | |
assign rs_dp2mul[i].uop_index = uop_uop2dp[i].uop_index; | |
// DIV RS | |
`ifdef TB_SUPPORT | |
assign rs_dp2div[i].uop_pc = uop_uop2dp[i].uop_pc; | |
`endif | |
assign rs_dp2div[i].rob_entry = rob_address[i]; | |
assign rs_dp2div[i].uop_funct6 = uop_uop2dp[i].uop_funct6; | |
assign rs_dp2div[i].uop_funct3 = uop_uop2dp[i].uop_funct3; | |
assign rs_dp2div[i].vs1_data = uop_operand[i].vs1; | |
assign rs_dp2div[i].vs1_data_valid= uop_uop2dp[i].vs1_index_valid; | |
assign rs_dp2div[i].vs2_data = uop_operand[i].vs2; | |
assign rs_dp2div[i].vs2_eew = uop_uop2dp[i].vs2_eew; | |
assign rs_dp2div[i].vs2_data_valid= uop_uop2dp[i].vs2_valid; | |
assign rs_dp2div[i].rs1_data = uop_uop2dp[i].rs1_data; | |
assign rs_dp2div[i].rs1_data_valid= uop_uop2dp[i].rs1_data_valid; | |
// LSU RS | |
`ifdef TB_SUPPORT | |
assign rs_dp2lsu[i].uop_pc = uop_uop2dp[i].uop_pc; | |
`endif | |
assign rs_dp2lsu[i].vidx_valid = uop_uop2dp[i].vs2_valid; | |
assign rs_dp2lsu[i].vidx_addr = uop_uop2dp[i].vs2_index; | |
assign rs_dp2lsu[i].vidx_data = uop_operand[i].vs2; | |
assign rs_dp2lsu[i].vregfile_read_valid = uop_uop2dp[i].vs3_valid; | |
assign rs_dp2lsu[i].vregfile_read_addr = uop_uop2dp[i].vd_index; | |
assign rs_dp2lsu[i].vregfile_read_data = uop_operand[i].vd; | |
assign rs_dp2lsu[i].v0_valid = uop_uop2dp[i].v0_valid; | |
assign rs_dp2lsu[i].v0_data = uop_operand_byte_type[i].v0_strobe; | |
// LSU MAP INFO | |
`ifdef TB_SUPPORT | |
assign mapinfo_dp2lsu[i].uop_pc = uop_uop2dp[i].uop_pc; | |
`endif | |
assign mapinfo_dp2lsu[i].valid = mapinfo_valid_dp2lsu[i]; | |
assign mapinfo_dp2lsu[i].rob_entry = rob_address[i]; | |
assign mapinfo_dp2lsu[i].lsu_class = uop_uop2dp[i].uop_funct6.lsu_funct6.lsu_is_store; | |
assign mapinfo_dp2lsu[i].vregfile_write_addr = uop_uop2dp[i].vd_index; | |
// ROB | |
`ifdef TB_SUPPORT | |
assign uop_dp2rob[i].uop_pc = uop_uop2dp[i].uop_pc; | |
`endif | |
assign uop_dp2rob[i].w_index = uop_uop2dp[i].rd_index_valid ? uop_uop2dp[i].rd_index : uop_uop2dp[i].vd_index; | |
assign uop_dp2rob[i].w_type = uop_uop2dp[i].rd_index_valid ? XRF : VRF; | |
assign uop_dp2rob[i].byte_type = uop_operand_byte_type[i].vd; | |
assign uop_dp2rob[i].vector_csr = uop_uop2dp[i].vector_csr; | |
assign uop_dp2rob[i].last_uop_valid = uop_uop2dp[i].last_uop_valid; | |
end | |
endgenerate | |
endmodule |