blob: 3682649762c5660679fc6c869c07752820d941d6 [file] [log] [blame]
module axi_AR_allocator
#(
parameter AXI_ADDRESS_W = 32,
parameter AXI_USER_W = 6,
parameter N_TARG_PORT = 7,
parameter LOG_N_TARG = $clog2(N_TARG_PORT),
parameter AXI_ID_IN = 16,
parameter AXI_ID_OUT = AXI_ID_IN + $clog2(N_TARG_PORT)
)
(
clk,
rst_n,
arid_i,
araddr_i,
arlen_i,
arsize_i,
arburst_i,
arlock_i,
arcache_i,
arprot_i,
arregion_i,
aruser_i,
arqos_i,
arvalid_i,
arready_o,
arid_o,
araddr_o,
arlen_o,
arsize_o,
arburst_o,
arlock_o,
arcache_o,
arprot_o,
arregion_o,
aruser_o,
arqos_o,
arvalid_o,
arready_i
);
//parameter AXI_ADDRESS_W = 32;
//parameter AXI_USER_W = 6;
//parameter N_TARG_PORT = 7;
//parameter LOG_N_TARG = $clog2(N_TARG_PORT);
//parameter AXI_ID_IN = 16;
//parameter AXI_ID_OUT = AXI_ID_IN + $clog2(N_TARG_PORT);
input wire clk;
input wire rst_n;
input wire [(N_TARG_PORT * AXI_ID_IN) - 1:0] arid_i;
input wire [(N_TARG_PORT * AXI_ADDRESS_W) - 1:0] araddr_i;
input wire [(N_TARG_PORT * 8) - 1:0] arlen_i;
input wire [(N_TARG_PORT * 3) - 1:0] arsize_i;
input wire [(N_TARG_PORT * 2) - 1:0] arburst_i;
input wire [N_TARG_PORT - 1:0] arlock_i;
input wire [(N_TARG_PORT * 4) - 1:0] arcache_i;
input wire [(N_TARG_PORT * 3) - 1:0] arprot_i;
input wire [(N_TARG_PORT * 4) - 1:0] arregion_i;
input wire [(N_TARG_PORT * AXI_USER_W) - 1:0] aruser_i;
input wire [(N_TARG_PORT * 4) - 1:0] arqos_i;
input wire [N_TARG_PORT - 1:0] arvalid_i;
output wire [N_TARG_PORT - 1:0] arready_o;
output wire [AXI_ID_OUT - 1:0] arid_o;
output wire [AXI_ADDRESS_W - 1:0] araddr_o;
output wire [7:0] arlen_o;
output wire [2:0] arsize_o;
output wire [1:0] arburst_o;
output wire arlock_o;
output wire [3:0] arcache_o;
output wire [2:0] arprot_o;
output wire [3:0] arregion_o;
output wire [AXI_USER_W - 1:0] aruser_o;
output wire [3:0] arqos_o;
output wire arvalid_o;
input wire arready_i;
localparam AUX_WIDTH = (((AXI_ID_IN + AXI_ADDRESS_W) + 25) + AXI_USER_W) + 4;
wire [(N_TARG_PORT * AUX_WIDTH) - 1:0] AUX_VECTOR_IN;
wire [AUX_WIDTH - 1:0] AUX_VECTOR_OUT;
wire [(N_TARG_PORT * (LOG_N_TARG + N_TARG_PORT)) - 1:0] ID_in;
wire [(LOG_N_TARG + N_TARG_PORT) - 1:0] ID_int;
genvar i;
assign {arqos_o, aruser_o, arregion_o, arprot_o, arcache_o, arlock_o, arburst_o, arsize_o, arlen_o, araddr_o, arid_o[AXI_ID_IN - 1:0]} = AUX_VECTOR_OUT;
assign arid_o[AXI_ID_OUT - 1:AXI_ID_IN] = ID_int[(LOG_N_TARG + N_TARG_PORT) - 1:N_TARG_PORT];
generate
for (i = 0; i < N_TARG_PORT; i = i + 1) begin : AUX_VECTOR_BINDING
assign AUX_VECTOR_IN[i * AUX_WIDTH+:AUX_WIDTH] = {arqos_i[i * 4+:4], aruser_i[i * AXI_USER_W+:AXI_USER_W], arregion_i[i * 4+:4], arprot_i[i * 3+:3], arcache_i[i * 4+:4], arlock_i[i], arburst_i[i * 2+:2], arsize_i[i * 3+:3], arlen_i[i * 8+:8], araddr_i[i * AXI_ADDRESS_W+:AXI_ADDRESS_W], arid_i[i * AXI_ID_IN+:AXI_ID_IN]};
end
for (i = 0; i < N_TARG_PORT; i = i + 1) begin : ID_VECTOR_BINDING
assign ID_in[(i * (LOG_N_TARG + N_TARG_PORT)) + (N_TARG_PORT - 1)-:N_TARG_PORT] = 2 ** i;
assign ID_in[(i * (LOG_N_TARG + N_TARG_PORT)) + (((LOG_N_TARG + N_TARG_PORT) - 1) >= N_TARG_PORT ? (LOG_N_TARG + N_TARG_PORT) - 1 : (((LOG_N_TARG + N_TARG_PORT) - 1) + (((LOG_N_TARG + N_TARG_PORT) - 1) >= N_TARG_PORT ? (((LOG_N_TARG + N_TARG_PORT) - 1) - N_TARG_PORT) + 1 : (N_TARG_PORT - ((LOG_N_TARG + N_TARG_PORT) - 1)) + 1)) - 1)-:(((LOG_N_TARG + N_TARG_PORT) - 1) >= N_TARG_PORT ? (((LOG_N_TARG + N_TARG_PORT) - 1) - N_TARG_PORT) + 1 : (N_TARG_PORT - ((LOG_N_TARG + N_TARG_PORT) - 1)) + 1)] = i;
end
endgenerate
axi_ArbitrationTree #(
.AUX_WIDTH(AUX_WIDTH),
.ID_WIDTH(LOG_N_TARG + N_TARG_PORT),
.N_MASTER(N_TARG_PORT)
) AW_ARB_TREE(
.clk(clk),
.rst_n(rst_n),
.data_req_i(arvalid_i),
.data_AUX_i(AUX_VECTOR_IN),
.data_ID_i(ID_in),
.data_gnt_o(arready_o),
.data_req_o(arvalid_o),
.data_AUX_o(AUX_VECTOR_OUT),
.data_ID_o(ID_int),
.data_gnt_i(arready_i),
.lock(1'b0),
.SEL_EXCLUSIVE({$clog2(N_TARG_PORT) {1'b0}})
);
endmodule