blob: 44cf74483a210a087486f3faa6c17b636f8dc8b6 [file] [log] [blame]
module axi_address_decoder_AR
#(
parameter ADDR_WIDTH = 32,
parameter N_INIT_PORT = 8,
parameter N_REGION = 4
)
(
clk,
rst_n,
arvalid_i,
araddr_i,
arready_o,
arvalid_o,
arready_i,
START_ADDR_i,
END_ADDR_i,
enable_region_i,
connectivity_map_i,
incr_req_o,
full_counter_i,
outstanding_trans_i,
error_req_o,
error_gnt_i,
sample_ardata_info_o
);
//parameter ADDR_WIDTH = 32;
//parameter N_INIT_PORT = 8;
//parameter N_REGION = 4;
input wire clk;
input wire rst_n;
input wire arvalid_i;
input wire [ADDR_WIDTH - 1:0] araddr_i;
output reg arready_o;
output reg [N_INIT_PORT - 1:0] arvalid_o;
input wire [N_INIT_PORT - 1:0] arready_i;
input wire [((N_REGION * N_INIT_PORT) * ADDR_WIDTH) - 1:0] START_ADDR_i;
input wire [((N_REGION * N_INIT_PORT) * ADDR_WIDTH) - 1:0] END_ADDR_i;
input wire [(N_REGION * N_INIT_PORT) - 1:0] enable_region_i;
input wire [N_INIT_PORT - 1:0] connectivity_map_i;
output reg incr_req_o;
input wire full_counter_i;
input wire outstanding_trans_i;
output reg error_req_o;
input wire error_gnt_i;
output reg sample_ardata_info_o;
wire [N_INIT_PORT - 1:0] match_region;
wire [N_INIT_PORT:0] match_region_masked;
wire [(N_REGION * N_INIT_PORT) - 1:0] match_region_int;
wire [(N_INIT_PORT * N_REGION) - 1:0] match_region_rev;
reg arready_int;
reg [N_INIT_PORT - 1:0] arvalid_int;
genvar i;
genvar j;
reg CS;
reg NS;
generate
for (j = 0; j < N_REGION; j = j + 1) begin : genblk1
for (i = 0; i < N_INIT_PORT; i = i + 1) begin : genblk1
assign match_region_int[(j * N_INIT_PORT) + i] = (enable_region_i[(j * N_INIT_PORT) + i] == 1'b1 ? (araddr_i >= START_ADDR_i[((j * N_INIT_PORT) + i) * ADDR_WIDTH+:ADDR_WIDTH]) && (araddr_i <= END_ADDR_i[((j * N_INIT_PORT) + i) * ADDR_WIDTH+:ADDR_WIDTH]) : 1'b0);
end
end
for (j = 0; j < N_INIT_PORT; j = j + 1) begin : genblk2
for (i = 0; i < N_REGION; i = i + 1) begin : genblk1
assign match_region_rev[(j * N_REGION) + i] = match_region_int[(i * N_INIT_PORT) + j];
end
end
for (i = 0; i < N_INIT_PORT; i = i + 1) begin : genblk3
assign match_region[i] = |match_region_rev[i * N_REGION+:N_REGION];
end
endgenerate
assign match_region_masked[N_INIT_PORT - 1:0] = match_region & connectivity_map_i;
assign match_region_masked[N_INIT_PORT] = ~(|match_region_masked[N_INIT_PORT - 1:0]);
always @(*) begin
if (arvalid_i)
{error_req_o, arvalid_int} = {N_INIT_PORT + 1 {arvalid_i}} & match_region_masked;
else begin
arvalid_int = 1'sb0;
error_req_o = 1'b0;
end
arready_int = |({error_gnt_i, arready_i} & match_region_masked);
end
always @(posedge clk or negedge rst_n)
if (rst_n == 1'b0)
CS <= 1'd0;
else
CS <= NS;
always @(*) begin
arready_o = 1'b0;
arvalid_o = arvalid_int;
sample_ardata_info_o = 1'b0;
incr_req_o = 1'b0;
case (CS)
1'd0:
if (error_req_o) begin
NS = 1'd1;
arready_o = 1'b1;
sample_ardata_info_o = 1'b1;
arvalid_o = 1'sb0;
end
else begin
NS = 1'd0;
arready_o = arready_int;
sample_ardata_info_o = 1'b0;
incr_req_o = |(arvalid_o & arready_i);
arvalid_o = arvalid_int;
end
1'd1: begin
arready_o = 1'b0;
arvalid_o = 1'sb0;
if (outstanding_trans_i)
NS = 1'd1;
else if (error_gnt_i)
NS = 1'd0;
else
NS = 1'd1;
end
default: begin
NS = 1'd0;
arready_o = arready_int;
end
endcase
end
endmodule