Skip to content

Commit cd04141

Browse files
tausenronagyl
authored andcommitted
axi_dmac: Add parameter controlling AWCACHE
On architectures with ports that support cache coherency, the AWCACHE signal must be set to indicate that transactions are cached. This patch adds a parameter allowing AWCACHE to be set on an AXI4 destination port.
1 parent 0ae2a17 commit cd04141

File tree

7 files changed

+40
-13
lines changed

7 files changed

+40
-13
lines changed

library/axi_dmac/address_generator.v

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,8 @@ module address_generator #(
4242
parameter DMA_ADDR_WIDTH = 32,
4343
parameter BEATS_PER_BURST_WIDTH = 4,
4444
parameter BYTES_PER_BEAT_WIDTH = $clog2(DMA_DATA_WIDTH/8),
45-
parameter LENGTH_WIDTH = 8)(
45+
parameter LENGTH_WIDTH = 8,
46+
parameter CACHE_COHERENT = 0)(
4647

4748
input clk,
4849
input resetn,
@@ -80,7 +81,9 @@ localparam MAX_LENGTH = {BEATS_PER_BURST_WIDTH{1'b1}};
8081

8182
assign burst = 2'b01;
8283
assign prot = 3'b000;
83-
assign cache = 4'b0011;
84+
// If CACHE_COHERENT is set, signal downstream that this transaction must be
85+
// looked up in cache. Otherwise default to "normal non-cachable bufferable".
86+
assign cache = CACHE_COHERENT ? 4'b1110 : 4'b0011;
8487
assign size = DMA_DATA_WIDTH == 1024 ? 3'b111 :
8588
DMA_DATA_WIDTH == 512 ? 3'b110 :
8689
DMA_DATA_WIDTH == 256 ? 3'b101 :

library/axi_dmac/axi_dmac.v

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -62,7 +62,8 @@ module axi_dmac #(
6262
parameter DMA_AXIS_DEST_W = 4,
6363
parameter DISABLE_DEBUG_REGISTERS = 0,
6464
parameter ENABLE_DIAGNOSTICS_IF = 0,
65-
parameter ALLOW_ASYM_MEM = 0
65+
parameter ALLOW_ASYM_MEM = 0,
66+
parameter CACHE_COHERENT_DEST = 0
6667
) (
6768
// Slave AXI interface
6869
input s_axi_aclk,
@@ -407,7 +408,8 @@ axi_dmac_regmap #(
407408
.HAS_DEST_ADDR(HAS_DEST_ADDR),
408409
.HAS_SRC_ADDR(HAS_SRC_ADDR),
409410
.DMA_2D_TRANSFER(DMA_2D_TRANSFER),
410-
.SYNC_TRANSFER_START(SYNC_TRANSFER_START)
411+
.SYNC_TRANSFER_START(SYNC_TRANSFER_START),
412+
.CACHE_COHERENT_DEST(CACHE_COHERENT_DEST)
411413
) i_regmap (
412414
.s_axi_aclk(s_axi_aclk),
413415
.s_axi_aresetn(s_axi_aresetn),
@@ -489,7 +491,8 @@ axi_dmac_transfer #(
489491
.AXI_LENGTH_WIDTH_SRC(8-(4*DMA_AXI_PROTOCOL_SRC)),
490492
.AXI_LENGTH_WIDTH_DEST(8-(4*DMA_AXI_PROTOCOL_DEST)),
491493
.ENABLE_DIAGNOSTICS_IF(ENABLE_DIAGNOSTICS_IF),
492-
.ALLOW_ASYM_MEM(ALLOW_ASYM_MEM)
494+
.ALLOW_ASYM_MEM(ALLOW_ASYM_MEM),
495+
.CACHE_COHERENT_DEST(CACHE_COHERENT_DEST)
493496
) i_transfer (
494497
.ctrl_clk(s_axi_aclk),
495498
.ctrl_resetn(s_axi_aresetn),

library/axi_dmac/axi_dmac_ip.tcl

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -239,6 +239,7 @@ foreach {k v} { \
239239
"AXI_SLICE_DEST" "false" \
240240
"DISABLE_DEBUG_REGISTERS" "false" \
241241
"ENABLE_DIAGNOSTICS_IF" "false" \
242+
"CACHE_COHERENT_DEST" "false" \
242243
} { \
243244
set_property -dict [list \
244245
"value_format" "bool" \
@@ -326,6 +327,18 @@ set_property -dict [list \
326327
"display_name" "Transfer Start Synchronization Support" \
327328
] $p
328329

330+
set p [ipgui::get_guiparamspec -name "CACHE_COHERENT_DEST" -component $cc]
331+
ipgui::move_param -component $cc -order 4 $p -parent $dest_group
332+
set_property -dict [list \
333+
"tooltip" "Assume destination port ensures cache coherency (e.g. Ultrascale HPC port)" \
334+
] $p
335+
set_property -dict [list \
336+
"display_name" "Assume cache coherent" \
337+
"enablement_tcl_expr" "\$DMA_TYPE_DEST == 0 && \$DMA_AXI_PROTOCOL_DEST == 0" \
338+
"value_tcl_expr" "\$DMA_TYPE_DEST == 0 && \$DMA_AXI_PROTOCOL_DEST == 0" \
339+
"enablement_value" "false" \
340+
] [ipx::get_user_parameters CACHE_COHERENT_DEST -of_objects $cc]
341+
329342
set general_group [ipgui::add_group -name "General Configuration" -component $cc \
330343
-parent $page0 -display_name "General Configuration"]
331344

library/axi_dmac/axi_dmac_regmap.v

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,8 @@ module axi_dmac_regmap #(
5050
parameter HAS_DEST_ADDR = 1,
5151
parameter HAS_SRC_ADDR = 1,
5252
parameter DMA_2D_TRANSFER = 0,
53-
parameter SYNC_TRANSFER_START = 0
53+
parameter SYNC_TRANSFER_START = 0,
54+
parameter CACHE_COHERENT_DEST = 0
5455
) (
5556
// Slave AXI interface
5657
input s_axi_aclk,
@@ -114,7 +115,7 @@ module axi_dmac_regmap #(
114115
input [31:0] dbg_ids1
115116
);
116117

117-
localparam PCORE_VERSION = 'h00040361;
118+
localparam PCORE_VERSION = 'h00040461;
118119

119120
// Register interface signals
120121
reg [31:0] up_rdata = 32'h00;
@@ -205,6 +206,7 @@ always @(posedge s_axi_aclk) begin
205206
4'b0,BYTES_PER_BURST_WIDTH[3:0],
206207
2'b0,DMA_TYPE_SRC[1:0],BYTES_PER_BEAT_WIDTH_SRC[3:0],
207208
2'b0,DMA_TYPE_DEST[1:0],BYTES_PER_BEAT_WIDTH_DEST[3:0]};
209+
9'h005: up_rdata <= {31'd0, CACHE_COHERENT_DEST};
208210
9'h020: up_rdata <= up_irq_mask;
209211
9'h021: up_rdata <= up_irq_pending;
210212
9'h022: up_rdata <= up_irq_source;

library/axi_dmac/axi_dmac_transfer.v

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -58,7 +58,8 @@ module axi_dmac_transfer #(
5858
parameter AXI_LENGTH_WIDTH_SRC = 8,
5959
parameter AXI_LENGTH_WIDTH_DEST = 8,
6060
parameter ENABLE_DIAGNOSTICS_IF = 0,
61-
parameter ALLOW_ASYM_MEM = 0
61+
parameter ALLOW_ASYM_MEM = 0,
62+
parameter CACHE_COHERENT_DEST = 0
6263
) (
6364
input ctrl_clk,
6465
input ctrl_resetn,
@@ -337,7 +338,8 @@ request_arb #(
337338
.AXI_LENGTH_WIDTH_DEST (AXI_LENGTH_WIDTH_DEST),
338339
.AXI_LENGTH_WIDTH_SRC (AXI_LENGTH_WIDTH_SRC),
339340
.ENABLE_DIAGNOSTICS_IF(ENABLE_DIAGNOSTICS_IF),
340-
.ALLOW_ASYM_MEM (ALLOW_ASYM_MEM)
341+
.ALLOW_ASYM_MEM (ALLOW_ASYM_MEM),
342+
.CACHE_COHERENT_DEST(CACHE_COHERENT_DEST)
341343
) i_request_arb (
342344
.req_clk (req_clk),
343345
.req_resetn (req_resetn),

library/axi_dmac/dest_axi_mm.v

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,8 @@ module dest_axi_mm #(
4444
parameter BEATS_PER_BURST_WIDTH = 4,
4545
parameter MAX_BYTES_PER_BURST = 128,
4646
parameter BYTES_PER_BURST_WIDTH = $clog2(MAX_BYTES_PER_BURST),
47-
parameter AXI_LENGTH_WIDTH = 8)(
47+
parameter AXI_LENGTH_WIDTH = 8,
48+
parameter CACHE_COHERENT = 0)(
4849

4950
input m_axi_aclk,
5051
input m_axi_aresetn,
@@ -115,7 +116,8 @@ address_generator #(
115116
.BYTES_PER_BEAT_WIDTH(BYTES_PER_BEAT_WIDTH),
116117
.DMA_DATA_WIDTH(DMA_DATA_WIDTH),
117118
.LENGTH_WIDTH(AXI_LENGTH_WIDTH),
118-
.DMA_ADDR_WIDTH(DMA_ADDR_WIDTH)
119+
.DMA_ADDR_WIDTH(DMA_ADDR_WIDTH),
120+
.CACHE_COHERENT(CACHE_COHERENT)
119121
) i_addr_gen (
120122
.clk(m_axi_aclk),
121123
.resetn(m_axi_aresetn),

library/axi_dmac/request_arb.v

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -57,7 +57,8 @@ module request_arb #(
5757
parameter AXI_LENGTH_WIDTH_SRC = 8,
5858
parameter AXI_LENGTH_WIDTH_DEST = 8,
5959
parameter ENABLE_DIAGNOSTICS_IF = 0,
60-
parameter ALLOW_ASYM_MEM = 0
60+
parameter ALLOW_ASYM_MEM = 0,
61+
parameter CACHE_COHERENT_DEST = 0
6162
)(
6263
input req_clk,
6364
input req_resetn,
@@ -361,7 +362,8 @@ dest_axi_mm #(
361362
.BYTES_PER_BEAT_WIDTH(BYTES_PER_BEAT_WIDTH_DEST),
362363
.MAX_BYTES_PER_BURST(MAX_BYTES_PER_BURST),
363364
.BYTES_PER_BURST_WIDTH(BYTES_PER_BURST_WIDTH),
364-
.AXI_LENGTH_WIDTH(AXI_LENGTH_WIDTH_DEST)
365+
.AXI_LENGTH_WIDTH(AXI_LENGTH_WIDTH_DEST),
366+
.CACHE_COHERENT(CACHE_COHERENT_DEST)
365367
) i_dest_dma_mm (
366368
.m_axi_aclk(m_dest_axi_aclk),
367369
.m_axi_aresetn(dest_resetn),

0 commit comments

Comments
 (0)