2023-07-06 12:08:22 +00:00
|
|
|
###############################################################################
|
|
|
|
## Copyright (C) 2015-2023 Analog Devices, Inc. All rights reserved.
|
|
|
|
### SPDX short identifier: ADIBSD
|
|
|
|
###############################################################################
|
|
|
|
|
2015-09-15 16:58:40 +00:00
|
|
|
<: set ComponentName [getComponentNameString] :>
|
|
|
|
<: setOutputDirectory "./" :>
|
|
|
|
<: setFileName [ttcl_add $ComponentName "_constr"] :>
|
|
|
|
<: setFileExtension ".xdc" :>
|
|
|
|
<: setFileProcessingOrder late :>
|
|
|
|
<: set async_dest_req [getBooleanValue "ASYNC_CLK_DEST_REQ"] :>
|
|
|
|
<: set async_req_src [getBooleanValue "ASYNC_CLK_REQ_SRC"] :>
|
|
|
|
<: set async_src_dest [getBooleanValue "ASYNC_CLK_SRC_DEST"] :>
|
axi_dmac: Add support for DMA Scatter-Gather
This commit introduces a different interface to submit transfers, using
DMA descriptors.
The structure of the DMA descriptor is as follows:
struct dma_desc {
u32 flags,
u32 id,
u64 dest_addr,
u64 src_addr,
u64 next_sg_addr,
u32 y_len,
u32 x_len,
u32 src_stride,
u32 dst_stride,
};
The 'flags' field currently offers two control bits:
- bit 0: if set, the transfer will complete after this last descriptor
is processed, and the DMA core will go back to idle state; if cleared,
the next DMA descriptor pointed to by 'next_sg_addr' will be loaded.
- bit 1: if set, an end-of-transfer interrupt will be raised after the
memory segment pointed to by this descriptor has been transferred.
The 'id' field corresponds to an identifier of the descriptor.
The 'dest_addr' and 'src_addr' contain the destination and source
addresses to use for the transfer, respectively.
The 'x_len' field contains the number of bytes to transfer,
minus one.
The 'y_len', 'src_stride' and 'dst_stride' fields are only useful for
2D transfers, and should be set to zero if 2D transfers are not
required.
To start a transfer, the address of the first DMA descriptor must be
written to register 0x47c and the HWDESC bit of CONTROL register must
be set. The Scatter-Gather transfer is queued similarly to the simple
transfers, by writing 1 in TRANSFER_SUBMIT.
The Scatter-Gather interface has a dedicated AXI-MM bus configured for
read transfers, with its own dedicated clock, which can be asynchronous.
The Scatter-Gather reset is generated by the reset manager to reset the
logic after completing any pending transactions on the bus.
When the Scatter-Gather is enabled during runtime, the legacy cyclic
functionality of the DMA is disabled.
Signed-off-by: Ionut Podgoreanu <ionut.podgoreanu@analog.com>
2023-08-10 10:10:24 +00:00
|
|
|
<: set async_req_sg [getBooleanValue "ASYNC_CLK_REQ_SG"] :>
|
|
|
|
<: set async_src_sg [getBooleanValue "ASYNC_CLK_SRC_SG"] :>
|
|
|
|
<: set async_dest_sg [getBooleanValue "ASYNC_CLK_DEST_SG"] :>
|
|
|
|
<: set sg_enabled [getBooleanValue "DMA_SG_TRANSFER"] :>
|
2017-03-30 14:00:51 +00:00
|
|
|
<: set disable_debug_registers [getBooleanValue "DISABLE_DEBUG_REGISTERS"] :>
|
2015-09-15 16:58:40 +00:00
|
|
|
|
2023-07-10 12:28:59 +00:00
|
|
|
set req_clk_ports_base {s_axi_aclk}
|
|
|
|
set src_clk_ports_base {fifo_wr_clk s_axis_aclk m_src_axi_aclk}
|
|
|
|
set dest_clk_ports_base {fifo_rd_clk m_axis_aclk m_dest_axi_aclk}
|
|
|
|
set req_clk_ports $req_clk_ports_base
|
|
|
|
set src_clk_ports $src_clk_ports_base
|
|
|
|
set dest_clk_ports $dest_clk_ports_base
|
|
|
|
<: if {[expr {!$async_req_src}]} { :>
|
|
|
|
set req_clk_ports "$req_clk_ports $src_clk_ports_base"
|
|
|
|
set src_clk_ports "$src_clk_ports $req_clk_ports_base"
|
|
|
|
<: } :>
|
|
|
|
<: if {[expr {!$async_src_dest}]} { :>
|
|
|
|
set src_clk_ports "$src_clk_ports $dest_clk_ports_base"
|
|
|
|
set dest_clk_ports "$dest_clk_ports $src_clk_ports_base"
|
|
|
|
<: } :>
|
|
|
|
<: if {[expr {!$async_dest_req}]} { :>
|
|
|
|
set req_clk_ports "$req_clk_ports $dest_clk_ports_base"
|
|
|
|
set dest_clk_ports "$dest_clk_ports $req_clk_ports_base"
|
|
|
|
<: } :>
|
axi_dmac: Add support for DMA Scatter-Gather
This commit introduces a different interface to submit transfers, using
DMA descriptors.
The structure of the DMA descriptor is as follows:
struct dma_desc {
u32 flags,
u32 id,
u64 dest_addr,
u64 src_addr,
u64 next_sg_addr,
u32 y_len,
u32 x_len,
u32 src_stride,
u32 dst_stride,
};
The 'flags' field currently offers two control bits:
- bit 0: if set, the transfer will complete after this last descriptor
is processed, and the DMA core will go back to idle state; if cleared,
the next DMA descriptor pointed to by 'next_sg_addr' will be loaded.
- bit 1: if set, an end-of-transfer interrupt will be raised after the
memory segment pointed to by this descriptor has been transferred.
The 'id' field corresponds to an identifier of the descriptor.
The 'dest_addr' and 'src_addr' contain the destination and source
addresses to use for the transfer, respectively.
The 'x_len' field contains the number of bytes to transfer,
minus one.
The 'y_len', 'src_stride' and 'dst_stride' fields are only useful for
2D transfers, and should be set to zero if 2D transfers are not
required.
To start a transfer, the address of the first DMA descriptor must be
written to register 0x47c and the HWDESC bit of CONTROL register must
be set. The Scatter-Gather transfer is queued similarly to the simple
transfers, by writing 1 in TRANSFER_SUBMIT.
The Scatter-Gather interface has a dedicated AXI-MM bus configured for
read transfers, with its own dedicated clock, which can be asynchronous.
The Scatter-Gather reset is generated by the reset manager to reset the
logic after completing any pending transactions on the bus.
When the Scatter-Gather is enabled during runtime, the legacy cyclic
functionality of the DMA is disabled.
Signed-off-by: Ionut Podgoreanu <ionut.podgoreanu@analog.com>
2023-08-10 10:10:24 +00:00
|
|
|
<: if {$sg_enabled} { :>
|
|
|
|
set sg_clk_ports_base {m_sg_axi_aclk}
|
|
|
|
set sg_clk_ports $sg_clk_ports_base
|
|
|
|
<: if {[expr {!$async_req_sg}]} { :>
|
|
|
|
set req_clk_ports "$req_clk_ports $sg_clk_ports_base"
|
|
|
|
set sg_clk_ports "$sg_clk_ports $req_clk_ports_base"
|
|
|
|
<: } :>
|
|
|
|
<: if {[expr {!$async_src_sg}]} { :>
|
|
|
|
set src_clk_ports "$src_clk_ports $sg_clk_ports_base"
|
|
|
|
set sg_clk_ports "$sg_clk_ports $src_clk_ports_base"
|
|
|
|
<: } :>
|
|
|
|
<: if {[expr {!$async_dest_sg}]} { :>
|
|
|
|
set dest_clk_ports "$dest_clk_ports $sg_clk_ports_base"
|
|
|
|
set sg_clk_ports "$sg_clk_ports $dest_clk_ports_base"
|
|
|
|
<: } :>
|
|
|
|
set sg_clk [get_clocks -of_objects [get_ports -quiet $sg_clk_ports]]
|
|
|
|
<: } :>
|
2023-07-10 12:28:59 +00:00
|
|
|
set req_clk [get_clocks -of_objects [get_ports -quiet $req_clk_ports]]
|
|
|
|
set src_clk [get_clocks -of_objects [get_ports -quiet $src_clk_ports]]
|
|
|
|
set dest_clk [get_clocks -of_objects [get_ports -quiet $dest_clk_ports]]
|
2015-09-15 16:58:40 +00:00
|
|
|
|
axi_dmac: Add support for DMA Scatter-Gather
This commit introduces a different interface to submit transfers, using
DMA descriptors.
The structure of the DMA descriptor is as follows:
struct dma_desc {
u32 flags,
u32 id,
u64 dest_addr,
u64 src_addr,
u64 next_sg_addr,
u32 y_len,
u32 x_len,
u32 src_stride,
u32 dst_stride,
};
The 'flags' field currently offers two control bits:
- bit 0: if set, the transfer will complete after this last descriptor
is processed, and the DMA core will go back to idle state; if cleared,
the next DMA descriptor pointed to by 'next_sg_addr' will be loaded.
- bit 1: if set, an end-of-transfer interrupt will be raised after the
memory segment pointed to by this descriptor has been transferred.
The 'id' field corresponds to an identifier of the descriptor.
The 'dest_addr' and 'src_addr' contain the destination and source
addresses to use for the transfer, respectively.
The 'x_len' field contains the number of bytes to transfer,
minus one.
The 'y_len', 'src_stride' and 'dst_stride' fields are only useful for
2D transfers, and should be set to zero if 2D transfers are not
required.
To start a transfer, the address of the first DMA descriptor must be
written to register 0x47c and the HWDESC bit of CONTROL register must
be set. The Scatter-Gather transfer is queued similarly to the simple
transfers, by writing 1 in TRANSFER_SUBMIT.
The Scatter-Gather interface has a dedicated AXI-MM bus configured for
read transfers, with its own dedicated clock, which can be asynchronous.
The Scatter-Gather reset is generated by the reset manager to reset the
logic after completing any pending transactions on the bus.
When the Scatter-Gather is enabled during runtime, the legacy cyclic
functionality of the DMA is disabled.
Signed-off-by: Ionut Podgoreanu <ionut.podgoreanu@analog.com>
2023-08-10 10:10:24 +00:00
|
|
|
<: if {$async_req_src || $async_src_dest || $async_dest_req || ($async_req_sg && $sg_enabled)} { :>
|
2015-09-15 16:58:40 +00:00
|
|
|
set_property ASYNC_REG TRUE \
|
|
|
|
[get_cells -quiet -hier *cdc_sync_stage1_reg*] \
|
|
|
|
[get_cells -quiet -hier *cdc_sync_stage2_reg*]
|
|
|
|
|
2015-11-06 14:17:55 +00:00
|
|
|
<: } :>
|
2015-09-15 16:58:40 +00:00
|
|
|
<: if {$async_req_src} { :>
|
|
|
|
set_max_delay -quiet -datapath_only \
|
|
|
|
-from $req_clk \
|
|
|
|
-to [get_cells -quiet -hier *cdc_sync_stage1_reg* \
|
2016-10-19 11:44:51 +00:00
|
|
|
-filter {NAME =~ *i_sync_src_request_id* && IS_SEQUENTIAL}] \
|
2015-09-15 16:58:40 +00:00
|
|
|
[get_property -min PERIOD $req_clk]
|
|
|
|
|
|
|
|
set_false_path -quiet \
|
|
|
|
-from $src_clk \
|
|
|
|
-to [get_cells -quiet -hier *cdc_sync_stage1_reg* \
|
2016-10-19 11:44:51 +00:00
|
|
|
-filter {NAME =~ *i_sync_status_src* && IS_SEQUENTIAL}]
|
2015-09-15 16:58:40 +00:00
|
|
|
|
|
|
|
set_false_path -quiet \
|
|
|
|
-from $req_clk \
|
|
|
|
-to [get_cells -quiet -hier *cdc_sync_stage1_reg* \
|
2016-10-19 11:44:51 +00:00
|
|
|
-filter {NAME =~ *i_sync_control_src* && IS_SEQUENTIAL}]
|
2015-09-15 16:58:40 +00:00
|
|
|
|
|
|
|
set_max_delay -quiet -datapath_only \
|
|
|
|
-from $req_clk \
|
|
|
|
-to [get_cells -quiet -hier *cdc_sync_stage1_reg* \
|
2020-11-18 16:15:45 +00:00
|
|
|
-filter {NAME =~ *i_src_req_fifo/zerodeep.i_waddr_sync* && IS_SEQUENTIAL}] \
|
2015-09-15 16:58:40 +00:00
|
|
|
[get_property -min PERIOD $req_clk]
|
|
|
|
|
|
|
|
set_max_delay -quiet -datapath_only \
|
|
|
|
-from $src_clk \
|
|
|
|
-to [get_cells -quiet -hier *cdc_sync_stage1_reg* \
|
2020-11-18 16:15:45 +00:00
|
|
|
-filter {NAME =~ *i_src_req_fifo/zerodeep.i_raddr_sync* && IS_SEQUENTIAL}] \
|
2015-09-15 16:58:40 +00:00
|
|
|
[get_property -min PERIOD $src_clk]
|
|
|
|
|
|
|
|
set_max_delay -quiet -datapath_only \
|
|
|
|
-from [get_cells -quiet -hier *cdc_sync_fifo_ram_reg* \
|
2016-10-19 11:44:51 +00:00
|
|
|
-filter {NAME =~ *i_src_req_fifo* && IS_SEQUENTIAL}] \
|
2015-09-15 16:58:40 +00:00
|
|
|
-to $src_clk \
|
|
|
|
[get_property -min PERIOD $src_clk]
|
|
|
|
|
|
|
|
set_max_delay -quiet -datapath_only \
|
2018-04-27 16:00:20 +00:00
|
|
|
-from $req_clk \
|
|
|
|
-through [get_cells -quiet -hier DP \
|
2018-08-03 12:52:55 +00:00
|
|
|
-filter {NAME =~ *i_request_arb/eot_mem_src_reg*}] \
|
2015-09-15 16:58:40 +00:00
|
|
|
-to $src_clk \
|
|
|
|
[get_property -min PERIOD $src_clk]
|
|
|
|
|
2018-08-25 04:57:20 +00:00
|
|
|
set_max_delay -quiet -datapath_only \
|
|
|
|
-from $src_clk \
|
|
|
|
-to [get_cells -quiet -hier *cdc_sync_stage1_reg* \
|
2020-11-18 16:15:45 +00:00
|
|
|
-filter {NAME =~ *i_rewind_req_fifo/zerodeep.i_waddr_sync* && IS_SEQUENTIAL}] \
|
2018-08-25 04:57:20 +00:00
|
|
|
[get_property -min PERIOD $src_clk]
|
|
|
|
|
|
|
|
set_max_delay -quiet -datapath_only \
|
2019-07-26 12:07:51 +00:00
|
|
|
-from $req_clk \
|
2018-08-25 04:57:20 +00:00
|
|
|
-to [get_cells -quiet -hier *cdc_sync_stage1_reg* \
|
2020-11-18 16:15:45 +00:00
|
|
|
-filter {NAME =~ *i_rewind_req_fifo/zerodeep.i_raddr_sync* && IS_SEQUENTIAL}] \
|
2019-07-26 12:07:51 +00:00
|
|
|
[get_property -min PERIOD $req_clk]
|
2018-08-25 04:57:20 +00:00
|
|
|
|
|
|
|
set_max_delay -quiet -datapath_only \
|
|
|
|
-from [get_cells -quiet -hier *cdc_sync_fifo_ram_reg* \
|
|
|
|
-filter {NAME =~ *i_rewind_req_fifo* && IS_SEQUENTIAL}] \
|
2019-07-26 12:07:51 +00:00
|
|
|
-to $req_clk \
|
|
|
|
[get_property -min PERIOD $req_clk]
|
2018-08-25 04:57:20 +00:00
|
|
|
|
|
|
|
set_false_path -quiet \
|
|
|
|
-from $req_clk \
|
|
|
|
-to [get_cells -quiet -hier *cdc_sync_stage1_reg* \
|
|
|
|
-filter {NAME =~ *sync_rewind/i_sync_out* && IS_SEQUENTIAL}]
|
|
|
|
|
|
|
|
set_false_path -quiet \
|
|
|
|
-from $src_clk \
|
|
|
|
-to [get_cells -quiet -hier *cdc_sync_stage1_reg* \
|
|
|
|
-filter {NAME =~ *sync_rewind/i_sync_in* && IS_SEQUENTIAL}]
|
|
|
|
|
2015-09-15 16:58:40 +00:00
|
|
|
<: } :>
|
|
|
|
<: if {$async_dest_req} { :>
|
|
|
|
set_max_delay -quiet -datapath_only \
|
|
|
|
-from $dest_clk \
|
|
|
|
-to [get_cells -hier *cdc_sync_stage1_reg* \
|
2016-10-19 11:44:51 +00:00
|
|
|
-filter {NAME =~ *i_sync_req_response_id* && IS_SEQUENTIAL}] \
|
2015-09-15 16:58:40 +00:00
|
|
|
[get_property -min PERIOD $dest_clk]
|
|
|
|
|
|
|
|
set_false_path -quiet \
|
|
|
|
-from $dest_clk \
|
|
|
|
-to [get_cells -quiet -hier *cdc_sync_stage1_reg* \
|
2016-10-19 11:44:51 +00:00
|
|
|
-filter {NAME =~ *i_sync_status_dest* && IS_SEQUENTIAL}]
|
2015-09-15 16:58:40 +00:00
|
|
|
|
|
|
|
set_false_path -quiet \
|
|
|
|
-from $req_clk \
|
|
|
|
-to [get_cells -quiet -hier *cdc_sync_stage1_reg* \
|
2016-10-19 11:44:51 +00:00
|
|
|
-filter {NAME =~ *i_sync_control_dest* && IS_SEQUENTIAL}]
|
2015-09-15 16:58:40 +00:00
|
|
|
|
|
|
|
set_max_delay -quiet -datapath_only \
|
|
|
|
-from $dest_clk \
|
|
|
|
-to [get_cells -quiet -hier *cdc_sync_stage1_reg* \
|
2020-11-18 16:15:45 +00:00
|
|
|
-filter {NAME =~ *i_dest_response_fifo/zerodeep.i_waddr_sync* && IS_SEQUENTIAL}] \
|
2015-09-15 16:58:40 +00:00
|
|
|
[get_property -min PERIOD $dest_clk]
|
|
|
|
|
|
|
|
set_max_delay -quiet -datapath_only \
|
|
|
|
-from $req_clk \
|
|
|
|
-to [get_cells -quiet -hier *cdc_sync_stage1_reg* \
|
2020-11-18 16:15:45 +00:00
|
|
|
-filter {NAME =~ *i_dest_response_fifo/zerodeep.i_raddr_sync* && IS_SEQUENTIAL}] \
|
2015-09-15 16:58:40 +00:00
|
|
|
[get_property -min PERIOD $req_clk]
|
axi_dmac: Add support for DMA Scatter-Gather
This commit introduces a different interface to submit transfers, using
DMA descriptors.
The structure of the DMA descriptor is as follows:
struct dma_desc {
u32 flags,
u32 id,
u64 dest_addr,
u64 src_addr,
u64 next_sg_addr,
u32 y_len,
u32 x_len,
u32 src_stride,
u32 dst_stride,
};
The 'flags' field currently offers two control bits:
- bit 0: if set, the transfer will complete after this last descriptor
is processed, and the DMA core will go back to idle state; if cleared,
the next DMA descriptor pointed to by 'next_sg_addr' will be loaded.
- bit 1: if set, an end-of-transfer interrupt will be raised after the
memory segment pointed to by this descriptor has been transferred.
The 'id' field corresponds to an identifier of the descriptor.
The 'dest_addr' and 'src_addr' contain the destination and source
addresses to use for the transfer, respectively.
The 'x_len' field contains the number of bytes to transfer,
minus one.
The 'y_len', 'src_stride' and 'dst_stride' fields are only useful for
2D transfers, and should be set to zero if 2D transfers are not
required.
To start a transfer, the address of the first DMA descriptor must be
written to register 0x47c and the HWDESC bit of CONTROL register must
be set. The Scatter-Gather transfer is queued similarly to the simple
transfers, by writing 1 in TRANSFER_SUBMIT.
The Scatter-Gather interface has a dedicated AXI-MM bus configured for
read transfers, with its own dedicated clock, which can be asynchronous.
The Scatter-Gather reset is generated by the reset manager to reset the
logic after completing any pending transactions on the bus.
When the Scatter-Gather is enabled during runtime, the legacy cyclic
functionality of the DMA is disabled.
Signed-off-by: Ionut Podgoreanu <ionut.podgoreanu@analog.com>
2023-08-10 10:10:24 +00:00
|
|
|
|
2015-09-15 16:58:40 +00:00
|
|
|
set_max_delay -quiet -datapath_only \
|
|
|
|
-from [get_cells -quiet -hier *cdc_sync_fifo_ram_reg* \
|
2016-10-19 11:44:51 +00:00
|
|
|
-filter {NAME =~ *i_dest_response_fifo* && IS_SEQUENTIAL}] \
|
2015-09-15 16:58:40 +00:00
|
|
|
-to $req_clk \
|
|
|
|
[get_property -min PERIOD $req_clk]
|
|
|
|
|
|
|
|
<: } :>
|
|
|
|
<: if {$async_src_dest} { :>
|
|
|
|
set_max_delay -quiet -datapath_only \
|
|
|
|
-from $src_clk \
|
|
|
|
-to [get_cells -quiet -hier *cdc_sync_stage1_reg* \
|
2016-10-19 11:44:51 +00:00
|
|
|
-filter {NAME =~ *i_sync_dest_request_id* && IS_SEQUENTIAL}] \
|
2015-09-15 16:58:40 +00:00
|
|
|
[get_property -min PERIOD $src_clk]
|
|
|
|
|
|
|
|
set_max_delay -quiet -datapath_only \
|
|
|
|
-from $src_clk \
|
|
|
|
-to [get_cells -quiet -hier *cdc_sync_stage1_reg* \
|
2018-05-09 16:02:41 +00:00
|
|
|
-filter {NAME =~ *i_store_and_forward/i_dest_sync_id* && IS_SEQUENTIAL}] \
|
2015-09-15 16:58:40 +00:00
|
|
|
[get_property -min PERIOD $src_clk]
|
|
|
|
|
|
|
|
set_max_delay -quiet -datapath_only \
|
|
|
|
-from $dest_clk \
|
|
|
|
-to [get_cells -quiet -hier *cdc_sync_stage1_reg* \
|
2018-05-09 16:02:41 +00:00
|
|
|
-filter {NAME =~ *i_store_and_forward/i_src_sync_id* && IS_SEQUENTIAL}] \
|
|
|
|
[get_property -min PERIOD $dest_clk]
|
|
|
|
|
|
|
|
set_max_delay -quiet -datapath_only \
|
|
|
|
-from $src_clk \
|
|
|
|
-through [get_cells -quiet -hier \
|
|
|
|
-filter {IS_SEQUENTIAL && NAME =~ *i_store_and_forward/burst_len_mem_reg*}] \
|
|
|
|
-to $dest_clk \
|
2015-09-15 16:58:40 +00:00
|
|
|
[get_property -min PERIOD $dest_clk]
|
|
|
|
|
2018-07-27 14:06:53 +00:00
|
|
|
set_max_delay -quiet -datapath_only \
|
|
|
|
-from $src_clk \
|
|
|
|
-to [get_cells -quiet -hier *cdc_sync_stage1_reg* \
|
2020-11-18 16:15:45 +00:00
|
|
|
-filter {NAME =~ *i_dest_req_fifo/zerodeep.i_waddr_sync* && IS_SEQUENTIAL}] \
|
2018-07-27 14:06:53 +00:00
|
|
|
[get_property -min PERIOD $src_clk]
|
|
|
|
|
|
|
|
set_max_delay -quiet -datapath_only \
|
|
|
|
-from $dest_clk \
|
|
|
|
-to [get_cells -quiet -hier *cdc_sync_stage1_reg* \
|
2020-11-18 16:15:45 +00:00
|
|
|
-filter {NAME =~ *i_dest_req_fifo/zerodeep.i_raddr_sync* && IS_SEQUENTIAL}] \
|
2018-07-27 14:06:53 +00:00
|
|
|
[get_property -min PERIOD $dest_clk]
|
|
|
|
|
|
|
|
set_max_delay -quiet -datapath_only \
|
|
|
|
-from [get_cells -quiet -hier *cdc_sync_fifo_ram_reg* \
|
|
|
|
-filter {NAME =~ *i_dest_req_fifo* && IS_SEQUENTIAL}] \
|
|
|
|
-to $dest_clk \
|
|
|
|
[get_property -min PERIOD $dest_clk]
|
|
|
|
|
|
|
|
set_max_delay -quiet -datapath_only \
|
|
|
|
-from $src_clk \
|
|
|
|
-to [get_cells -quiet -hier *cdc_sync_stage1_reg* \
|
2020-11-18 16:15:45 +00:00
|
|
|
-filter {NAME =~ *i_src_dest_bl_fifo/zerodeep.i_waddr_sync* && IS_SEQUENTIAL}] \
|
2018-07-27 14:06:53 +00:00
|
|
|
[get_property -min PERIOD $src_clk]
|
|
|
|
|
|
|
|
set_max_delay -quiet -datapath_only \
|
|
|
|
-from $dest_clk \
|
|
|
|
-to [get_cells -quiet -hier *cdc_sync_stage1_reg* \
|
2020-11-18 16:15:45 +00:00
|
|
|
-filter {NAME =~ *i_src_dest_bl_fifo/zerodeep.i_raddr_sync* && IS_SEQUENTIAL}] \
|
2018-07-27 14:06:53 +00:00
|
|
|
[get_property -min PERIOD $dest_clk]
|
|
|
|
|
|
|
|
set_max_delay -quiet -datapath_only \
|
|
|
|
-from [get_cells -quiet -hier *cdc_sync_fifo_ram_reg* \
|
|
|
|
-filter {NAME =~ *i_src_dest_bl_fifo* && IS_SEQUENTIAL}] \
|
|
|
|
-to $dest_clk \
|
|
|
|
[get_property -min PERIOD $dest_clk]
|
2018-08-03 12:52:55 +00:00
|
|
|
|
axi_dmac: Add support for DMA Scatter-Gather
This commit introduces a different interface to submit transfers, using
DMA descriptors.
The structure of the DMA descriptor is as follows:
struct dma_desc {
u32 flags,
u32 id,
u64 dest_addr,
u64 src_addr,
u64 next_sg_addr,
u32 y_len,
u32 x_len,
u32 src_stride,
u32 dst_stride,
};
The 'flags' field currently offers two control bits:
- bit 0: if set, the transfer will complete after this last descriptor
is processed, and the DMA core will go back to idle state; if cleared,
the next DMA descriptor pointed to by 'next_sg_addr' will be loaded.
- bit 1: if set, an end-of-transfer interrupt will be raised after the
memory segment pointed to by this descriptor has been transferred.
The 'id' field corresponds to an identifier of the descriptor.
The 'dest_addr' and 'src_addr' contain the destination and source
addresses to use for the transfer, respectively.
The 'x_len' field contains the number of bytes to transfer,
minus one.
The 'y_len', 'src_stride' and 'dst_stride' fields are only useful for
2D transfers, and should be set to zero if 2D transfers are not
required.
To start a transfer, the address of the first DMA descriptor must be
written to register 0x47c and the HWDESC bit of CONTROL register must
be set. The Scatter-Gather transfer is queued similarly to the simple
transfers, by writing 1 in TRANSFER_SUBMIT.
The Scatter-Gather interface has a dedicated AXI-MM bus configured for
read transfers, with its own dedicated clock, which can be asynchronous.
The Scatter-Gather reset is generated by the reset manager to reset the
logic after completing any pending transactions on the bus.
When the Scatter-Gather is enabled during runtime, the legacy cyclic
functionality of the DMA is disabled.
Signed-off-by: Ionut Podgoreanu <ionut.podgoreanu@analog.com>
2023-08-10 10:10:24 +00:00
|
|
|
set_max_delay -quiet -datapath_only \
|
2018-08-03 12:52:55 +00:00
|
|
|
-from $src_clk \
|
|
|
|
-through [get_cells -quiet -hier DP \
|
|
|
|
-filter {NAME =~ *i_request_arb/eot_mem_dest_reg*}] \
|
|
|
|
-to $dest_clk \
|
|
|
|
[get_property -min PERIOD $dest_clk]
|
|
|
|
|
axi_dmac: Add support for DMA Scatter-Gather
This commit introduces a different interface to submit transfers, using
DMA descriptors.
The structure of the DMA descriptor is as follows:
struct dma_desc {
u32 flags,
u32 id,
u64 dest_addr,
u64 src_addr,
u64 next_sg_addr,
u32 y_len,
u32 x_len,
u32 src_stride,
u32 dst_stride,
};
The 'flags' field currently offers two control bits:
- bit 0: if set, the transfer will complete after this last descriptor
is processed, and the DMA core will go back to idle state; if cleared,
the next DMA descriptor pointed to by 'next_sg_addr' will be loaded.
- bit 1: if set, an end-of-transfer interrupt will be raised after the
memory segment pointed to by this descriptor has been transferred.
The 'id' field corresponds to an identifier of the descriptor.
The 'dest_addr' and 'src_addr' contain the destination and source
addresses to use for the transfer, respectively.
The 'x_len' field contains the number of bytes to transfer,
minus one.
The 'y_len', 'src_stride' and 'dst_stride' fields are only useful for
2D transfers, and should be set to zero if 2D transfers are not
required.
To start a transfer, the address of the first DMA descriptor must be
written to register 0x47c and the HWDESC bit of CONTROL register must
be set. The Scatter-Gather transfer is queued similarly to the simple
transfers, by writing 1 in TRANSFER_SUBMIT.
The Scatter-Gather interface has a dedicated AXI-MM bus configured for
read transfers, with its own dedicated clock, which can be asynchronous.
The Scatter-Gather reset is generated by the reset manager to reset the
logic after completing any pending transactions on the bus.
When the Scatter-Gather is enabled during runtime, the legacy cyclic
functionality of the DMA is disabled.
Signed-off-by: Ionut Podgoreanu <ionut.podgoreanu@analog.com>
2023-08-10 10:10:24 +00:00
|
|
|
<: } :>
|
|
|
|
<: if {$async_req_sg && $sg_enabled} { :>
|
|
|
|
set_false_path -quiet \
|
|
|
|
-from $req_clk \
|
|
|
|
-to [get_cells -quiet -hier *cdc_sync_stage1_reg* \
|
|
|
|
-filter {NAME =~ *i_sync_sg_enable* && IS_SEQUENTIAL}]
|
|
|
|
|
|
|
|
set_max_delay -quiet -datapath_only \
|
|
|
|
-from $req_clk \
|
|
|
|
-to [get_cells -quiet -hier *cdc_sync_stage1_reg* \
|
|
|
|
-filter {NAME =~ *i_sg_addr_fifo/zerodeep.i_waddr_sync* && IS_SEQUENTIAL}] \
|
|
|
|
[get_property -min PERIOD $req_clk]
|
|
|
|
|
|
|
|
set_max_delay -quiet -datapath_only \
|
|
|
|
-from $sg_clk \
|
|
|
|
-to [get_cells -quiet -hier *cdc_sync_stage1_reg* \
|
|
|
|
-filter {NAME =~ *i_sg_addr_fifo/zerodeep.i_raddr_sync* && IS_SEQUENTIAL}] \
|
|
|
|
[get_property -min PERIOD $sg_clk]
|
|
|
|
|
|
|
|
set_max_delay -quiet -datapath_only \
|
|
|
|
-from [get_cells -quiet -hier *cdc_sync_fifo_ram_reg* \
|
|
|
|
-filter {NAME =~ *i_sg_addr_fifo* && IS_SEQUENTIAL}] \
|
|
|
|
-to $sg_clk \
|
|
|
|
[get_property -min PERIOD $sg_clk]
|
|
|
|
|
|
|
|
set_max_delay -quiet -datapath_only \
|
|
|
|
-from $sg_clk \
|
|
|
|
-to [get_cells -quiet -hier *cdc_sync_stage1_reg* \
|
|
|
|
-filter {NAME =~ *i_sg_desc_fifo/zerodeep.i_waddr_sync* && IS_SEQUENTIAL}] \
|
|
|
|
[get_property -min PERIOD $sg_clk]
|
|
|
|
|
|
|
|
set_max_delay -quiet -datapath_only \
|
|
|
|
-from $req_clk \
|
|
|
|
-to [get_cells -quiet -hier *cdc_sync_stage1_reg* \
|
|
|
|
-filter {NAME =~ *i_sg_desc_fifo/zerodeep.i_raddr_sync* && IS_SEQUENTIAL}] \
|
|
|
|
[get_property -min PERIOD $req_clk]
|
|
|
|
|
|
|
|
set_max_delay -quiet -datapath_only \
|
|
|
|
-from [get_cells -quiet -hier *cdc_sync_fifo_ram_reg* \
|
|
|
|
-filter {NAME =~ *i_sg_desc_fifo* && IS_SEQUENTIAL}] \
|
|
|
|
-to $req_clk \
|
|
|
|
[get_property -min PERIOD $req_clk]
|
|
|
|
|
|
|
|
set_false_path \
|
|
|
|
-to [get_pins -hierarchical * -filter {NAME=~*i_waddr_sync_gray/cdc_sync_stage1_reg[*]/D}]
|
|
|
|
|
|
|
|
set_false_path \
|
|
|
|
-to [get_pins -hierarchical * -filter {NAME=~*i_raddr_sync_gray/cdc_sync_stage1_reg[*]/D}]
|
|
|
|
|
2015-09-15 16:58:40 +00:00
|
|
|
<: } :>
|
|
|
|
# Reset signals
|
|
|
|
set_false_path -quiet \
|
2017-09-21 14:02:44 +00:00
|
|
|
-from [get_cells -quiet -hier *do_reset_reg* \
|
|
|
|
-filter {NAME =~ *i_reset_manager* && IS_SEQUENTIAL}] \
|
|
|
|
-to [get_pins -quiet -hier *reset_async_reg*/PRE]
|
|
|
|
|
|
|
|
set_false_path -quiet \
|
|
|
|
-from [get_cells -quiet -hier *reset_async_reg[0] \
|
|
|
|
-filter {NAME =~ *i_reset_manager* && IS_SEQUENTIAL}] \
|
|
|
|
-to [get_cells -quiet -hier *reset_async_reg[3]* \
|
|
|
|
-filter {NAME =~ *i_reset_manager* && IS_SEQUENTIAL}]
|
|
|
|
|
|
|
|
set_false_path -quiet \
|
|
|
|
-from [get_cells -quiet -hier *reset_async_reg[0] \
|
|
|
|
-filter {NAME =~ *i_reset_manager* && IS_SEQUENTIAL}] \
|
|
|
|
-to [get_pins -quiet -hier *reset_sync_in_reg*/PRE \
|
|
|
|
-filter {NAME =~ *i_reset_manager*}]
|
|
|
|
|
|
|
|
set_false_path -quiet \
|
|
|
|
-from [get_cells -quiet -hier *reset_sync_reg[0] \
|
|
|
|
-filter {NAME =~ *i_reset_manager* && IS_SEQUENTIAL}] \
|
|
|
|
-to [get_pins -quiet -hier *reset_sync_in_reg*/PRE \
|
|
|
|
-filter {NAME =~ *i_reset_manager*}]
|
|
|
|
|
|
|
|
set_property -dict { \
|
|
|
|
SHREG_EXTRACT NO \
|
|
|
|
ASYNC_REG TRUE \
|
2018-07-06 11:37:58 +00:00
|
|
|
} [get_cells -quiet -hier *reset_async_reg*]
|
2017-09-21 14:02:44 +00:00
|
|
|
|
|
|
|
set_property -dict { \
|
|
|
|
SHREG_EXTRACT NO \
|
|
|
|
ASYNC_REG TRUE \
|
|
|
|
} [get_cells -quiet -hier *reset_sync_reg*]
|
2015-09-15 16:58:40 +00:00
|
|
|
|
|
|
|
# Ignore timing for debug signals to register map
|
2017-03-30 14:00:51 +00:00
|
|
|
<: if {!$disable_debug_registers} { :>
|
2015-09-15 16:58:40 +00:00
|
|
|
set_false_path -quiet \
|
|
|
|
-from [get_cells -quiet -hier *cdc_sync_stage2_reg* \
|
2016-10-19 11:44:51 +00:00
|
|
|
-filter {name =~ *i_sync_src_request_id* && IS_SEQUENTIAL}] \
|
|
|
|
-to [get_cells -quiet -hier *up_rdata_reg* -filter {IS_SEQUENTIAL}]
|
2015-09-15 16:58:40 +00:00
|
|
|
set_false_path -quiet \
|
|
|
|
-from [get_cells -quiet -hier *cdc_sync_stage2_reg* \
|
2018-05-10 09:13:22 +00:00
|
|
|
-filter {name =~ *i_dest_sync_id* && IS_SEQUENTIAL}] \
|
2016-10-19 11:44:51 +00:00
|
|
|
-to [get_cells -quiet -hier *up_rdata_reg* -filter {IS_SEQUENTIAL}]
|
2015-09-15 16:58:40 +00:00
|
|
|
set_false_path -quiet \
|
2016-10-19 11:44:51 +00:00
|
|
|
-from [get_cells -quiet -hier *id_reg* -filter {name =~ *i_request_arb* && IS_SEQUENTIAL}] \
|
|
|
|
-to [get_cells -quiet -hier *up_rdata_reg* -filter {IS_SEQUENTIAL}]
|
2015-09-15 16:58:40 +00:00
|
|
|
set_false_path -quiet \
|
2016-10-19 11:44:51 +00:00
|
|
|
-from [get_cells -quiet -hier *address_reg* -filter {name =~ *i_addr_gen* && IS_SEQUENTIAL}] \
|
|
|
|
-to [get_cells -quiet -hier *up_rdata_reg* -filter {IS_SEQUENTIAL}]
|
2017-09-21 14:02:44 +00:00
|
|
|
set_false_path -quiet \
|
|
|
|
-from [get_cells -quiet -hier *reset_sync_reg* -filter {name =~ *i_reset_manager* && IS_SEQUENTIAL}] \
|
|
|
|
-to [get_cells -quiet -hier *up_rdata_reg* -filter {IS_SEQUENTIAL}]
|
2017-03-30 14:00:51 +00:00
|
|
|
<: } :>
|