Skip to content

Commit 18d6277

Browse files
committed
[+] Update AXI inteconnect to support multiple masters to a different slaves at the same time. Implemented like a real interconnect
[!] Slave interface axi_slv treats AXI Light requests as an AXI Full requests, no AW/W accepted at the same time [*] Default (unmapped) slave device has its slot in config file
1 parent a0e5f4e commit 18d6277

File tree

7 files changed

+241
-140
lines changed

7 files changed

+241
-140
lines changed

sv/rtl/internal/ambalib/apb_slv.sv

Lines changed: 13 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@
1717
`timescale 1ns/10ps
1818

1919
module apb_slv #(
20-
parameter bit async_reset = 1'b0,
20+
parameter logic async_reset = 1'b0,
2121
parameter int unsigned vid = 0, // Vendor ID
2222
parameter int unsigned did = 0 // Device ID
2323
)
@@ -41,7 +41,8 @@ import types_amba_pkg::*;
4141
import types_pnp_pkg::*;
4242
import apb_slv_pkg::*;
4343

44-
apb_slv_registers r, rin;
44+
apb_slv_registers r;
45+
apb_slv_registers rin;
4546

4647

4748
always_comb
@@ -51,12 +52,11 @@ begin: comb_proc
5152
dev_config_type vcfg;
5253
apb_out_type vapbo;
5354

55+
v = r;
5456
vb_rdata = '0;
5557
vcfg = dev_config_none;
5658
vapbo = apb_out_none;
5759

58-
v = r;
59-
6060
vcfg.descrsize = PNP_CFG_DEV_DESCR_BYTES;
6161
vcfg.descrtype = PNP_CFG_TYPE_SLAVE;
6262
vcfg.addr_start = i_mapinfo.addr_start;
@@ -100,7 +100,7 @@ begin: comb_proc
100100
end
101101
endcase
102102

103-
if (~async_reset && i_nrst == 1'b0) begin
103+
if ((~async_reset) && (i_nrst == 1'b0)) begin
104104
v = apb_slv_r_reset;
105105
end
106106

@@ -118,26 +118,25 @@ begin: comb_proc
118118
rin = v;
119119
end: comb_proc
120120

121-
122121
generate
123-
if (async_reset) begin: async_rst_gen
122+
if (async_reset) begin: async_r_en
124123

125-
always_ff @(posedge i_clk, negedge i_nrst) begin: rg_proc
124+
always_ff @(posedge i_clk, negedge i_nrst) begin
126125
if (i_nrst == 1'b0) begin
127126
r <= apb_slv_r_reset;
128127
end else begin
129128
r <= rin;
130129
end
131-
end: rg_proc
130+
end
132131

133-
end: async_rst_gen
134-
else begin: no_rst_gen
132+
end: async_r_en
133+
else begin: async_r_dis
135134

136-
always_ff @(posedge i_clk) begin: rg_proc
135+
always_ff @(posedge i_clk) begin
137136
r <= rin;
138-
end: rg_proc
137+
end
139138

140-
end: no_rst_gen
139+
end: async_r_dis
141140
endgenerate
142141

143142
endmodule: apb_slv

sv/rtl/internal/ambalib/apb_slv_pkg.sv

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -44,5 +44,4 @@ const apb_slv_registers apb_slv_r_reset = '{
4444
'0, // resp_rdata
4545
1'b0 // resp_err
4646
};
47-
4847
endpackage: apb_slv_pkg

sv/rtl/internal/ambalib/axi_dma.sv

Lines changed: 13 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -19,15 +19,16 @@
1919
module axi_dma #(
2020
parameter int abits = 48, // adress bits used
2121
parameter logic async_reset = 1'b0,
22-
parameter int userbits = 1
22+
parameter int userbits = 1,
23+
parameter logic [63:0] base_offset = '0 // Address offset for all DMA transactions
2324
)
2425
(
2526
input logic i_nrst, // Reset: active LOW
2627
input logic i_clk, // CPU clock
2728
output logic o_req_mem_ready, // Ready to accept next data
2829
input logic i_req_mem_valid, // Request data is ready to accept
2930
input logic i_req_mem_write, // 0=read; 1=write operation
30-
input logic [9:0] i_req_mem_bytes, // 0=1024 B; 4=DWORD; 8=QWORD; ...
31+
input logic [11:0] i_req_mem_bytes, // 0=4096 B; 4=DWORD; 8=QWORD; ...
3132
input logic [abits-1:0] i_req_mem_addr, // Address to read/write
3233
input logic [7:0] i_req_mem_strob, // Byte enabling write strob
3334
input logic [63:0] i_req_mem_data, // Data to write
@@ -108,7 +109,7 @@ axi_dma_registers rin;
108109
always_comb
109110
begin: comb_proc
110111
axi_dma_registers v;
111-
logic [9:0] vb_req_mem_bytes_m1;
112+
logic [11:0] vb_req_mem_bytes_m1;
112113
logic [CFG_SYSBUS_ADDR_BITS-1:0] vb_req_addr_inc;
113114
logic [CFG_SYSBUS_DATA_BITS-1:0] vb_r_data_swap;
114115
axi4_master_out_type vmsto;
@@ -124,7 +125,7 @@ begin: comb_proc
124125

125126
// Byte swapping:
126127
if (r.req_size == 3'd0) begin
127-
vb_req_addr_inc[9: 0] = (r.req_addr[9: 0] + 10'h001);
128+
vb_req_addr_inc[11: 0] = (r.req_addr[11: 0] + 12'h001);
128129
if (r.req_addr[2: 0] == 3'd0) begin
129130
vb_r_data_swap[31: 0] = {i_msti.r_data[7: 0], i_msti.r_data[7: 0], i_msti.r_data[7: 0], i_msti.r_data[7: 0]};
130131
end else if (r.req_addr[2: 0] == 3'd1) begin
@@ -144,7 +145,7 @@ begin: comb_proc
144145
end
145146
vb_r_data_swap[63: 32] = vb_r_data_swap[31: 0];
146147
end else if (r.req_size == 3'd1) begin
147-
vb_req_addr_inc[9: 0] = (r.req_addr[9: 0] + 10'h002);
148+
vb_req_addr_inc[11: 0] = (r.req_addr[11: 0] + 12'h002);
148149
if (r.req_addr[2: 1] == 2'd0) begin
149150
vb_r_data_swap = {i_msti.r_data[15: 0], i_msti.r_data[15: 0], i_msti.r_data[15: 0], i_msti.r_data[15: 0]};
150151
end else if (r.req_addr[2: 1] == 2'd1) begin
@@ -155,14 +156,14 @@ begin: comb_proc
155156
vb_r_data_swap = {i_msti.r_data[63: 48], i_msti.r_data[63: 48], i_msti.r_data[63: 48], i_msti.r_data[63: 48]};
156157
end
157158
end else if (r.req_size == 3'd2) begin
158-
vb_req_addr_inc[9: 0] = (r.req_addr[9: 0] + 10'h004);
159+
vb_req_addr_inc[11: 0] = (r.req_addr[11: 0] + 12'h004);
159160
if (r.req_addr[2] == 1'b0) begin
160161
vb_r_data_swap = {i_msti.r_data[31: 0], i_msti.r_data[31: 0]};
161162
end else begin
162163
vb_r_data_swap = {i_msti.r_data[63: 32], i_msti.r_data[63: 32]};
163164
end
164165
end else begin
165-
vb_req_addr_inc[9: 0] = (r.req_addr[9: 0] + 10'h008);
166+
vb_req_addr_inc[11: 0] = (r.req_addr[11: 0] + 12'h008);
166167
vb_r_data_swap = i_msti.r_data;
167168
end
168169

@@ -174,19 +175,19 @@ begin: comb_proc
174175
v.resp_last = 1'b0;
175176
if (i_req_mem_valid == 1'b1) begin
176177
v.req_ready = 1'b0;
177-
v.req_addr = {'0, i_req_mem_addr};
178-
if (i_req_mem_bytes == 10'd1) begin
178+
v.req_addr = {base_offset[(CFG_SYSBUS_ADDR_BITS - 1): abits], i_req_mem_addr};
179+
if (i_req_mem_bytes == 12'd1) begin
179180
v.req_size = 3'd0;
180181
v.req_len = 8'd0;
181-
end else if (i_req_mem_bytes == 10'd2) begin
182+
end else if (i_req_mem_bytes == 12'd2) begin
182183
v.req_size = 3'd1;
183184
v.req_len = 8'd0;
184-
end else if (i_req_mem_bytes == 10'd4) begin
185+
end else if (i_req_mem_bytes == 12'd4) begin
185186
v.req_size = 3'd2;
186187
v.req_len = 8'd0;
187188
end else begin
188189
v.req_size = 3'd3;
189-
v.req_len = {1'b0, vb_req_mem_bytes_m1[9: 3]};
190+
v.req_len = vb_req_mem_bytes_m1[10: 3];
190191
end
191192
if (i_req_mem_write == 1'b0) begin
192193
v.ar_valid = 1'b1;
@@ -206,7 +207,6 @@ begin: comb_proc
206207
// debug interface:
207208
v.dbg_payload = {1'b1,
208209
i_req_mem_addr[10: 0],
209-
2'h0,
210210
i_req_mem_bytes,
211211
i_req_mem_strob,
212212
i_req_mem_data[31: 0]};

0 commit comments

Comments
 (0)