Files
OpenExSys_NoC/rtl/sa_global.sv
2023-11-26 14:59:34 +01:00

102 lines
2.5 KiB
Systemverilog

module sa_global
import rvh_noc_pkg::*;
#(
parameter INPUT_NUM = 4,
parameter INPUT_NUM_IDX_W = INPUT_NUM > 1 ? $clog2(INPUT_NUM) : 1
)
(
// input to allocate
input logic [INPUT_NUM-1:0] sa_local_vld_i,
input logic [INPUT_NUM-1:0][VC_ID_NUM_MAX_W-1:0] sa_local_vc_id_i,
`ifdef USE_QOS_VALUE
input logic [INPUT_NUM-1:0][QoS_Value_Width-1:0] sa_local_qos_value_i,
`endif
// output to VC assignment
output logic sa_global_vld_o,
`ifdef COMMON_QOS_EXTRA_RT_VC
output logic [QoS_Value_Width-1:0] sa_global_qos_value_o,
`endif
output logic [INPUT_NUM-1:0] sa_global_inport_id_oh_o,
output logic [VC_ID_NUM_MAX_W-1:0] sa_global_inport_vc_id_o,
// input from vc assignment for rr arbiter update
input logic vc_assignment_vld_i,
input logic clk,
input logic rstn
);
logic [INPUT_NUM-1:0] sa_global_grt_oh;
logic [INPUT_NUM_IDX_W-1:0] sa_global_grt_idx;
logic [INPUT_NUM-1:0] sa_local_vld_join_arb; // for qos, if no qos, it is same as sa_local_vld_i
`ifdef USE_QOS_VALUE
priority_req_select
#(
.INPUT_NUM ( INPUT_NUM ),
.INPUT_PRIORITY_W ( QoS_Value_Width )
)
sa_local_priority_req_select_u (
.req_vld_i (sa_local_vld_i ),
.req_priority_i (sa_local_qos_value_i ),
.req_vld_o (sa_local_vld_join_arb )
);
`else
assign sa_local_vld_join_arb = sa_local_vld_i;
`endif
one_hot_rr_arb #(
.N_INPUT (INPUT_NUM),
.TIMEOUT_UPDATE_EN (1 ),
.TIMEOUT_UPDATE_CYCLE (10)
)
sa_global_rr_arb_u
(
.req_i (sa_local_vld_join_arb ),
.update_i (vc_assignment_vld_i ),
.grt_o (sa_global_grt_oh ),
.grt_idx_o (sa_global_grt_idx ),
.rstn (rstn ),
.clk (clk )
);
assign sa_global_vld_o = |sa_local_vld_join_arb;
assign sa_global_inport_id_oh_o = sa_global_grt_oh;
// assign sa_global_inport_vc_id_o = sa_local_vc_id_i[sa_global_grt_idx];
onehot_mux
#(
.SOURCE_COUNT(INPUT_NUM ),
.DATA_WIDTH (VC_ID_NUM_MAX_W )
)
onehot_mux_sa_global_inport_vc_id_o_u (
.sel_i (sa_global_grt_oh ),
.data_i (sa_local_vc_id_i ),
.data_o (sa_global_inport_vc_id_o)
);
`ifdef COMMON_QOS_EXTRA_RT_VC
onehot_mux
#(
.SOURCE_COUNT(INPUT_NUM ),
.DATA_WIDTH (QoS_Value_Width )
)
onehot_mux_sa_global_qos_value_o_u (
.sel_i (sa_global_grt_oh ),
.data_i (sa_local_qos_value_i ),
.data_o (sa_global_qos_value_o)
);
`endif
endmodule