blob: 6930760b05e87406550e4aba612204e152b5a6b1 [file] [log] [blame]
`define log2(VALUE) ((VALUE) < ( 1 ) ? 0 : (VALUE) < ( 2 ) ? 1 : (VALUE) < ( 4 ) ? 2 : (VALUE) < ( 8 ) ? 3 : (VALUE) < ( 16 ) ? 4 : (VALUE) < ( 32 ) ? 5 : (VALUE) < ( 64 ) ? 6 : (VALUE) < ( 128 ) ? 7 : (VALUE) < ( 256 ) ? 8 : (VALUE) < ( 512 ) ? 9 : (VALUE) < ( 1024 ) ? 10 : (VALUE) < ( 2048 ) ? 11 : (VALUE) < ( 4096 ) ? 12 : (VALUE) < ( 8192 ) ? 13 : (VALUE) < ( 16384 ) ? 14 : (VALUE) < ( 32768 ) ? 15 : (VALUE) < ( 65536 ) ? 16 : (VALUE) < ( 131072 ) ? 17 : (VALUE) < ( 262144 ) ? 18 : (VALUE) < ( 524288 ) ? 19 : (VALUE) < ( 1048576 ) ? 20 : (VALUE) < ( 1048576 * 2 ) ? 21 : (VALUE) < ( 1048576 * 4 ) ? 22 : (VALUE) < ( 1048576 * 8 ) ? 23 : (VALUE) < ( 1048576 * 16 ) ? 24 : 25)
module AXI_2_APB
#(
parameter AXI4_ADDRESS_WIDTH = 32,
parameter AXI4_RDATA_WIDTH = 64,
parameter AXI4_WDATA_WIDTH = 64,
parameter AXI4_ID_WIDTH = 16,
parameter AXI4_USER_WIDTH = 10,
parameter AXI_NUMBYTES = AXI4_WDATA_WIDTH/8,
parameter BUFF_DEPTH_SLAVE = 4,
parameter APB_NUM_SLAVES = 8,
parameter APB_ADDR_WIDTH = 12 //APB slaves are 4KB by default
)
(
ACLK,
ARESETn,
test_en_i,
AWID_i,
AWADDR_i,
AWLEN_i,
AWSIZE_i,
AWBURST_i,
AWLOCK_i,
AWCACHE_i,
AWPROT_i,
AWREGION_i,
AWUSER_i,
AWQOS_i,
AWVALID_i,
AWREADY_o,
WDATA_i,
WSTRB_i,
WLAST_i,
WUSER_i,
WVALID_i,
WREADY_o,
BID_o,
BRESP_o,
BVALID_o,
BUSER_o,
BREADY_i,
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,
RID_o,
RDATA_o,
RRESP_o,
RLAST_o,
RUSER_o,
RVALID_o,
RREADY_i,
PENABLE,
PWRITE,
PADDR,
PSEL,
PWDATA,
PRDATA,
PREADY,
PSLVERR
);
//parameter AXI4_ADDRESS_WIDTH = 32;
//parameter AXI4_RDATA_WIDTH = 64;
//parameter AXI4_WDATA_WIDTH = 64;
//parameter AXI4_ID_WIDTH = 16;
//parameter AXI4_USER_WIDTH = 10;
//parameter AXI_NUMBYTES = AXI4_WDATA_WIDTH / 8;
//parameter BUFF_DEPTH_SLAVE = 4;
//parameter APB_NUM_SLAVES = 8;
//parameter APB_ADDR_WIDTH = 12;
input wire ACLK;
input wire ARESETn;
input wire test_en_i;
input wire [AXI4_ID_WIDTH - 1:0] AWID_i;
input wire [AXI4_ADDRESS_WIDTH - 1:0] AWADDR_i;
input wire [7:0] AWLEN_i;
input wire [2:0] AWSIZE_i;
input wire [1:0] AWBURST_i;
input wire AWLOCK_i;
input wire [3:0] AWCACHE_i;
input wire [2:0] AWPROT_i;
input wire [3:0] AWREGION_i;
input wire [AXI4_USER_WIDTH - 1:0] AWUSER_i;
input wire [3:0] AWQOS_i;
input wire AWVALID_i;
output wire AWREADY_o;
input wire [(AXI_NUMBYTES * 8) - 1:0] WDATA_i;
input wire [AXI_NUMBYTES - 1:0] WSTRB_i;
input wire WLAST_i;
input wire [AXI4_USER_WIDTH - 1:0] WUSER_i;
input wire WVALID_i;
output wire WREADY_o;
output wire [AXI4_ID_WIDTH - 1:0] BID_o;
output wire [1:0] BRESP_o;
output wire BVALID_o;
output wire [AXI4_USER_WIDTH - 1:0] BUSER_o;
input wire BREADY_i;
input wire [AXI4_ID_WIDTH - 1:0] ARID_i;
input wire [AXI4_ADDRESS_WIDTH - 1:0] ARADDR_i;
input wire [7:0] ARLEN_i;
input wire [2:0] ARSIZE_i;
input wire [1:0] ARBURST_i;
input wire ARLOCK_i;
input wire [3:0] ARCACHE_i;
input wire [2:0] ARPROT_i;
input wire [3:0] ARREGION_i;
input wire [AXI4_USER_WIDTH - 1:0] ARUSER_i;
input wire [3:0] ARQOS_i;
input wire ARVALID_i;
output wire ARREADY_o;
output wire [AXI4_ID_WIDTH - 1:0] RID_o;
output wire [AXI4_RDATA_WIDTH - 1:0] RDATA_o;
output wire [1:0] RRESP_o;
output wire RLAST_o;
output wire [AXI4_USER_WIDTH - 1:0] RUSER_o;
output wire RVALID_o;
input wire RREADY_i;
output wire PENABLE;
output wire PWRITE;
output wire [APB_ADDR_WIDTH - 1:0] PADDR;
output reg [APB_NUM_SLAVES - 1:0] PSEL;
output wire [31:0] PWDATA;
input wire [(APB_NUM_SLAVES * 32) - 1:0] PRDATA;
input wire [APB_NUM_SLAVES - 1:0] PREADY;
input wire [APB_NUM_SLAVES - 1:0] PSLVERR;
localparam OFFSET_BIT = 2;
wire [AXI4_ID_WIDTH - 1:0] AWID;
wire [AXI4_ADDRESS_WIDTH - 1:0] AWADDR;
wire [7:0] AWLEN;
wire [2:0] AWSIZE;
wire [1:0] AWBURST;
wire AWLOCK;
wire [3:0] AWCACHE;
wire [2:0] AWPROT;
wire [3:0] AWREGION;
wire [AXI4_USER_WIDTH - 1:0] AWUSER;
wire [3:0] AWQOS;
wire AWVALID;
reg AWREADY;
wire [63:0] WDATA;
wire [AXI_NUMBYTES - 1:0] WSTRB;
wire WLAST;
wire [AXI4_USER_WIDTH - 1:0] WUSER;
wire WVALID;
reg WREADY;
reg [AXI4_ID_WIDTH - 1:0] BID;
reg [1:0] BRESP;
reg BVALID;
reg [AXI4_USER_WIDTH - 1:0] BUSER;
wire BREADY;
wire [AXI4_ID_WIDTH - 1:0] ARID;
wire [AXI4_ADDRESS_WIDTH - 1:0] ARADDR;
wire [7:0] ARLEN;
wire [2:0] ARSIZE;
wire [1:0] ARBURST;
wire ARLOCK;
wire [3:0] ARCACHE;
wire [2:0] ARPROT;
wire [3:0] ARREGION;
wire [AXI4_USER_WIDTH - 1:0] ARUSER;
wire [3:0] ARQOS;
wire ARVALID;
reg ARREADY;
reg [AXI4_ID_WIDTH - 1:0] RID;
reg [63:0] RDATA;
reg [1:0] RRESP;
reg RLAST;
reg [AXI4_USER_WIDTH - 1:0] RUSER;
reg RVALID;
wire RREADY;
reg [3:0] CS;
reg [3:0] NS;
reg W_word_sel;
reg [(((APB_NUM_SLAVES - 1) < 1 ? 0 : ((APB_NUM_SLAVES - 1) < 2 ? 1 : ((APB_NUM_SLAVES - 1) < 4 ? 2 : ((APB_NUM_SLAVES - 1) < 8 ? 3 : ((APB_NUM_SLAVES - 1) < 16 ? 4 : ((APB_NUM_SLAVES - 1) < 32 ? 5 : ((APB_NUM_SLAVES - 1) < 64 ? 6 : ((APB_NUM_SLAVES - 1) < 128 ? 7 : ((APB_NUM_SLAVES - 1) < 256 ? 8 : ((APB_NUM_SLAVES - 1) < 512 ? 9 : ((APB_NUM_SLAVES - 1) < 1024 ? 10 : ((APB_NUM_SLAVES - 1) < 2048 ? 11 : ((APB_NUM_SLAVES - 1) < 4096 ? 12 : ((APB_NUM_SLAVES - 1) < 8192 ? 13 : ((APB_NUM_SLAVES - 1) < 16384 ? 14 : ((APB_NUM_SLAVES - 1) < 32768 ? 15 : ((APB_NUM_SLAVES - 1) < 65536 ? 16 : ((APB_NUM_SLAVES - 1) < 131072 ? 17 : ((APB_NUM_SLAVES - 1) < 262144 ? 18 : ((APB_NUM_SLAVES - 1) < 524288 ? 19 : ((APB_NUM_SLAVES - 1) < 1048576 ? 20 : ((APB_NUM_SLAVES - 1) < 2097152 ? 21 : ((APB_NUM_SLAVES - 1) < 4194304 ? 22 : ((APB_NUM_SLAVES - 1) < 8388608 ? 23 : ((APB_NUM_SLAVES - 1) < 16777216 ? 24 : 25))))))))))))))))))))))))) + APB_ADDR_WIDTH) - 1:0] address;
wire [31:0] wdata;
wire [31:0] rdata;
reg read_req;
reg write_req;
reg sample_AR;
reg [7:0] ARLEN_Q;
reg decr_ARLEN;
reg sample_AW;
reg [7:0] AWLEN_Q;
reg decr_AWLEN;
wire [((APB_NUM_SLAVES - 1) < 1 ? 0 : ((APB_NUM_SLAVES - 1) < 2 ? 1 : ((APB_NUM_SLAVES - 1) < 4 ? 2 : ((APB_NUM_SLAVES - 1) < 8 ? 3 : ((APB_NUM_SLAVES - 1) < 16 ? 4 : ((APB_NUM_SLAVES - 1) < 32 ? 5 : ((APB_NUM_SLAVES - 1) < 64 ? 6 : ((APB_NUM_SLAVES - 1) < 128 ? 7 : ((APB_NUM_SLAVES - 1) < 256 ? 8 : ((APB_NUM_SLAVES - 1) < 512 ? 9 : ((APB_NUM_SLAVES - 1) < 1024 ? 10 : ((APB_NUM_SLAVES - 1) < 2048 ? 11 : ((APB_NUM_SLAVES - 1) < 4096 ? 12 : ((APB_NUM_SLAVES - 1) < 8192 ? 13 : ((APB_NUM_SLAVES - 1) < 16384 ? 14 : ((APB_NUM_SLAVES - 1) < 32768 ? 15 : ((APB_NUM_SLAVES - 1) < 65536 ? 16 : ((APB_NUM_SLAVES - 1) < 131072 ? 17 : ((APB_NUM_SLAVES - 1) < 262144 ? 18 : ((APB_NUM_SLAVES - 1) < 524288 ? 19 : ((APB_NUM_SLAVES - 1) < 1048576 ? 20 : ((APB_NUM_SLAVES - 1) < 2097152 ? 21 : ((APB_NUM_SLAVES - 1) < 4194304 ? 22 : ((APB_NUM_SLAVES - 1) < 8388608 ? 23 : ((APB_NUM_SLAVES - 1) < 16777216 ? 24 : 25))))))))))))))))))))))))) - 1:0] TARGET_SLAVE;
reg sample_RDATA_0;
reg sample_RDATA_1;
reg [31:0] RDATA_Q_0;
reg [31:0] RDATA_Q_1;
assign PENABLE = write_req | read_req;
assign PWRITE = write_req;
assign PADDR = address[APB_ADDR_WIDTH - 1:0];
assign PWDATA = WDATA[W_word_sel * 32+:32];
assign TARGET_SLAVE = address[(APB_ADDR_WIDTH + ((APB_NUM_SLAVES - 1) < 1 ? 0 : ((APB_NUM_SLAVES - 1) < 2 ? 1 : ((APB_NUM_SLAVES - 1) < 4 ? 2 : ((APB_NUM_SLAVES - 1) < 8 ? 3 : ((APB_NUM_SLAVES - 1) < 16 ? 4 : ((APB_NUM_SLAVES - 1) < 32 ? 5 : ((APB_NUM_SLAVES - 1) < 64 ? 6 : ((APB_NUM_SLAVES - 1) < 128 ? 7 : ((APB_NUM_SLAVES - 1) < 256 ? 8 : ((APB_NUM_SLAVES - 1) < 512 ? 9 : ((APB_NUM_SLAVES - 1) < 1024 ? 10 : ((APB_NUM_SLAVES - 1) < 2048 ? 11 : ((APB_NUM_SLAVES - 1) < 4096 ? 12 : ((APB_NUM_SLAVES - 1) < 8192 ? 13 : ((APB_NUM_SLAVES - 1) < 16384 ? 14 : ((APB_NUM_SLAVES - 1) < 32768 ? 15 : ((APB_NUM_SLAVES - 1) < 65536 ? 16 : ((APB_NUM_SLAVES - 1) < 131072 ? 17 : ((APB_NUM_SLAVES - 1) < 262144 ? 18 : ((APB_NUM_SLAVES - 1) < 524288 ? 19 : ((APB_NUM_SLAVES - 1) < 1048576 ? 20 : ((APB_NUM_SLAVES - 1) < 2097152 ? 21 : ((APB_NUM_SLAVES - 1) < 4194304 ? 22 : ((APB_NUM_SLAVES - 1) < 8388608 ? 23 : ((APB_NUM_SLAVES - 1) < 16777216 ? 24 : 25)))))))))))))))))))))))))) - 1:APB_ADDR_WIDTH];
always @(*) begin
PSEL = 1'sb0;
PSEL[TARGET_SLAVE] = 1'b1;
end
axi_aw_buffer #(
.ID_WIDTH(AXI4_ID_WIDTH),
.ADDR_WIDTH(AXI4_ADDRESS_WIDTH),
.USER_WIDTH(AXI4_USER_WIDTH),
.BUFFER_DEPTH(BUFF_DEPTH_SLAVE)
) Slave_aw_buffer(
.clk_i(ACLK),
.rst_ni(ARESETn),
.test_en_i(test_en_i),
.slave_valid_i(AWVALID_i),
.slave_addr_i(AWADDR_i),
.slave_prot_i(AWPROT_i),
.slave_region_i(AWREGION_i),
.slave_len_i(AWLEN_i),
.slave_size_i(AWSIZE_i),
.slave_burst_i(AWBURST_i),
.slave_lock_i(AWLOCK_i),
.slave_cache_i(AWCACHE_i),
.slave_qos_i(AWQOS_i),
.slave_id_i(AWID_i),
.slave_user_i(AWUSER_i),
.slave_ready_o(AWREADY_o),
.master_valid_o(AWVALID),
.master_addr_o(AWADDR),
.master_prot_o(AWPROT),
.master_region_o(AWREGION),
.master_len_o(AWLEN),
.master_size_o(AWSIZE),
.master_burst_o(AWBURST),
.master_lock_o(AWLOCK),
.master_cache_o(AWCACHE),
.master_qos_o(AWQOS),
.master_id_o(AWID),
.master_user_o(AWUSER),
.master_ready_i(AWREADY)
);
axi_ar_buffer #(
.ID_WIDTH(AXI4_ID_WIDTH),
.ADDR_WIDTH(AXI4_ADDRESS_WIDTH),
.USER_WIDTH(AXI4_USER_WIDTH),
.BUFFER_DEPTH(BUFF_DEPTH_SLAVE)
) Slave_ar_buffer(
.clk_i(ACLK),
.rst_ni(ARESETn),
.test_en_i(test_en_i),
.slave_valid_i(ARVALID_i),
.slave_addr_i(ARADDR_i),
.slave_prot_i(ARPROT_i),
.slave_region_i(ARREGION_i),
.slave_len_i(ARLEN_i),
.slave_size_i(ARSIZE_i),
.slave_burst_i(ARBURST_i),
.slave_lock_i(ARLOCK_i),
.slave_cache_i(ARCACHE_i),
.slave_qos_i(ARQOS_i),
.slave_id_i(ARID_i),
.slave_user_i(ARUSER_i),
.slave_ready_o(ARREADY_o),
.master_valid_o(ARVALID),
.master_addr_o(ARADDR),
.master_prot_o(ARPROT),
.master_region_o(ARREGION),
.master_len_o(ARLEN),
.master_size_o(ARSIZE),
.master_burst_o(ARBURST),
.master_lock_o(ARLOCK),
.master_cache_o(ARCACHE),
.master_qos_o(ARQOS),
.master_id_o(ARID),
.master_user_o(ARUSER),
.master_ready_i(ARREADY)
);
axi_w_buffer #(
.DATA_WIDTH(AXI4_WDATA_WIDTH),
.USER_WIDTH(AXI4_USER_WIDTH),
.BUFFER_DEPTH(BUFF_DEPTH_SLAVE)
) Slave_w_buffer(
.clk_i(ACLK),
.rst_ni(ARESETn),
.test_en_i(test_en_i),
.slave_valid_i(WVALID_i),
.slave_data_i(WDATA_i),
.slave_strb_i(WSTRB_i),
.slave_user_i(WUSER_i),
.slave_last_i(WLAST_i),
.slave_ready_o(WREADY_o),
.master_valid_o(WVALID),
.master_data_o(WDATA),
.master_strb_o(WSTRB),
.master_user_o(WUSER),
.master_last_o(WLAST),
.master_ready_i(WREADY)
);
axi_r_buffer #(
.ID_WIDTH(AXI4_ID_WIDTH),
.DATA_WIDTH(AXI4_RDATA_WIDTH),
.USER_WIDTH(AXI4_USER_WIDTH),
.BUFFER_DEPTH(BUFF_DEPTH_SLAVE)
) Slave_r_buffer(
.clk_i(ACLK),
.rst_ni(ARESETn),
.test_en_i(test_en_i),
.slave_valid_i(RVALID),
.slave_data_i(RDATA),
.slave_resp_i(RRESP),
.slave_user_i(RUSER),
.slave_id_i(RID),
.slave_last_i(RLAST),
.slave_ready_o(RREADY),
.master_valid_o(RVALID_o),
.master_data_o(RDATA_o),
.master_resp_o(RRESP_o),
.master_user_o(RUSER_o),
.master_id_o(RID_o),
.master_last_o(RLAST_o),
.master_ready_i(RREADY_i)
);
axi_b_buffer #(
.ID_WIDTH(AXI4_ID_WIDTH),
.USER_WIDTH(AXI4_USER_WIDTH),
.BUFFER_DEPTH(BUFF_DEPTH_SLAVE)
) Slave_b_buffer(
.clk_i(ACLK),
.rst_ni(ARESETn),
.test_en_i(test_en_i),
.slave_valid_i(BVALID),
.slave_resp_i(BRESP),
.slave_id_i(BID),
.slave_user_i(BUSER),
.slave_ready_o(BREADY),
.master_valid_o(BVALID_o),
.master_resp_o(BRESP_o),
.master_id_o(BID_o),
.master_user_o(BUSER_o),
.master_ready_i(BREADY_i)
);
always @(posedge ACLK or negedge ARESETn)
if (ARESETn == 1'b0) begin
CS <= 4'd0;
ARLEN_Q <= 1'sb0;
AWLEN_Q <= 1'sb0;
RDATA_Q_0 <= 1'sb0;
RDATA_Q_1 <= 1'sb0;
end
else begin
CS <= NS;
if (sample_AR)
ARLEN_Q <= ARLEN + 1;
else if (decr_ARLEN)
ARLEN_Q <= ARLEN_Q - 1'b1;
if (sample_RDATA_0)
RDATA_Q_0 <= PRDATA[TARGET_SLAVE * 32+:32];
if (sample_RDATA_1)
RDATA_Q_1 <= PRDATA[TARGET_SLAVE * 32+:32];
case ({sample_AW, decr_AWLEN})
2'b00: AWLEN_Q <= AWLEN_Q;
2'b01: AWLEN_Q <= AWLEN_Q - 1'b1;
2'b10: AWLEN_Q <= AWLEN + 1;
2'b11: AWLEN_Q <= AWLEN;
endcase
end
always @(*) begin
read_req = 1'b0;
write_req = 1'b0;
W_word_sel = 1'b0;
sample_AW = 1'b0;
decr_AWLEN = 1'b0;
sample_AR = 1'b0;
decr_ARLEN = 1'b0;
sample_RDATA_0 = 1'b0;
sample_RDATA_1 = 1'b0;
ARREADY = 1'b0;
AWREADY = 1'b0;
WREADY = 1'b0;
RDATA = 1'sb0;
BVALID = 1'b0;
BRESP = 2'b00;
BID = AWID;
BUSER = AWUSER;
RVALID = 1'b0;
RLAST = 1'b0;
RID = ARID;
RUSER = ARUSER;
RRESP = 2'b00;
case (CS)
4'd11: begin
sample_AR = 1'b0;
read_req = 1'b1;
address = ARADDR[(((APB_NUM_SLAVES - 1) < 1 ? 0 : ((APB_NUM_SLAVES - 1) < 2 ? 1 : ((APB_NUM_SLAVES - 1) < 4 ? 2 : ((APB_NUM_SLAVES - 1) < 8 ? 3 : ((APB_NUM_SLAVES - 1) < 16 ? 4 : ((APB_NUM_SLAVES - 1) < 32 ? 5 : ((APB_NUM_SLAVES - 1) < 64 ? 6 : ((APB_NUM_SLAVES - 1) < 128 ? 7 : ((APB_NUM_SLAVES - 1) < 256 ? 8 : ((APB_NUM_SLAVES - 1) < 512 ? 9 : ((APB_NUM_SLAVES - 1) < 1024 ? 10 : ((APB_NUM_SLAVES - 1) < 2048 ? 11 : ((APB_NUM_SLAVES - 1) < 4096 ? 12 : ((APB_NUM_SLAVES - 1) < 8192 ? 13 : ((APB_NUM_SLAVES - 1) < 16384 ? 14 : ((APB_NUM_SLAVES - 1) < 32768 ? 15 : ((APB_NUM_SLAVES - 1) < 65536 ? 16 : ((APB_NUM_SLAVES - 1) < 131072 ? 17 : ((APB_NUM_SLAVES - 1) < 262144 ? 18 : ((APB_NUM_SLAVES - 1) < 524288 ? 19 : ((APB_NUM_SLAVES - 1) < 1048576 ? 20 : ((APB_NUM_SLAVES - 1) < 2097152 ? 21 : ((APB_NUM_SLAVES - 1) < 4194304 ? 22 : ((APB_NUM_SLAVES - 1) < 8388608 ? 23 : ((APB_NUM_SLAVES - 1) < 16777216 ? 24 : 25))))))))))))))))))))))))) + APB_ADDR_WIDTH) - 1:0];
if (PREADY[TARGET_SLAVE] == 1'b1) begin
if (ARLEN == 0)
case (ARSIZE)
3: begin
NS = 4'd2;
sample_RDATA_0 = 1'b1;
end
default: begin
NS = 4'd1;
if (ARADDR[2:0] == 4)
sample_RDATA_1 = 1'b1;
else
sample_RDATA_0 = 1'b1;
end
endcase
else begin
NS = 4'd5;
sample_RDATA_0 = 1'b1;
end
end
else
NS = 4'd11;
end
4'd12: begin
address = AWADDR[(((APB_NUM_SLAVES - 1) < 1 ? 0 : ((APB_NUM_SLAVES - 1) < 2 ? 1 : ((APB_NUM_SLAVES - 1) < 4 ? 2 : ((APB_NUM_SLAVES - 1) < 8 ? 3 : ((APB_NUM_SLAVES - 1) < 16 ? 4 : ((APB_NUM_SLAVES - 1) < 32 ? 5 : ((APB_NUM_SLAVES - 1) < 64 ? 6 : ((APB_NUM_SLAVES - 1) < 128 ? 7 : ((APB_NUM_SLAVES - 1) < 256 ? 8 : ((APB_NUM_SLAVES - 1) < 512 ? 9 : ((APB_NUM_SLAVES - 1) < 1024 ? 10 : ((APB_NUM_SLAVES - 1) < 2048 ? 11 : ((APB_NUM_SLAVES - 1) < 4096 ? 12 : ((APB_NUM_SLAVES - 1) < 8192 ? 13 : ((APB_NUM_SLAVES - 1) < 16384 ? 14 : ((APB_NUM_SLAVES - 1) < 32768 ? 15 : ((APB_NUM_SLAVES - 1) < 65536 ? 16 : ((APB_NUM_SLAVES - 1) < 131072 ? 17 : ((APB_NUM_SLAVES - 1) < 262144 ? 18 : ((APB_NUM_SLAVES - 1) < 524288 ? 19 : ((APB_NUM_SLAVES - 1) < 1048576 ? 20 : ((APB_NUM_SLAVES - 1) < 2097152 ? 21 : ((APB_NUM_SLAVES - 1) < 4194304 ? 22 : ((APB_NUM_SLAVES - 1) < 8388608 ? 23 : ((APB_NUM_SLAVES - 1) < 16777216 ? 24 : 25))))))))))))))))))))))))) + APB_ADDR_WIDTH) - 1:0];
write_req = 1'b1;
if (AWADDR[2:0] == 4)
W_word_sel = 1'b1;
else
W_word_sel = 1'b0;
if (PREADY[TARGET_SLAVE] == 1'b1) begin
if (AWLEN == 0) begin : _SINGLE_WRITE_
case (AWSIZE)
3: NS = 4'd10;
default: NS = 4'd9;
endcase
end
else begin
sample_AW = 1'b1;
NS = 4'd7;
end
end
else
NS = 4'd12;
end
4'd0:
if (ARVALID == 1'b1) begin
sample_AR = 1'b1;
read_req = 1'b1;
address = ARADDR[(((APB_NUM_SLAVES - 1) < 1 ? 0 : ((APB_NUM_SLAVES - 1) < 2 ? 1 : ((APB_NUM_SLAVES - 1) < 4 ? 2 : ((APB_NUM_SLAVES - 1) < 8 ? 3 : ((APB_NUM_SLAVES - 1) < 16 ? 4 : ((APB_NUM_SLAVES - 1) < 32 ? 5 : ((APB_NUM_SLAVES - 1) < 64 ? 6 : ((APB_NUM_SLAVES - 1) < 128 ? 7 : ((APB_NUM_SLAVES - 1) < 256 ? 8 : ((APB_NUM_SLAVES - 1) < 512 ? 9 : ((APB_NUM_SLAVES - 1) < 1024 ? 10 : ((APB_NUM_SLAVES - 1) < 2048 ? 11 : ((APB_NUM_SLAVES - 1) < 4096 ? 12 : ((APB_NUM_SLAVES - 1) < 8192 ? 13 : ((APB_NUM_SLAVES - 1) < 16384 ? 14 : ((APB_NUM_SLAVES - 1) < 32768 ? 15 : ((APB_NUM_SLAVES - 1) < 65536 ? 16 : ((APB_NUM_SLAVES - 1) < 131072 ? 17 : ((APB_NUM_SLAVES - 1) < 262144 ? 18 : ((APB_NUM_SLAVES - 1) < 524288 ? 19 : ((APB_NUM_SLAVES - 1) < 1048576 ? 20 : ((APB_NUM_SLAVES - 1) < 2097152 ? 21 : ((APB_NUM_SLAVES - 1) < 4194304 ? 22 : ((APB_NUM_SLAVES - 1) < 8388608 ? 23 : ((APB_NUM_SLAVES - 1) < 16777216 ? 24 : 25))))))))))))))))))))))))) + APB_ADDR_WIDTH) - 1:0];
if (PREADY[TARGET_SLAVE] == 1'b1) begin : _RDATA_AVAILABLE
if (ARLEN == 0)
case (ARSIZE)
3: begin
NS = 4'd2;
sample_RDATA_0 = 1'b1;
end
default: begin
NS = 4'd1;
if (ARADDR[2:0] == 4)
sample_RDATA_1 = 1'b1;
else
sample_RDATA_0 = 1'b1;
end
endcase
else begin
NS = 4'd5;
sample_RDATA_0 = 1'b1;
end
end
else
NS = 4'd11;
end
else if (AWVALID) begin : _VALID_AW_REQ_
address = AWADDR[(((APB_NUM_SLAVES - 1) < 1 ? 0 : ((APB_NUM_SLAVES - 1) < 2 ? 1 : ((APB_NUM_SLAVES - 1) < 4 ? 2 : ((APB_NUM_SLAVES - 1) < 8 ? 3 : ((APB_NUM_SLAVES - 1) < 16 ? 4 : ((APB_NUM_SLAVES - 1) < 32 ? 5 : ((APB_NUM_SLAVES - 1) < 64 ? 6 : ((APB_NUM_SLAVES - 1) < 128 ? 7 : ((APB_NUM_SLAVES - 1) < 256 ? 8 : ((APB_NUM_SLAVES - 1) < 512 ? 9 : ((APB_NUM_SLAVES - 1) < 1024 ? 10 : ((APB_NUM_SLAVES - 1) < 2048 ? 11 : ((APB_NUM_SLAVES - 1) < 4096 ? 12 : ((APB_NUM_SLAVES - 1) < 8192 ? 13 : ((APB_NUM_SLAVES - 1) < 16384 ? 14 : ((APB_NUM_SLAVES - 1) < 32768 ? 15 : ((APB_NUM_SLAVES - 1) < 65536 ? 16 : ((APB_NUM_SLAVES - 1) < 131072 ? 17 : ((APB_NUM_SLAVES - 1) < 262144 ? 18 : ((APB_NUM_SLAVES - 1) < 524288 ? 19 : ((APB_NUM_SLAVES - 1) < 1048576 ? 20 : ((APB_NUM_SLAVES - 1) < 2097152 ? 21 : ((APB_NUM_SLAVES - 1) < 4194304 ? 22 : ((APB_NUM_SLAVES - 1) < 8388608 ? 23 : ((APB_NUM_SLAVES - 1) < 16777216 ? 24 : 25))))))))))))))))))))))))) + APB_ADDR_WIDTH) - 1:0];
if (WVALID) begin : _VALID_W_REQ_
write_req = 1'b1;
if (AWADDR[2:0] == 4)
W_word_sel = 1'b1;
else
W_word_sel = 1'b0;
if (PREADY[TARGET_SLAVE] == 1'b1) begin : _APB_SLAVE_READY_
if (AWLEN == 0) begin : _SINGLE_WRITE_
case (AWSIZE)
3: NS = 4'd10;
default: NS = 4'd9;
endcase
end
else begin : _B_WRITE_
sample_AW = 1'b1;
NS = 4'd7;
end
end
else begin : _APB_SLAVE_NOT_READY_
NS = 4'd12;
end
end
else begin
write_req = 1'b0;
address = 1'sb0;
NS = 4'd0;
end
end
else begin
NS = 4'd0;
address = 1'sb0;
end
4'd10: begin
address = AWADDR[(((APB_NUM_SLAVES - 1) < 1 ? 0 : ((APB_NUM_SLAVES - 1) < 2 ? 1 : ((APB_NUM_SLAVES - 1) < 4 ? 2 : ((APB_NUM_SLAVES - 1) < 8 ? 3 : ((APB_NUM_SLAVES - 1) < 16 ? 4 : ((APB_NUM_SLAVES - 1) < 32 ? 5 : ((APB_NUM_SLAVES - 1) < 64 ? 6 : ((APB_NUM_SLAVES - 1) < 128 ? 7 : ((APB_NUM_SLAVES - 1) < 256 ? 8 : ((APB_NUM_SLAVES - 1) < 512 ? 9 : ((APB_NUM_SLAVES - 1) < 1024 ? 10 : ((APB_NUM_SLAVES - 1) < 2048 ? 11 : ((APB_NUM_SLAVES - 1) < 4096 ? 12 : ((APB_NUM_SLAVES - 1) < 8192 ? 13 : ((APB_NUM_SLAVES - 1) < 16384 ? 14 : ((APB_NUM_SLAVES - 1) < 32768 ? 15 : ((APB_NUM_SLAVES - 1) < 65536 ? 16 : ((APB_NUM_SLAVES - 1) < 131072 ? 17 : ((APB_NUM_SLAVES - 1) < 262144 ? 18 : ((APB_NUM_SLAVES - 1) < 524288 ? 19 : ((APB_NUM_SLAVES - 1) < 1048576 ? 20 : ((APB_NUM_SLAVES - 1) < 2097152 ? 21 : ((APB_NUM_SLAVES - 1) < 4194304 ? 22 : ((APB_NUM_SLAVES - 1) < 8388608 ? 23 : ((APB_NUM_SLAVES - 1) < 16777216 ? 24 : 25))))))))))))))))))))))))) + APB_ADDR_WIDTH) - 1:0] + 4;
W_word_sel = 1'b1;
write_req = WVALID;
if (WVALID) begin
if (PREADY[TARGET_SLAVE] == 1'b1)
NS = 4'd9;
else
NS = 4'd10;
end
else
NS = 4'd10;
end
4'd9: begin
BVALID = 1'b1;
address = 1'sb0;
if (BREADY) begin
NS = 4'd0;
AWREADY = 1'b1;
WREADY = 1'b1;
end
else
NS = 4'd9;
end
4'd7: begin
W_word_sel = 1'b1;
write_req = WVALID;
address = AWADDR[(((APB_NUM_SLAVES - 1) < 1 ? 0 : ((APB_NUM_SLAVES - 1) < 2 ? 1 : ((APB_NUM_SLAVES - 1) < 4 ? 2 : ((APB_NUM_SLAVES - 1) < 8 ? 3 : ((APB_NUM_SLAVES - 1) < 16 ? 4 : ((APB_NUM_SLAVES - 1) < 32 ? 5 : ((APB_NUM_SLAVES - 1) < 64 ? 6 : ((APB_NUM_SLAVES - 1) < 128 ? 7 : ((APB_NUM_SLAVES - 1) < 256 ? 8 : ((APB_NUM_SLAVES - 1) < 512 ? 9 : ((APB_NUM_SLAVES - 1) < 1024 ? 10 : ((APB_NUM_SLAVES - 1) < 2048 ? 11 : ((APB_NUM_SLAVES - 1) < 4096 ? 12 : ((APB_NUM_SLAVES - 1) < 8192 ? 13 : ((APB_NUM_SLAVES - 1) < 16384 ? 14 : ((APB_NUM_SLAVES - 1) < 32768 ? 15 : ((APB_NUM_SLAVES - 1) < 65536 ? 16 : ((APB_NUM_SLAVES - 1) < 131072 ? 17 : ((APB_NUM_SLAVES - 1) < 262144 ? 18 : ((APB_NUM_SLAVES - 1) < 524288 ? 19 : ((APB_NUM_SLAVES - 1) < 1048576 ? 20 : ((APB_NUM_SLAVES - 1) < 2097152 ? 21 : ((APB_NUM_SLAVES - 1) < 4194304 ? 22 : ((APB_NUM_SLAVES - 1) < 8388608 ? 23 : ((APB_NUM_SLAVES - 1) < 16777216 ? 24 : 25))))))))))))))))))))))))) + APB_ADDR_WIDTH) - 1:0];
if (WVALID) begin
if (PREADY[TARGET_SLAVE] == 1'b1) begin
NS = 4'd6;
WREADY = 1'b1;
decr_AWLEN = 1'b1;
end
else
NS = 4'd7;
end
else
NS = 4'd7;
end
4'd6: begin
address = AWADDR[(((APB_NUM_SLAVES - 1) < 1 ? 0 : ((APB_NUM_SLAVES - 1) < 2 ? 1 : ((APB_NUM_SLAVES - 1) < 4 ? 2 : ((APB_NUM_SLAVES - 1) < 8 ? 3 : ((APB_NUM_SLAVES - 1) < 16 ? 4 : ((APB_NUM_SLAVES - 1) < 32 ? 5 : ((APB_NUM_SLAVES - 1) < 64 ? 6 : ((APB_NUM_SLAVES - 1) < 128 ? 7 : ((APB_NUM_SLAVES - 1) < 256 ? 8 : ((APB_NUM_SLAVES - 1) < 512 ? 9 : ((APB_NUM_SLAVES - 1) < 1024 ? 10 : ((APB_NUM_SLAVES - 1) < 2048 ? 11 : ((APB_NUM_SLAVES - 1) < 4096 ? 12 : ((APB_NUM_SLAVES - 1) < 8192 ? 13 : ((APB_NUM_SLAVES - 1) < 16384 ? 14 : ((APB_NUM_SLAVES - 1) < 32768 ? 15 : ((APB_NUM_SLAVES - 1) < 65536 ? 16 : ((APB_NUM_SLAVES - 1) < 131072 ? 17 : ((APB_NUM_SLAVES - 1) < 262144 ? 18 : ((APB_NUM_SLAVES - 1) < 524288 ? 19 : ((APB_NUM_SLAVES - 1) < 1048576 ? 20 : ((APB_NUM_SLAVES - 1) < 2097152 ? 21 : ((APB_NUM_SLAVES - 1) < 4194304 ? 22 : ((APB_NUM_SLAVES - 1) < 8388608 ? 23 : ((APB_NUM_SLAVES - 1) < 16777216 ? 24 : 25))))))))))))))))))))))))) + APB_ADDR_WIDTH) - 1:0];
if (AWLEN_Q == 0) begin : _BURST_COMPLETED_
BVALID = 1'b1;
if (BREADY) begin
NS = 4'd0;
AWREADY = 1'b1;
end
else
NS = 4'd6;
end
else begin : _BUSRST_NOT_COMPLETED_
W_word_sel = 1'b0;
write_req = WVALID;
if (WVALID) begin
if (PREADY[TARGET_SLAVE] == 1'b1)
NS = 4'd7;
else
NS = 4'd6;
end
else
NS = 4'd7;
end
end
4'd5: begin
read_req = 1'b1;
address = ARADDR[(((APB_NUM_SLAVES - 1) < 1 ? 0 : ((APB_NUM_SLAVES - 1) < 2 ? 1 : ((APB_NUM_SLAVES - 1) < 4 ? 2 : ((APB_NUM_SLAVES - 1) < 8 ? 3 : ((APB_NUM_SLAVES - 1) < 16 ? 4 : ((APB_NUM_SLAVES - 1) < 32 ? 5 : ((APB_NUM_SLAVES - 1) < 64 ? 6 : ((APB_NUM_SLAVES - 1) < 128 ? 7 : ((APB_NUM_SLAVES - 1) < 256 ? 8 : ((APB_NUM_SLAVES - 1) < 512 ? 9 : ((APB_NUM_SLAVES - 1) < 1024 ? 10 : ((APB_NUM_SLAVES - 1) < 2048 ? 11 : ((APB_NUM_SLAVES - 1) < 4096 ? 12 : ((APB_NUM_SLAVES - 1) < 8192 ? 13 : ((APB_NUM_SLAVES - 1) < 16384 ? 14 : ((APB_NUM_SLAVES - 1) < 32768 ? 15 : ((APB_NUM_SLAVES - 1) < 65536 ? 16 : ((APB_NUM_SLAVES - 1) < 131072 ? 17 : ((APB_NUM_SLAVES - 1) < 262144 ? 18 : ((APB_NUM_SLAVES - 1) < 524288 ? 19 : ((APB_NUM_SLAVES - 1) < 1048576 ? 20 : ((APB_NUM_SLAVES - 1) < 2097152 ? 21 : ((APB_NUM_SLAVES - 1) < 4194304 ? 22 : ((APB_NUM_SLAVES - 1) < 8388608 ? 23 : ((APB_NUM_SLAVES - 1) < 16777216 ? 24 : 25))))))))))))))))))))))))) + APB_ADDR_WIDTH) - 1:0];
if (PREADY[TARGET_SLAVE] == 1'b1) begin
decr_ARLEN = 1'b1;
sample_RDATA_1 = 1'b1;
NS = 4'd4;
end
else
NS = 4'd5;
end
4'd4: begin
RVALID = 1'b1;
RDATA[0+:32] = RDATA_Q_0;
RDATA[32+:32] = RDATA_Q_1;
RLAST = (ARLEN_Q == 0 ? 1 : 0);
address = ARADDR[(((APB_NUM_SLAVES - 1) < 1 ? 0 : ((APB_NUM_SLAVES - 1) < 2 ? 1 : ((APB_NUM_SLAVES - 1) < 4 ? 2 : ((APB_NUM_SLAVES - 1) < 8 ? 3 : ((APB_NUM_SLAVES - 1) < 16 ? 4 : ((APB_NUM_SLAVES - 1) < 32 ? 5 : ((APB_NUM_SLAVES - 1) < 64 ? 6 : ((APB_NUM_SLAVES - 1) < 128 ? 7 : ((APB_NUM_SLAVES - 1) < 256 ? 8 : ((APB_NUM_SLAVES - 1) < 512 ? 9 : ((APB_NUM_SLAVES - 1) < 1024 ? 10 : ((APB_NUM_SLAVES - 1) < 2048 ? 11 : ((APB_NUM_SLAVES - 1) < 4096 ? 12 : ((APB_NUM_SLAVES - 1) < 8192 ? 13 : ((APB_NUM_SLAVES - 1) < 16384 ? 14 : ((APB_NUM_SLAVES - 1) < 32768 ? 15 : ((APB_NUM_SLAVES - 1) < 65536 ? 16 : ((APB_NUM_SLAVES - 1) < 131072 ? 17 : ((APB_NUM_SLAVES - 1) < 262144 ? 18 : ((APB_NUM_SLAVES - 1) < 524288 ? 19 : ((APB_NUM_SLAVES - 1) < 1048576 ? 20 : ((APB_NUM_SLAVES - 1) < 2097152 ? 21 : ((APB_NUM_SLAVES - 1) < 4194304 ? 22 : ((APB_NUM_SLAVES - 1) < 8388608 ? 23 : ((APB_NUM_SLAVES - 1) < 16777216 ? 24 : 25))))))))))))))))))))))))) + APB_ADDR_WIDTH) - 1:0];
if (RREADY) begin
if (ARLEN_Q == 0) begin : _READ_BURST_COMPLETED_
NS = 4'd0;
ARREADY = 1'b1;
end
else begin : _READ_BUSRST_NOT_COMPLETED_
read_req = 1'b1;
if (PREADY[TARGET_SLAVE] == 1'b1) begin
sample_RDATA_0 = 1'b1;
NS = 4'd5;
end
else
NS = 4'd3;
end
end
else
NS = 4'd4;
end
4'd3: begin
read_req = 1'b1;
address = ARADDR[(((APB_NUM_SLAVES - 1) < 1 ? 0 : ((APB_NUM_SLAVES - 1) < 2 ? 1 : ((APB_NUM_SLAVES - 1) < 4 ? 2 : ((APB_NUM_SLAVES - 1) < 8 ? 3 : ((APB_NUM_SLAVES - 1) < 16 ? 4 : ((APB_NUM_SLAVES - 1) < 32 ? 5 : ((APB_NUM_SLAVES - 1) < 64 ? 6 : ((APB_NUM_SLAVES - 1) < 128 ? 7 : ((APB_NUM_SLAVES - 1) < 256 ? 8 : ((APB_NUM_SLAVES - 1) < 512 ? 9 : ((APB_NUM_SLAVES - 1) < 1024 ? 10 : ((APB_NUM_SLAVES - 1) < 2048 ? 11 : ((APB_NUM_SLAVES - 1) < 4096 ? 12 : ((APB_NUM_SLAVES - 1) < 8192 ? 13 : ((APB_NUM_SLAVES - 1) < 16384 ? 14 : ((APB_NUM_SLAVES - 1) < 32768 ? 15 : ((APB_NUM_SLAVES - 1) < 65536 ? 16 : ((APB_NUM_SLAVES - 1) < 131072 ? 17 : ((APB_NUM_SLAVES - 1) < 262144 ? 18 : ((APB_NUM_SLAVES - 1) < 524288 ? 19 : ((APB_NUM_SLAVES - 1) < 1048576 ? 20 : ((APB_NUM_SLAVES - 1) < 2097152 ? 21 : ((APB_NUM_SLAVES - 1) < 4194304 ? 22 : ((APB_NUM_SLAVES - 1) < 8388608 ? 23 : ((APB_NUM_SLAVES - 1) < 16777216 ? 24 : 25))))))))))))))))))))))))) + APB_ADDR_WIDTH) - 1:0];
if (PREADY[TARGET_SLAVE] == 1'b1) begin
sample_RDATA_0 = 1'b1;
NS = 4'd5;
end
else
NS = 4'd3;
end
4'd1: begin
RVALID = 1'b1;
RDATA[0+:32] = RDATA_Q_0;
RDATA[32+:32] = RDATA_Q_1;
RLAST = 1;
address = 1'sb0;
if (RREADY) begin
NS = 4'd0;
ARREADY = 1'b1;
end
else
NS = 4'd1;
end
4'd2: begin
read_req = 1'b1;
address = ARADDR[(((APB_NUM_SLAVES - 1) < 1 ? 0 : ((APB_NUM_SLAVES - 1) < 2 ? 1 : ((APB_NUM_SLAVES - 1) < 4 ? 2 : ((APB_NUM_SLAVES - 1) < 8 ? 3 : ((APB_NUM_SLAVES - 1) < 16 ? 4 : ((APB_NUM_SLAVES - 1) < 32 ? 5 : ((APB_NUM_SLAVES - 1) < 64 ? 6 : ((APB_NUM_SLAVES - 1) < 128 ? 7 : ((APB_NUM_SLAVES - 1) < 256 ? 8 : ((APB_NUM_SLAVES - 1) < 512 ? 9 : ((APB_NUM_SLAVES - 1) < 1024 ? 10 : ((APB_NUM_SLAVES - 1) < 2048 ? 11 : ((APB_NUM_SLAVES - 1) < 4096 ? 12 : ((APB_NUM_SLAVES - 1) < 8192 ? 13 : ((APB_NUM_SLAVES - 1) < 16384 ? 14 : ((APB_NUM_SLAVES - 1) < 32768 ? 15 : ((APB_NUM_SLAVES - 1) < 65536 ? 16 : ((APB_NUM_SLAVES - 1) < 131072 ? 17 : ((APB_NUM_SLAVES - 1) < 262144 ? 18 : ((APB_NUM_SLAVES - 1) < 524288 ? 19 : ((APB_NUM_SLAVES - 1) < 1048576 ? 20 : ((APB_NUM_SLAVES - 1) < 2097152 ? 21 : ((APB_NUM_SLAVES - 1) < 4194304 ? 22 : ((APB_NUM_SLAVES - 1) < 8388608 ? 23 : ((APB_NUM_SLAVES - 1) < 16777216 ? 24 : 25))))))))))))))))))))))))) + APB_ADDR_WIDTH) - 1:0] + 4;
if (PREADY[TARGET_SLAVE] == 1'b1) begin
NS = 4'd1;
sample_RDATA_1 = 1'b1;
end
else
NS = 4'd2;
end
default: begin
NS = 4'd0;
address = 0;
end
endcase
end
endmodule