Skip to content

Commit 1525023

Browse files
authored
axi_dmac: Fix constraints coverage and empty to list warnings
Due to nets being optimized at IP-level during the no-OOC synthesis flow, constraints related to req_clk (request clock) were not being applied, causing the design to not meet timing. The fix considers the synchronous modes, appending the possible resulting req_clk's names after the synthesis flow. Due to grounded signals in the DMA_TYPE_SRC != DMA_TYPE_STREAM_AXI config., sync_rewind is removed during synthesis, even so, constraints were trying to be applied to those nets. To resolve this, sync_rewind block was moved to inside the generate. Vivado seems to properly suppress "Empty list" warnings when the circuit does not exist because of a generate rule. Signed-off-by: Jorge Marques <jorge.marques@analog.com> Signed-off-by: Ionut Podgoreanu <ionut.podgoreanu@analog.com>
1 parent 8b15d66 commit 1525023

File tree

2 files changed

+42
-23
lines changed

2 files changed

+42
-23
lines changed

library/axi_dmac/axi_dmac_constr.ttcl

Lines changed: 21 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -8,9 +8,27 @@
88
<: set async_src_dest [getBooleanValue "ASYNC_CLK_SRC_DEST"] :>
99
<: set disable_debug_registers [getBooleanValue "DISABLE_DEBUG_REGISTERS"] :>
1010

11-
set req_clk [get_clocks -of_objects [get_ports s_axi_aclk]]
12-
set src_clk [get_clocks -of_objects [get_ports -quiet {fifo_wr_clk s_axis_aclk m_src_axi_aclk}]]
13-
set dest_clk [get_clocks -of_objects [get_ports -quiet {fifo_rd_clk m_axis_aclk m_dest_axi_aclk}]]
11+
set req_clk_ports_base {s_axi_aclk}
12+
set src_clk_ports_base {fifo_wr_clk s_axis_aclk m_src_axi_aclk}
13+
set dest_clk_ports_base {fifo_rd_clk m_axis_aclk m_dest_axi_aclk}
14+
set req_clk_ports $req_clk_ports_base
15+
set src_clk_ports $src_clk_ports_base
16+
set dest_clk_ports $dest_clk_ports_base
17+
<: if {[expr {!$async_req_src}]} { :>
18+
set req_clk_ports "$req_clk_ports $src_clk_ports_base"
19+
set src_clk_ports "$src_clk_ports $req_clk_ports_base"
20+
<: } :>
21+
<: if {[expr {!$async_src_dest}]} { :>
22+
set src_clk_ports "$src_clk_ports $dest_clk_ports_base"
23+
set dest_clk_ports "$dest_clk_ports $src_clk_ports_base"
24+
<: } :>
25+
<: if {[expr {!$async_dest_req}]} { :>
26+
set req_clk_ports "$req_clk_ports $dest_clk_ports_base"
27+
set dest_clk_ports "$dest_clk_ports $req_clk_ports_base"
28+
<: } :>
29+
set req_clk [get_clocks -of_objects [get_ports -quiet $req_clk_ports]]
30+
set src_clk [get_clocks -of_objects [get_ports -quiet $src_clk_ports]]
31+
set dest_clk [get_clocks -of_objects [get_ports -quiet $dest_clk_ports]]
1432

1533
<: if {$async_req_src || $async_src_dest || $async_dest_req} { :>
1634
set_property ASYNC_REG TRUE \

library/axi_dmac/request_arb.v

Lines changed: 21 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
// ***************************************************************************
22
// ***************************************************************************
3-
// Copyright 2014 - 2017 (c) Analog Devices, Inc. All rights reserved.
3+
// Copyright 2014 - 2023 (c) Analog Devices, Inc. All rights reserved.
44
//
55
// In this HDL repository, there are many different and unique modules, consisting
66
// of various HDL (Verilog or VHDL) components. The individual modules are
@@ -309,7 +309,6 @@ module request_arb #(
309309
wire [ID_WIDTH+3-1:0] rewind_req_data;
310310

311311
reg src_throttler_enabled = 1'b1;
312-
wire src_throttler_enable;
313312
wire rewind_state;
314313

315314
/* Unused for now
@@ -772,6 +771,26 @@ module request_arb #(
772771
.m_axis_level(),
773772
.m_axis_empty());
774773

774+
wire src_throttler_enable;
775+
776+
sync_event #(
777+
.ASYNC_CLK(ASYNC_CLK_REQ_SRC)
778+
) sync_rewind (
779+
.in_clk(req_clk),
780+
.in_event(rewind_state),
781+
.out_clk(src_clk),
782+
.out_event(src_throttler_enable));
783+
784+
always @(posedge src_clk) begin
785+
if (src_resetn == 1'b0) begin
786+
src_throttler_enabled <= 'b1;
787+
end else if (rewind_req_valid) begin
788+
src_throttler_enabled <= 'b0;
789+
end else if (src_throttler_enable) begin
790+
src_throttler_enabled <= 'b1;
791+
end
792+
end
793+
775794
end else begin
776795

777796
assign s_axis_ready = 1'b0;
@@ -878,24 +897,6 @@ module request_arb #(
878897
end
879898
endfunction
880899

881-
sync_event #(
882-
.ASYNC_CLK(ASYNC_CLK_REQ_SRC)
883-
) sync_rewind (
884-
.in_clk(req_clk),
885-
.in_event(rewind_state),
886-
.out_clk(src_clk),
887-
.out_event(src_throttler_enable));
888-
889-
always @(posedge src_clk) begin
890-
if (src_resetn == 1'b0) begin
891-
src_throttler_enabled <= 'b1;
892-
end else if (rewind_req_valid) begin
893-
src_throttler_enabled <= 'b0;
894-
end else if (src_throttler_enable) begin
895-
src_throttler_enabled <= 'b1;
896-
end
897-
end
898-
899900
/*
900901
* Make sure that we do not request more data than what fits into the
901902
* store-and-forward burst memory.

0 commit comments

Comments
 (0)