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

67 lines
2.1 KiB
Systemverilog

`ifndef __INORDER_ROUTER_SV__
`define __INORDER_ROUTER_SV__
module inorder_router
#(
parameter int unsigned SRC_COUNT = 4,
parameter int unsigned DES_COUNT = 4
) (
input logic[SRC_COUNT-1:0] src_vld_i,
input logic[SRC_COUNT-1:0][DES_COUNT-1:0] src_des_en_i,
output logic[SRC_COUNT-1:0] success_o,
output logic[DES_COUNT-1:0][SRC_COUNT-1:0] src_des_sel_o
);
logic[SRC_COUNT-1:0] success;
logic[SRC_COUNT-1:0][DES_COUNT-1:0] des_sel_mask;
logic[SRC_COUNT-1:0][DES_COUNT-1:0] des_disable_mask;
logic[SRC_COUNT-1:0][DES_COUNT-1:0] des_rdy_mask;
generate
for(genvar src = 0 ; src < SRC_COUNT; src++) begin : gen_des_disable_mask
if(src == 0) begin
assign des_disable_mask[src] = {DES_COUNT{1'b0}};
end else begin
assign des_disable_mask[src] = des_disable_mask[src-1] | des_sel_mask[src-1];
end
end
endgenerate
generate
for(genvar src = 0 ; src < SRC_COUNT ; src++) begin : gen_des_rdy_mask
if(src == 0) begin
assign des_rdy_mask[src] = {DES_COUNT{src_vld_i[src]}} & src_des_en_i[src];
end else begin
assign des_rdy_mask[src] = {DES_COUNT{src_vld_i[src]}} & src_des_en_i[src] & ~des_disable_mask[src] & {DES_COUNT{success[src-1]}};
end
end
endgenerate
generate
for(genvar src = 0 ; src < SRC_COUNT ; src++) begin : gen_success_vec
assign success[src] = |des_sel_mask[src];
end
endgenerate
always_comb begin : output_logic
success_o = success;
for(int src = 0 ; src < SRC_COUNT; src++) begin
for(int des = 0 ; des < DES_COUNT; des++) begin
src_des_sel_o[des][src] = des_sel_mask[src][des];
end
end
end
generate
for(genvar src = 0 ; src < SRC_COUNT ; src++) begin
one_hot_priority_encoder
#(
.SEL_WIDTH(DES_COUNT)
) u_routing_encoder (
.sel_i(des_rdy_mask[src]),
.sel_o(des_sel_mask[src])
);
end
endgenerate
endmodule
`endif