目录
1. 简介
本文分享了使用 JTAG to AXI Master 调试 DDR4 IP 的全过程。
- 在 Block Design 中通过 AXI SmartConnect 和 DDR4 MIG 进行地址分配和时钟管理。
- 对于 AXI SmartConnect 的时钟域管理,分享了同步和异步转换的优缺点,提供了在设计中优化时钟域交叉的方法,以减少延迟和资源消耗。
- 在 DDR4 MIG 的配置中,本文列出了时钟和复位信号的功能。
- 分享了 XDC 约束文件。
- 使用 TCL 脚本实现了对 DDR4 的读写操作,展示了如何通过创建 AXI 事务来进行数据传输。
- 通过封装 TCL 过程,使得写入和读取操作更加简洁和高效。
- 使用 HLS IP 初始化,分享内存访问的基本操作方法。
- 介绍了如何格式化 AXI 事务报告,以及如何将操作记录保存到本地文件中,便于后续的分析和调试。
2. JTAG 直接操作 DDR4
2.1 Block Design
地址分配:
2.2 AXI SmartConnect
- 默认情况下,SmartConnect 上的所有接口都在相同的时钟域中运行,通过 aclk 引脚接收。
- 支持多个时钟域(aclk1…aclkn),工具会自动识别并连接到对应的时钟域。
- 当沿任何 AXI 通道在属于不同时钟域的接口之间交换信息时,时钟转换逻辑会自动插入路径中。
- 当工具确定时钟域之间的关系是整数比,范围在1:16到16:1之间,并且时钟来自同一时钟源时,工具会自动配置时钟转换器以执行同步转换;否则,时钟转换器配置为异步模式。
- 当时钟转换器配置为异步模式时,所有时钟域交叉都在 FIFO 生成器核心的底层实例中执行,该核心设计用于在其写入和读取时钟域内部重新同步,无论相位或频率关系如何。在异步模式下,核心会生成适当的仅数据路径的时序约束,以覆盖所有重新同步路径。
- 时钟转换器会引入延迟。与同步转换相比,异步转换会产生更多延迟并使用更多的逻辑资源。
- 为了减少系统中的时钟转换器数量,可以级联 AXI SmartConnect 核心实例,将时钟相似的设备组合在一起。例如,将一组低频 AXI4-Lite 从设备连接到低频时钟的单独 AXI SmartConnect 核心,可以将时钟域交叉合并到级联的 AXI SmartConnect 核心实例之间的单个转换器路径中。
2.3 DDR4 MIG
2.3.1 时钟和复位
| 信号 | 方向 | 功能
|-------------------------|------- |--------------------------------------------------------
| C0_SYS_CLK | input | DRAM IP Core 时钟
| c0_ddr4_aresetn | input | AXI 复位输入,应该与 FPGA 逻辑时钟同步。
| sys_rst | input | 系统复位,高电平有效,重置整个内存模块
| c0_ddr4_ui_clk | output | 用户接口时钟,AXI 接口同步时钟取自 ui_clk。(Table 4-39)
| c0_ddr4_ui_clk_sync_rst | output | 用户接口复位,高电平有效
sys_rst 信号重置整个内存设计,包括由 MMCM 时钟(clkout0)驱动的通用互连(fabric)逻辑和 RIU 逻辑。MicroBlaze™ 和校准逻辑由 MMCM 时钟(clkout6)驱动。sys_rst 输入信号在内部同步,以创建 ui_clk_sync_rst 信号。ui_clk_sync_rst 重置信号同步地被断言和同步地被解除断言。
图3-14显示,在断言 sys_rst 后几个时钟延迟,ui_clk_sync_rst(fabric 重置)会同步断言。当 ui_clk_sync_rst 被断言时,在关闭时钟之前还有几个时钟周期。
2.3.2 AXI Slave 接口
- AXI4 从接口是可选的。
- AXI4 从接口块将 AXI4 事务映射到 UI(User Interface)。
- UI 在表 4-14 中描述(PG150),并连接到 FPGA 用户逻辑,以访问外部存储设备。
- UI 构建在早先在控制器描述中提到的本地接口之上。
- 两种工具之间的RTL是一致的。
2.4 XDC 约束
############# DDR4 Memory Controller ################################
set_property PACKAGE_PIN K22 [get_ports C0_SYS_CLK_0_clk_p]
set_property PACKAGE_PIN L22 [get_ports {c0_alert_n[0]}]
set_property IOSTANDARD SSTL12 [get_ports {c0_alert_n[0]}]
############# External Memory Interface - Clock #####################
set_property PACKAGE_PIN G24 [get_ports {ddr4_rtl_0_ck_t[0]}]
############# External Memory Interface - ADDR & CMD ################
set_property PACKAGE_PIN D26 [get_ports {ddr4_rtl_0_adr[0]}]
set_property PACKAGE_PIN D25 [get_ports {ddr4_rtl_0_adr[1]}]
set_property PACKAGE_PIN E26 [get_ports {ddr4_rtl_0_adr[2]}]
set_property PACKAGE_PIN C24 [get_ports {ddr4_rtl_0_adr[3]}]
set_property PACKAGE_PIN C26 [get_ports {ddr4_rtl_0_adr[4]}]
set_property PACKAGE_PIN F24 [get_ports {ddr4_rtl_0_adr[5]}]
set_property PACKAGE_PIN M26 [get_ports {ddr4_rtl_0_adr[6]}]
set_property PACKAGE_PIN B25 [get_ports {ddr4_rtl_0_adr[7]}]
set_property PACKAGE_PIN G26 [get_ports {ddr4_rtl_0_adr[8]}]
set_property PACKAGE_PIN B26 [get_ports {ddr4_rtl_0_adr[9]}]
set_property PACKAGE_PIN E25 [get_ports {ddr4_rtl_0_adr[10]}]
set_property PACKAGE_PIN H26 [get_ports {ddr4_rtl_0_adr[11]}]
set_property PACKAGE_PIN D23 [get_ports {ddr4_rtl_0_adr[12]}]
set_property PACKAGE_PIN F25 [get_ports {ddr4_rtl_0_adr[13]}]
set_property PACKAGE_PIN K25 [get_ports {ddr4_rtl_0_adr[14]}]
set_property PACKAGE_PIN E23 [get_ports {ddr4_rtl_0_adr[15]}]
set_pr