102 lines
2.5 KiB
Systemverilog
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
|