Xilinx DDR2 MIG 7 性能评估指南
重要提示: 提供此可下载的答复记录 PDF 是为了增强其可用性和可读性。 请务必注意,答复记录是 Web- 基于内容,随着新信息的出现而频繁更新。 提醒您访问 Xilinx 技术支持 Web站点和重新view (Xilinx 答复 63234) 以获取此答复的最新版本。
介绍
由于 DDR2 和 DDR3 内存的架构方式以及 MIG 7 系列控制器的设计方式,性能并不直接。
它需要了解各种 Jedec 时序参数和控制器架构,并且您需要运行仿真以获得估计值。
确定性能的一般原则是相同的,但本文档提供了一种使用 MIG ex 获得效率的简单方法amp借助测试台和激励进行设计 file附在这里。
有效带宽
DRAM 数据总线仅在突发读写期间达到接近峰值的带宽,其开销降低了有效数据速率。
几个前任amp开销是:
- Precharge time accessing rows in the same bank (Access address not in the same row-page hit)
- 从写入访问更改为读取访问的写入恢复时间
- 从读取访问更改为写入访问的总线周转时间
有效带宽 = 峰值带宽 * 效率
MIG 设计生成
有关 MIG IP 和 ex 的分步详细信息,请参阅 UG586 第 1 章amp乐设计一代。
在运行 MIG 7 系列性能仿真之前,请执行以下操作以确保您的仿真环境正常。 打开 MIG examp设计并映射适当的库,运行模拟,并确保您可以在成绩单中看到“测试通过”消息。
为了演示流程,我为 xc7vx690tffg1761-2 生成了一个 MIG IP 并调用了 examp设计。
需要注意的两件事是内存地址位和内存地址映射选择。
对于前者ample,我在内存部分下拉选项下选择了 MT41J128M8XX-125。
对于从图 1 中选择的内存部分,行 = 14,列 = 10 和组 = 3,因此 app_addr_width = 行 + 列 + 组 + 等级 = 28
您可以选择 BANK_ROW_COLUMN 或 ROW BANK 列。
我已经离开了 ROW BANK Column,这是默认的地址映射。
Examp使用可综合测试台进行设计仿真
在模拟设置下,选择 QuestaSim/ModelSim 模拟器并浏览到已编译库的位置。
指向第三方工具安装路径、选择目标仿真器、编译映射库可参考(UG900)Vivado Design Suite用户指南逻辑仿真
通过 GUI 运行模拟(单击项目管理器中的“运行模拟”选项卡)并确保您在成绩单中看到“测试通过”消息。
性能模拟 RTL 修改
- 右键单击源选项卡,选择“添加或创建模拟源”,然后浏览到 mig7_perfsim_traffic_generator.sv file 然后单击完成添加它。
- 右键单击源选项卡,选择“添加或创建模拟源”,浏览到 perfsim_stimulus.txt,然后单击完成添加它。
- 注释掉前任ampsim_tb_top.v 中的 le_top 实例化 file.
- 将以下 RTL 行添加到 sim_tb_top,v
- 本地参数 APP_ADDR_WIDTH = 28;
- 本地参数 APP_DATA_WIDTH = 64;
- localparam APP_MASK_WIDTH = APP_DATA_WIDTH / 8;
- localparam MEM_ADDR_ORDER = “BANK_ROW_COLUMN”;
- localparam BANK_WIDTH = 3;
- 本地参数 RANK_WIDTH = 1;
- 电线 [APP_ADDR_WIDTH-1:0] c0_ddr3_app_addr;
- 电线 [2:0] c0_ddr3_app_cmd;
- 电线 c0_ddr3_app_en;
- 电线 [APP_DATA_WIDTH-1:0] c0_ddr3_app_wdf_data;
- 电线 c0_ddr3_app_wdf_end;
- 电线 [APP_MASK_WIDTH-1:0] c0_ddr3_app_wdf_mask;
- 电线 c0_ddr3_app_wdf_wren;
- 电线 [APP_DATA_WIDTH-1:0] c0_ddr3_app_rd_data;
- 电线 c0_ddr3_app_rd_data_end;
- 电线 c0_ddr3_app_rd_data_valid;
- 电线 c0_ddr3_app_rdy;
- 电线 c0_ddr3_app_wdf_rdy;
- 电线 c0_data_compare_error;
- 接线 ui_clk;
- 电线 ui_clk_sync_rst;
- 电线 app_sr_req = 0;
- 电线 app_ref_req = 0;
- 电线 app_zq_req =0;
- 电线 c0_app_wdf_mask =0;
FPGA 内存控制器实例化
mig_7series_0_mig u_mig_7series_0_mig (
//内存接口端口
- .ddr3_addr (ddr3_addr_fpga),
- .ddr3_ba (ddr3_ba_fpga),
- .ddr3_cas_n (ddr3_cas_n_fpga),
- .ddr3_ck_n (ddr3_ck_n_fpga),
- .ddr3_ck_p (ddr3_ck_p_fpga),
- .ddr3_cke (ddr3_cke_fpga),
- .ddr3_ras_n (ddr3_ras_n_fpga),
- .ddr3_reset_n (ddr3_reset_n),
- .ddr3_we_n (ddr3_we_n_fpga),
- .ddr3_dq (ddr3_dq_fpga),
- .ddr3_dqs_n (ddr3_dqs_n_fpga),
- .ddr3_dqs_p (ddr3_dqs_p_fpga),
- .init_calib_complete (init_calib_complete),
- .ddr3_cs_n (ddr3_cs_n_fpga),
- .ddr3_dm (ddr3_dm_fpga),
- .ddr3_odt (ddr3_odt_fpga),
// 应用接口端口
- .app_addr (c0_ddr3_app_addr),
- .app_cmd (c0_ddr3_app_cmd),
- .app_en (c0_ddr3_app_en),
- .app_wdf_data (c0_ddr3_app_wdf_data),
- .app_wdf_end (c0_ddr3_app_wdf_end),
- .app_wdf_wren (c0_ddr3_app_wdf_wren),
- .app_rd_data (c0_ddr3_app_rd_data),
- .app_rd_data_end (app_rd_data_end),
- .app_rd_data_valid (c0_ddr3_app_rd_data_valid),
- .app_rdy (c0_ddr3_app_rdy),
- .app_wdf_rdy (c0_ddr3_app_wdf_rdy),
- .app_sr_req (app_sr_req),
- .app_ref_req (app_ref_req),
- .app_zq_req (app_zq_req),
- .app_sr_active (app_sr_active),
- .app_ref_ack (app_ref_ack),
- .app_zq_ack (app_zq_ack),
- .ui_clk (ui_clk),
- .ui_clk_sync_rst (ui_clk_sync_rst),
- .app_wdf_mask (c0_ddr3_app_wdf_mask),
// 系统时钟端口
- .sys_clk_i (sys_clk_i),
// 参考时钟端口
- .clk_ref_i (clk_ref_i),
- .sys_rst (sys_rst)
- );
性能流量生成器实例化
mig7_perfsim_traffic_generator#
(
.APP_DATA_WIDTH (APP_DATA_WIDTH),
.COL_WIDTH (COL_WIDTH),
.ROW_WIDTH (ROW_WIDTH),
.RANK_WIDTH (RANK_WIDTH),
.BANK_WIDTH(银行宽度),
.MEM_ADDR_ORDER (MEM_ADDR_ORDER),
.tCK (tCK),
.ADDR_WIDTH (APP_ADDR_WIDTH)
)
u_traffic_gen
(
.clk (ui_clk),
.rst (ui_clk_sync_rst),
.init_calib_complete (init_calib_complete),
.cmp_error (c0_data_compare_error),
.app_wdf_rdy (c0_ddr3_app_wdf_rdy),
.app_rd_data_valid (c0_ddr3_app_rd_data_valid),
.app_rd_data (c0_ddr3_app_rd_data),
.app_rdy (c0_ddr3_app_rdy),
.app_cmd (c0_ddr3_app_cmd),
.app_addr (c0_ddr3_app_addr),
.app_en (c0_ddr3_app_en ),
.app_wdf_mask (c0_ddr3_app_wdf_mask),
.app_wdf_data (c0_ddr3_app_wdf_data),
.app_wdf_end (c0_ddr3_app_wdf_end),
.app_wdf_wren (c0_ddr3_app_wdf_wren)
);
- 5. 根据您的内存部分选择修改APP_ADDR_WIDTH、APP_DATA_WIDTH、RANK_WIDTH 和BANK_WIDTH。
值可以从_mig.v file. - 黄色突出显示的实例化名称 mig_7series_0_mig 可能会根据您在 IP 创建期间的组件名称而有所不同,请验证您是否选择了不同的名称并相应地进行更改。
- 生成IP后打开_mig.v file 并交叉检查 LHS 信号名称中的任何变化并进行更正。
- app_sr_req、app_ref_req 和 app_zq_req 应初始化为 0。
- 作为前任ample_top.v 被注释掉并且是新的 file添加了 s,您可能会看到“?” 在旁边
mig_7series_0_mig.v file 在模拟源下。
映射正确的 file,右击mig_7series_0_mig.v,选择“Add Sources”,浏览到
/mig_7series_0_example.srcs/sources_1/ip/mig_7series_0/mig_7series_0/user_design/rtl
并添加 mig_7series_0_mig_sim.v file. - 如果你看到 ”?” 对于底层 files, 添加所有 RTL file在 clocking、controller、ip_top、phy 和 UI 文件夹中。
- 一旦 RTL 更改完成并且所有必需的 files 添加到您的模拟源中,层次结构应类似于图 5。
file以红色突出显示的是新添加的,而“?” 预计在 ECC 相关模块上,因为所选内存配置禁用了 ECC 选项。
刺激物 File 产品描述
每个激励模式为 48 位,格式如图 6-1 至 6-4 所示。
地址编码(地址[35:0])
地址按照图 7-1 至图 7-6 在激励中编码。 所有地址字段都需要以十六进制格式输入。 所有地址字段的宽度都可以被四整除,以十六进制格式输入。 测试台仅将地址字段的所需位发送到内存控制器。
对于前者amp例如,在 2 bank 配置中,只有 bank 位 [0:XNUMX] 被发送到内存控制器,其余位被忽略。 地址字段的额外位供您以十六进制格式输入地址。
您必须确认输入的值对应于给定配置的宽度。
- 列地址(列 [11:0]) – 激励中的 Column Address 最多提供 12 位,但您需要根据设计中设置的列宽参数来解决这个问题。
- 行地址 (Row[15:0]) – 激励中的行地址最多提供 16 位,但您需要根据设计中设置的行宽参数来解决这个问题。
- 银行地址(银行[3:0])—— 激励中的 Bank 地址最多提供四位,但您需要根据设计中设置的 Bank 宽度参数来解决这个问题。
- 排名地址(排名[3:0]) – 激励中的秩地址最多提供四位,但您需要根据设计中的秩宽度参数集来解决这个问题。
地址根据顶层 MEM_ADDR_ORDER 参数组装并发送到用户界面
命令重复(命令重复 [7:0])
命令重复计数是相应命令在用户界面上重复的次数。 每次重复的地址递增 8。最大重复次数为 128。
测试平台不检查列边界,如果在增量期间达到最大列限制,它会环绕。
128 个命令填满了页面。 对于 0 以外的任何列地址,128 的重复计数最终会越过列边界并环绕到列地址的开头。
总线利用率
总线利用率是在用户界面计算的,考虑了读取和写入的总数,并使用以下等式:
- BL8 需要四个内存时钟周期
- end_of_stimulus 是所有命令完成的时间。
- calib_done 是校准完成的时间。
Examp文件模式
这些前amp文件基于设置为 BANK_ROW_COLUMN 的 MEM_ADDR_ORDER。
单读模式
00_0_2_000F_00A_1 – 此模式是从第 10 列、第 15 行和第二组中读取的单个数据。单写模式
00_0_1_0040_010_0 – 此模式是对第 32 列、第 128 行和第一组的单次写入。对同一地址的单次写入和读取
00_0_2_000F_00A_0 – 此模式是对第 10 列、第 15 行和第二组的单次写入。
00_0_2_000F_00A_1 – 此模式是从第 10 列、第 15 行和第二组中读取的单次数据
使用同一地址进行多次写入和读取
0A_0_0_0010_000_0 – 这对应于地址从 10 到 0 的 80 次写入,可以在列中看到。
0A_0_0_0010_000_1 – 这对应于地址从 10 到 0 的 80 次读取,可以在列中看到。
写入期间换页
0A_0_2_000F_3F8_0 – 这对应于 10 次写入,其中列地址在一次写入后回绕到页面的开头。
模拟性能流量生成器
此时你已经完成了 MIG examp设计模拟。 这意味着您的仿真设置已准备就绪,您已经完成了性能仿真 RTL 修改,新的仿真层次结构是正确的并且您已经了解了激励模式。 在 perfsim_stimulus.txt 中使用 16 次写入和读取再次运行模拟。
运行全部,等待 init_calib_complete 信号被置位,您将能够看到建议的写入和读取次数。 然后模拟将停止。
当系统提示您退出模拟时,选择否并转到成绩单窗口,您可以在其中查看性能统计信息。
如果你选择 “退出模拟” 性能统计信息将被写入 file 命名 mig_band_width_output.txt 位于 sim_1/behave 文件夹中。
Examp文件目录路径:-
/mig_7series_0_example_perf_sim\mig_7series_0_example.sim/sim_1/行为
你可能想知道为什么百分比tage 总线利用率仅为 29。使用相同的 IP 设置重新运行仿真,但只是更改激励 file 到 256 次写入和 256 次读取
ff_0_0_0000_000_0
ff_0_0_0000_000_1
您现在将看到百分比tage 为 85,这意味着 DDR3 为长序列的写入和读取突发提供了更好的总线利用率。
提高绩效的一般方法
影响效率的因素可以分为两部分:
- 内存特定
- 控制器特定
图9给你一个overview 特定于内存的术语。
与 SRAM 和块存储器不同,DDR2 或 DDR3 性能不仅仅是最大数据速率。
这取决于许多时间因素,包括:
- tRCD: 行命令延迟(或 ras 到 cas 延迟)。
- tCAS(CL): 列地址选通延迟。
- 目标零售价: 行预充电延迟。
- tRAS:行活动时间(激活预更改)。
- 时间: 行循环时间。 tRC = tRAS + tRP
- 交易记录: 随机访问延迟。 tRAC = tRCD + tCAS
- tCWL: Cas 写入延迟。
- tZQ: ZQ 校准时间。
- tRFC: 行刷新周期时间
- tWTR: 写入读取延迟。 上次写入事务到读取命令的时间。
- tWR: 写入恢复时间。 上次写入事务到 Precharge 时间
所有列出的参数的时序取决于所用内存的类型和内存部件的速度等级。
有关定义和时序规范的更多详细信息,请参阅 DDR2 DDR3 JEDEC 或任何存储设备数据表。
效率主要取决于内存的访问方式。 不同的地址模式给出不同的效率结果。
内存时序开销
- 更改为新组/行或在同一组中更改行时的激活时间和预充电时间。- 因此,如果您减少行更改,这可以消除 tRCD 和 tRP。
- 发送连续写入或读取命令 - 保持 tCCD 时序。
- 最大限度地减少写入到读取和读取到写入命令的转换——写入恢复时间更改为读取访问,总线周转时间从读取更改为写入
- 设置适当的刷新间隔。
- DDR3 SDRAM 需要平均周期为 tREFI 的刷新周期。
- 最多可以提前发出 8 个额外的刷新命令(“拉入”)。 这不会减少刷新次数,但两个周围刷新命令之间的最大间隔被限制为 9 × tREFI
- 利用所有银行 – 合适的寻址机制是更可取的。
- 行银行列: 对于在顺序地址空间上发生的事务,核心会自动在 DRAM 设备的下一个存储体中打开同一行,以便在到达现有行的末尾时继续事务。 它非常适合需要将大数据包突发到顺序地址位置的应用程序。
- 银行行列: 跨越行边界时,当前行将关闭,而同一行内的另一行将打开。 MSB是bank地址,可以用来切换不同的bank。 它适用于更短、更随机的交易到一个内存块一段时间然后跳转到另一个块(bank)
- 突发长度
- 8 系列的 DDR3 支持 BL 7。 BC4 的效率非常低,不到 50%。 这是因为 BC4 的执行时间与 BL8 相同。 数据只是在组件内部被屏蔽。
- 在您不希望写入完整突发的情况下,可以考虑数据掩码或先读后写。
- 设置适当的 ZQ 间隔(仅限 DDR3)
控制器发送 ZQ 短 (ZQCS) 和 ZQ 长 (ZQCL) 校准命令。- 遵守 DDR3 Jedec 标准
- ZQ 校准在 JEDEC 规范 JESD5.5-79 DDR3 SDRAM 标准的第 3 节中讨论
- ZQ 校准定期校准片上端接 (ODT) 以解决 VT 的变化
- 逻辑包含在 bank_common.v/vhd
- 参数 Tzqcs 确定 ZQ 校准命令发送到内存的速率
- 可以禁用计数器并使用 app_zq_req 手动发送,这类似于手动发送刷新。
有关详细信息,请参阅(Xilinx 答复 47924)。
控制器开销
- 定期读取 - 请参阅 (Xilinx答复43344) 了解详情。
- 不要改变读取的周期
- 在写入期间跳过定期读取,并在真正读取之前发出未读读取的次数
- 重新排序 – 参考 (Xilinx答复34392) 了解详情。
对于用户和 AXI 接口设计,最好启用此功能。- Reorder是向前看几个命令并改变用户命令顺序以使非内存命令不占用有效带宽的逻辑。 性能还与实际流量模式有关。
- 基于地址模式,重新排序有助于跳过预充电和激活命令,并使 tRCD 和 tRP 不占用数据带宽。
- 尝试增加银行机器的数量。
- 大多数控制器的逻辑驻留在银行机器中,它们对应于 DRAM 银行
- 给定的银行机器在任何给定时间管理单个 DRAM 库。
- 银行机器分配是动态的,因此没有必要为每个实体银行配备一台银行机器。
- 银行机器可以配置,但这是面积和性能之间的权衡。
- 允许的银行机器数量范围为 2-8 台。
- 默认情况下,通过 RTL 参数配置 4 个 Bank Machine。
- 要更改银行机器,请考虑 memc_ui_top Ex 中包含的参数 nBANK_MACHS = 8amp8 台银行机器的 le – nBANK_MACHS = 8
您现在已经了解了影响性能的因素。
考虑一个上游应用程序,它为每个数据包提供 512 个数据字节,您需要将它们保存到不同的内存位置。 由于 512 个数据字节等于 64 个 DDR3 数据突发,重新运行 examp带刺激的设计 file 包含 512 次写入、512 次读取和每 64 次写入或读取的行切换:
- 3f_0_0_0000_000_0
- 3f_0_0_0001_000_0
- 3f_0_0_0002_000_0
- 3f_0_0_0003_000_0
- 3f_0_0_0004_000_0
- 3f_0_0_0005_000_0
- 3f_0_0_0006_000_0
- 3f_0_0_0007_000_0
- 3f_0_0_0000_000_1
- 3f_0_0_0001_000_1
- 3f_0_0_0002_000_1
- 3f_0_0_0003_000_1
- 3f_0_0_0004_000_1
- 3f_0_0_0005_000_1
- 3f_0_0_0006_000_1
- 3f_0_0_0007_000_1
在模拟结束时,您将看到总线利用率为 77%。
图 11:512 次写入和 512 次读取的性能统计 – 64 次写入或读取的行切换。
您现在可以应用在前面部分中学到的知识来提高效率。 与 view 要利用所有银行而不是更改行,请修改地址模式以更改银行,如下所示。
这相当于在 MIG GUI 中的内存地址映射设置中设置 ROW_BANK_Column。
- 3f_0_0_0000_000_0
- 3f_0_1_0000_000_0
- 3f_0_2_0000_000_0
- 3f_0_3_0000_000_0
- 3f_0_4_0000_000_0
- 3f_0_5_0000_000_0
- 3f_0_6_0000_000_0
- 3f_0_7_0000_000_0
- 3f_0_0_0000_000_1
- 3f_0_1_0000_000_1
- 3f_0_2_0000_000_1
- 3f_0_3_0000_000_1
- 3f_0_4_0000_000_1
- 3f_0_5_0000_000_1
- 3f_0_6_0000_000_1
- 3f_0_7_0000_000_1
在模拟结束时,您会看到之前的 77% 总线利用率现在是 87!
如果您仍然需要更高的效率,您可以选择 1024 或 2048 字节的大数据包,或者考虑手动刷新。
请注意: Xilinx 不鼓励绕过控制器刷新,因为我们不确定您是否能够满足影响数据可靠性的 Jedec 自动刷新时序。
从控制器端,您可以更改 nBANk_MACH 并查看性能的改进。
但是,这可能会影响您的设计时序,请参考 (Xilinx答复36505) 有关 nBANk_MACH 的详细信息
打开 core_name_mig_sim.v file 并将参数 nBANK_MACHS 从 4 更改为 8,然后重新运行仿真。 要使参数值在硬件中生效,需要更新core_name_mig.v file.
我使用了相同的模式,我们得到了 87% 的总线利用率(图 -12)。
当 nBANK_MACHS 设置为 8 时,效率现在为 90%。
另请注意,½ 和 ¼ 控制器由于其延迟会对效率产生负面影响。
对于前者ample,因为我们只能每 4 个 CK 周期发送一次命令,所以在遵守最小 DRAM 时序规范时有时会有额外的填充,这会降低理论上的效率。
尝试不同的控制器以找到适合您的效率要求的控制器。
参考资料
- Zynq-7000 AP SoC 和 7 系列 FPGA MIS v2.3 [UG586]
- Xilinx MIG 解决方案中心 http://www.xilinx.com/support/answers/34243.html
修订记录
13/03/2015 – 初始版本
PDF下载: Xilinx DDR2 MIG 7 性能评估指南