DDR3 MIG IP核解决方案

input [27:0] app_addr,

input [2:0] app_cmd,

input app_en,

input [511:0] app_wdf_data,

input app_wdf_end,

input app_wdf_wren,

表1-2: example_design/ rtl / traffic_gen目录中的文件

用户接口模块:
提出了用户设计的用户界面
提供了一个简单而又方便的替代本地接口
读取与写入数据缓冲
重新排序读取返回值,以匹配请求的顺序
提出了平面地址空间,并将其转换成SDRAM所需的地址

内存控制器模块:
接收来自用户设计的请求
重新排序请求,以尽量减少死状态,从而达到最高的SDRAM性能
管理SDRAM的row / rank配置
执行高级的SDRAM管理比如刷新、激活或预充电

物理层(PHY)模块:
通过一个简单的界面连接至内存控制器模块,同时将信号转换成实际的信号发送至SDRAM, 反之亦然
在多时钟域内转换和同步控制信号和数据
初始化SDRAM
执行DDR3写操作
执行时钟与读取数据的居中校准

修改示例设计

所提供的example_top设计包含流量生成器模块,并且可以进行修改以调整不同的命令和数据模式。可以在example_top.v / vhd 模块中修改几个高级参数。表1-11 描述了这些参数。

表1-11: 流量发生器参数在example_top模块中设置

1.流量发生器可能支持比7系列内存控制器更多的选项。设置必须与内存控制器中支持的值匹配。

命令模式instr_mode_i ,addr_mode_i ,bl_mode_i 和data_mode_i

所述的traffic_gen 模块可以分别独立地设定。所提供的init_mem_pattern_ctr 模块具有接口信号,允许您使用Vivado调试逻辑核心虚拟I / O(VIO)实时修改命令模式。

这是变化的命令模式:

  1.  将vio\_modify\_enable 设置为1 。
    
  2.  将vio\_addr\_mode\_value 设置为:
    

1:Fixed_address 。

2:PRBS地址。

3:顺序地址。

  1.  将vio\_bl\_mode\_value 设置为:
    

1:固定bl。

2:PRBS bl。如果bl_mode 值设置为2,则addr_mode值被强制为2以生成PRBS地址。

  1.  将vio\_data\_mode\_value 设置为:
    

0:保留。

1:固定数据模式。数据来自fixed_data_i 输入总线。

2:DGEN_ADDR (默认)。该地址被用作数据模式。

3:DGEN_HAMMER 。在DQS的上升沿期间,所有1 s都在DQ引脚上,在DQS 的下降沿期间,所有0 s都在DQ引脚上。

4:DGEN_NEIGHBOR 。除了一个引脚,DQS的上升沿期间,所有1 都位于DQ引脚上。地址确定异常引脚位置。

5:DGEN_WALKING1 。步行1 秒在DQ引脚上。的起始位置1 取决于地址值。

6:DGEN_WALKING0 。步行0 秒在DQ引脚上。起始位置0 取决于地址值。

7:DGEN_PRBS 。一个32级LFSR产生随机数据并以起始地址播种。该数据模式仅适用于PRBS地址模式或顺序地址模式。

修改端口地址空间

可以通过更改顶级测试平台文件中的BEGIN_ADDRESS和END_ADDRESS参数来修改端口的地址空间。这两个值必须设置为与端口数据宽度对齐。PRBS_SADDR_MASK_POS和PRBS_EADDR_MASK_POS这两个附加参数用于默认PRBS地址模式,以确保超出范围的地址不会发送到端口。PRBS_SADDR_MASK_POS创建一个OR掩码,将PRBS生成的地址的值低于BEGIN_ADDRESS的值移入端口的有效地址空间。应将PRBS_SADDR_MASK_POS设置为等于BEGIN_ADDRESS参数的32位值。PRBS_EADDR_MASK_POS创建一个AND掩码,将带有END_ADDRESS以上值的PRBS生成地址向下移动到端口的有效地址空间中。应将PRBS_EADDR_MASK_POS设置为32位值,1 并且所有剩余的位都被设置为0 。表1-12 显示了设置两个掩码参数的一些示例。

             _表1-12:_         **地址空间和PRBS掩码的示例设置**

             _表1-12:_         **地址空间和PRBS掩码的示例设置**

流量发生器信号描述

流量发生器信号如 表1-13所示。

表1-13: 流量发生器信号说明

内存初始化和流量测试流程

上电后,初始化存储器控制块指示流量发生器通过存储器初始化过程用选定的数据模式初始化存储器。

内存初始化

  1.  该data\_mode\_i 输入被设置为选择的数据模式(例如,data\_mode\_i \[3:0\] = 0010 的地址作为数据图案)。
    
  2.  该start\_addr\_i 输入被设置为限定下边界的地址。
    
  3.  该end\_addr\_i 输入被设置为限定所述上边界的地址。
    
  4.  将bl\_mode\_i 设置为01 以从fixed\_bl\_i 输入获取突发长度。
    
  5.  该fixed\_bl\_i 输入设置为16或32。
    
  6.  将instr\_mode\_i 设置为0001 ,以获得从指令fixed\_instr\_i 输入。
    
  7.  该fixed\_instr\_i 输入被设置到存储器设备中的“WR”指令值。
    
  8.  为顺序地址模式填充内存空间,addr\_mode\_i 设置为11 。
    
  9.  该mode\_load\_i 被断言一个时钟周期。
    

当内存空间使用所选数据模式初始化时,初始化内存

控制块指示流量生成器开始通过流量测试流程过程运行流量(默认情况下,addr_mode_i ,instr_mode_i 和bl_mode_i 输入设置为选择PRBS模式)。

交通测试流程

  1.  该addr\_mode\_i 输入被设置为想要的模式(PRBS是默认值)。
    
  2.  该cmd\_seed\_i 和data\_seed\_i 输入值用于内部PRBS发生器设置。其他模式不需要此步骤。
    
  3.  该instr\_mode\_i 输入被设置为想要的模式(PRBS是默认值)。
    
  4.  该bl\_mode\_i 输入被设置为想要的模式(PRBS是默认值)。
    
  5.  该data\_mode\_i 输入应具有相同的值作为详述的存储器模式初始化阶段存储器初始化。
    
  6.  将run\_traffic\_i 输入被触发,才能启动运行流量。
    
  7.  如果在测试期间发生错误(例如,读取的数据与期望的数据不匹配),错误位将被设置,直到应用复位。
    
  8.  接收到错误时,error\_status总线将锁定表1-13,页面66中定义的值。
    

通过一些修改,可以更改示例设计,以便在run_traffic_i 取消断言时动态更改addr_mode_i ,instr_mode_i 和bl_mode_i 。但是,在更改设置后,需要重复执行存储器初始化步骤,以确保将适当的模式加载到内存空间中。

注意:

° 禁用芯片选择选项时,仿真测试平台始终将存储器模型芯片选择位设置为零以实现正确操作。

° 禁用数据遮罩选项时,模拟测试台始终将存储器模型数据遮罩位置零以便正确操作。

7系列FPGA存储器接口解决方案内核如图1-49 所示。

X-Ref目标 - 图1-49

6 \ VWHPFORFNV \ VBFONBSDQGV \ VBFONBQV \VBFONBL5HIHUHQFHFORFNFONBUHIBSDQGFONBUHIBQFONBUHIBLDQGV \ VWHPUHVHWV \VBUVWBQSRUW FRQQHFWLRQVDUHQRWVKRZQLQEORFNGLDJUDP

                                                _图1-49:_        **7系列FPGA存储器接口解决方案**

用户FPGA逻辑

图1-49 所示的用户FPGA逻辑模块是任何需要连接到外部DDR2或DDR3 SDRAM的FPGA设计。用户FPGA逻辑通过用户界面连接到内存控制器。内核提供了一个示例用户FPGA逻辑。

AXI4从接口模块

AXI4从机接口将AXI4事务映射到UI,为存储器控制器提供工业标准总线协议接口。

用户界面块和用户界面

UI块将用户界面呈现给用户FPGA逻辑块。它通过提供一个平坦的地址空间和缓冲读写数据来为本地接口提供一个简单的替代方案。

内存控制器和本地接口

内存控制器(MC)的前端向UI块提供本地接口。本地接口允许用户设计提交内存读取和写入请求,并提供将数据从用户设计移动到外部存储设备的机制,反之亦然。内存控制器的后端连接到物理接口并处理该模块的所有接口要求。内存控制器还提供重新排序选项,对接收到的请求进行重新排序以优化数据吞吐量和延迟。

PHY和物理接口

PHY的前端连接到内存控制器。PHY的后端连接到外部存储设备。PHY处理所有的存储设备信号排序和时序。

IDELAYCTRL

任何使用IDELAY的银行都需要IDELAYCTRL。IDELAY与数据组(DQ)相关联。任何使用这些信号的银行/时钟区域都需要IDELAYCTRL。

MIG工具实例化一个IDELAYCTRL,然后使用IODELAY_GROUP属性(请参阅iodelay_ctrl.v 模块)。基于此属性,Vivado Design Suite可在设计中根据需要正确复制IDELAYCTRL。

IDELAYCTRL参考频率应设为200 MHz。基于

设置了IODELAY_GROUP属性后,Vivado Design Suite将为存在IDELAY块的每个区域复制IDELAYCTRL。当用户自行创建多控制器设计时,每个MIG输出都具有与该基元实例化的组件。这违反了IDELAYCTRL的规则和IODELAY_GRP属性的使用。IDELAYCTRL需要只有一个具有正确设置属性的组件的实例化,并允许工具根据需要进行复制。

用户界面

用户界面如表1-17 所示,并连接到FPGA用户设计以允许访问外部存储设备。

表1-17: 用户界面

表1-17: 用户界面_(续)_

1.该信号仅被引入memc_ui_top 模块级别。该信号只能在启用ECC时使用。

app_addr[ADDR_WIDTH - 1:0]

此输入指示当前正在提交给UI的请求的地址。用户界面汇总外部SDRAM的所有地址字段,并为您提供一个平坦的地址空间。

app_cmd [2:0]

此输入指定当前提交给UI的请求的命令。可用命令如表1-18 所示。表1-18:app_cmd [2:0]的命令

app_en

该输入在请求中闪烁。您必须将所需值应用于app_addr [],app_cmd [2:0]和app_hi_pri ,然后声明app_en 以将请求提交给UI。这通过声明app_rdy来启动UI确认的握手。app_hi_pri

该输入表明当前请求是高优先级。

app_wdf_data[APP_DATA_WIDTH - 1:0]

该总线提供当前正在写入外部存储器的数据。

app_wdf_end

该输入表明当前周期中app_wdf_data []总线上的数据是当前请求的最后一个数据。

app_wdf_mask[APP_MASK_WIDTH - 1:0]

该总线指示将app_wdf_data []的哪些字节写入外部存储器,哪些字节保持其当前状态。字节通过将值“1”设置为app_wdf_mask中的相应位来屏蔽。例如,如果应用程序数据的宽度是256,掩模宽度取的值32。所述的至少显著字节[7:0]的app_wdf_data 使用的[0]位被掩蔽app_wdf_mask 和最显著字节[:248 255]的app_wdf_data 被app_wdf_mask的Bit [31] 掩码。因此,如果必须屏蔽最后一个DWORD,即app_wdf_data的字节0,1,2和3,则应将app_wdf_mask 设置为32’h0000_000F。

app_wdf_wren

该输入表明app_wdf_data []总线上的数据是有效的。

app_rdy

此输出向您显示当前正在提交给UI的请求是否被接受。如果在app_en 被声明后UI没有声明这个信号,那么当前的请求必须重试。在以下情况下,app_rdy 输出未被声明:

                    °          PHY /内存初始化尚未完成

°所有的银行机器都被占用(可以视为命令缓冲区已满)

- 请求读取并且读取缓冲区已满

- 请求写入,并且没有写入缓冲区指针可用

                    °         正在插入定期读取

app_rd_data[APP_DATA_WIDTH - 1:0]

该输出包含从外部存储器读取的数据。

app_rd_data_end

此输出表明 当前循环中app_rd_data []总线上的数据是当前请求的最后一个数据。

app_rd_data_valid

该输出表明app_rd_data []总线上的数据 有效。

app_wdf_rdy

该输出表明写入数据FIFO已准备好接收数据。写入数据在app_wdf_rdy 和app_wdf_wren 都被声明时被接受。app_ref_req

置位时,此高电平有效输入请求存储控制器向DRAM发送刷新命令。它必须脉冲一个周期才能发出请求,然后至少在app_ref_ack 信号被断言以确认请求并指示它已发送之前解除置位。

app_ref_ack

置位时,该高电平有效输入确认刷新请求,并指示该命令已从存储器控制器发送至PHY。

app_zq_req

置位时,该高电平有效输入请求存储控制器向DRAM发送ZQ校准命令。它必须脉冲一个周期才能发出请求,然后至少在app_zq_ack 信号被断言以确认请求并指示它已被发送之前解除置位。

app_zq_ack

置位时,该高电平有效输入确认ZQ校准请求,并指示该命令已从存储器控制器发送至PHY。ui_clk_sync_rst

这是与ui_clk 同步的UI重置。

ui_clk

这是UI的输出时钟。它必须是输出到外部SDRAM的时钟频率的一半或四分之一,这取决于在GUI中选择的2:1或4:1模式。

init_calib_complete

校准完成后,PHY断言init_calib_complete。 在将命令发送到内存控制器之前,应用程序不需要等待init_calib_complete 。

用户界面块

UI块将用户界面呈现给用户设计。它为本地界面提供了一个简单的替代方案。UI块:

• 缓冲区读取和写入数据

• 重新排列读取返回数据以匹配请求顺序

• 提供一个平坦的地址空间并将其转换为SDRAM所需的寻址

本地接口

本地接口连接到FPGA用户设计,允许访问外部存储设备。

命令请求信号

本地接口提供一组请求从存储器控制器读取或写入命令到存储器设备的信号。这些信号汇总在表1-76中。

表1-76: 本地接口命令信号

表1-76: 本地接口命令信号_(续)_

银行,行和列包括用于读取和写入操作的存储器设备上的目标地址。命令是通过使用cmd [2:0]输入到核心来指定的。表1-77 中显示了可用的读取和写入命令。表1-77:存储器接口命令

接受

该信号向用户设计指示核心是否接受请求。当接受信号被断言时,接受在最后一个周期提交的请求,并且用户设计可以继续提交更多请求或闲置。当接受信号无效时,最后一个周期提交的请求不被接受,并且必须重试。

use_addr

用户设计声明use_addr 信号来选通上一个周期中提交给本地接口的请求。

data_buf_addr

用户设计必须包含读取和写入命令期间使用的数据的缓冲区。当一个请求被提交给本地接口时,用户设计必须在缓冲区中指定一个位置来处理请求。对于写入命令,data_buf_addr是包含要写入外部存储器的源数据的缓冲区中的地址。对于读取命令,data_buf_addr是从外部存储器接收读取数据的缓冲区中的地址。处理请求时,核心会回复此地址。

写命令信号

本机接口有内存控制器正在处理写命令时使用的信号(表1-78 )。这些信号连接到用户设计中缓冲区的控制,地址和数据信号。

表1-78: 本地接口写入命令信号

wr_data

该总线是需要写入外部存储器的数据。该总线可以连接到用户设计中缓冲区的数据输出。

wr_data_addr

当提交当前写入请求时,该总线是data_buf_addr 的回显。所述wr_data_addr 总线可以与结合wr_data_offset 信号和施加到在用户设计一个缓冲区的地址输入。

wr_data_mask

该总线是当前正在写入外部存储器的数据的字节使能(数据屏蔽)。当相应的wr_data_mask 信号无效时写入存储器的字节。wr_data_en

置位时,该信号表明内核正在从用户设计中读取写入命令的数据。该信号可以与用户设计中的缓冲器的芯片选择相关联。 wr_data_offset

当突发长度需要多个单周期完成时,该总线用于逐步通过数据缓冲区。该总线与wr_data_addr 结合,可以应用于用户设计中缓冲区的地址输入。

阅读命令信号

当内存控制器正在处理读命令时,本地接口提供一组信号(表1-79 )。这些信号与处理写入命令的信号相似,不同之处在于它们将数据从存储设备传送到用户设计中的缓冲区。

表1-79: 本地接口读取命令信号

rd_data

该总线是从外部存储器读取的数据。它可以连接到用户设计中缓冲区的数据输入。

rd_data_addr

当提交当前读取请求时,该总线是data_buf_addr 的回显。该总线可以与rd_data_offset 信号组合使用,并在用户设计中应用于缓冲区的地址输入。

rd_data_en

该信号指示何时读取请求的rd_data 有效读取数据可用。它可以与用户设计中的缓冲器的芯片选择和写入启用相关联。

rd_data_offset

当突发长度需要多个单周期完成时,该总线用于逐步通过数据缓冲区。该总线可以与rd_data_addr 结合使用,并应用于用户设计中缓冲区的地址输入。

本地接口维护命令信号

表1-80 列出了本地接口维护命令信号。

表1-80: 本地接口维护命令信号

app_ref_req

置位时,此高电平有效输入请求存储控制器向DRAM发送刷新命令。它必须脉冲一个周期才能发出请求,然后至少在app_ref_ack 信号被断言以确认请求并指示它已发送之前解除置位。

app_ref_ack

置位时,该高电平有效输入确认刷新请求,并指示该命令已从存储器控制器发送至PHY。

app_zq_req

置位时,该高电平有效输入请求存储控制器向DRAM发送ZQ校准命令。它必须脉冲一个周期才能发出请求,然后至少在app_zq_ack 信号被断言以确认请求并指示它已被发送之前解除置位。

app_zq_ack

置位时,该高电平有效输入确认ZQ校准请求,并指示该命令已从存储器控制器发送至PHY。

时钟建筑

PHY设计要求使用PLL模块来生成各种时钟,并且全局和本地时钟网络都用于在整个设计中分配时钟。PHY还需要一个与PLL相同的MMCM。该MMCM补偿BUFG到PHY的插入延迟。

时钟生成和分配电路和网络驱动PHY内的块,大致可分为四个独立的通用功能:

• 内部(FPGA)逻辑

• 写路径(输出)I / O逻辑

• 读取路径(输入)并延迟I / O逻辑

• IDELAY参考时钟(200 MHz)

PHY需要一个MMCM和一个PLL。PLL用于生成大多数内部逻辑的时钟,相位器的频率参考时钟以及在多I / O bank实现中保持PHY控制模块同步所需的同步脉冲。

对于400 MHz和933 MHz之间的DDR3 SDRAM时钟频率,相位器参考时钟频率与存储器时钟频率相同。对于400 MHz以下的DDR2或DDR3 SDRAM时钟频率,其中一个移相器频率参考时钟以与存储器时钟相同的频率运行,第二个频率参考时钟必须是存储器时钟频率的2倍或4倍,以满足范围要求400 MHz至933 MHz。两个相位器参考频率必须由相同的PLL产生,因此它们彼此同相。时钟架构的框图如图1-50 所示。freq_refclk的相位根据工作频率和选择用于存储器接口引脚的存储体而变化。

• 在GUI中选择HP存储区时,如果存储频率≥400 MHz,则相位为337.5。

• 当选择HP存储库用于GUI中的存储器接口引脚并且存储频率在200-400 MHz(不包括400 MHz)时,相位为315。

• 对于在GUI中存储器接口引脚选择HP存储区且存储频率≥400 MHz 时的低压器件,相位为337.5。

• 对于低压设备,如果在GUI中为存储器接口引脚选择了HP存储体,并且存储频率在200-400 MHz之间(不包括400 MHz),则相位为

0。

• 如果在GUI中选择HR存储器接口引脚的HR存储区并且存储频率≥400 MHz,则相位为337.5。

• 当在GUI中为存储器接口引脚选择HR库时,存储器频率在200-400 MHz(不包括400 MHz)之间时,相位为0。

PLL乘(M)和除(D)值的默认设置是系统时钟输入频率等于存储器时钟频率。这个1:1的比例是不需要的。PLL输入分频器(D)可以是_7系列FPGA时钟资源用户指南_(UG472)[参考9]中列出的任何值。只要满足PLLE2操作条件并且遵守这里列出的其他约束条件即可。PLL乘法(M)值必须介于1和16之间(含)。对于800 Mb / s及以上,内存时钟的PLL输出分频器(O)必须为2,而对于400至800 Mb / s,则必须为4。PLL VCO频率范围必须保持在硅数据手册中指定的范围内。sync_pulse必须是mem_refclk频率的1/16,并且必须具有1/16或6.25%的占空比。有关PLL物理布局和系统时钟CCIO输入的信息,请参见设计指南,第181页。

内部(FPGA)逻辑时钟

内部FPGA逻辑由DDR2或DDR3 SDRAM时钟频率的一半或四分之一频率的全局时钟资源提供时钟,这取决于在MIG中选择的4:1或2:1模式。该PLL还输出高速DDR2或DDR3内存时钟。

写路径(输出)I / O逻辑时钟

包含数据和控件的输出路径由PHASER_OUT定时。PHASER_OUT为每个字节组向OUT_FIFO和OSERDES / ODDR提供同步时钟。PHASER_OUT为其关联的字节组生成一个字节时钟(OCLK),一个分割字节时钟(OCLKDIV)和一个延迟字节时钟(OCLK_DELAYED)。这些时钟直接由频率基准时钟产生,并且彼此同相。字节时钟与频率参考时钟频率相同,分频字节时钟频率为频率参考时钟的一半。OCLK_DELAYED用于为DQS ODDR 提供时钟,以实现写入DQS 与其相关DQ 之间所需的90°相位偏移位。PHASER_OUT还驱动写入期间生成DQS 所需的信号 ,与数据字节组相关的DQS 和DQ 3状态以及字节组的OUT_FIFO的读取使能。地址/控制的时钟细节和使用PHASER_OUT的写路径如图1-56 和图1-58所示。

读取路径(输入)I / O逻辑时钟

输入读数据通路由PHASER_IN模块提供时钟。PHASER_IN块为每个字节组提供同步时钟给IN_FIFO和IDDR / ISERDES。PHASER_IN模块接收关联字节组的DQS 信号,并为DDR2或DDR3 SDRAM数据采集生成两个延迟时钟:读字节时钟(ICLK)和读分字节时钟(ICLKDIV)。ICLK是频率参考时钟的延迟版本,与相关的DQS 相位一致。ICLKDIV用于将数据捕获到ISERDES中的第一级触发器中。ICLKDIV与ICLK保持一致,是ISERDES中最后一批触发器的并行传输时钟。ICLKDIV还用作与字节组关联的IN_FIFO的写入时钟。PHASER_IN块还驱动字节组的IN_FIFO的写入使能(WrEnable)。使用PHASER_IN的读取路径的时钟细节如图1-58 所示。

IDELAY参考时钟

必须向IDELAYCTRL模块提供200 MHz IDELAY时钟。IDELAYCTRL模块持续校准I / O区域中的IDELAY元素,以应对变化的环境条件。IP内核假定外部时钟信号正在驱动IDELAYCTRL模块。如果PLL时钟驱动IDELAYCTRL输入时钟,则需要将PLL锁定信号合并到IODELAY_CTRL.v 模块内的rst_tmp_idelay 信号中。

这确保了在使用之前时钟稳定。

内存控制器

在核心默认配置中,内存控制器(MC)位于UI块和物理层之间。这是在描绘图1-51 。

存储器控制器是存储器接口的主要逻辑块。内存控制器接收来自UI的请求并将它们存储在逻辑队列中。可以对请求进行重新排序以优化系统吞吐量和延迟。

内存控制器块被组织为四个主要部分:

• 可配置数量的“银行机器”

• 可配置数量的“等级机器”

• 列机器

• 一个仲裁块

银行机器

大部分内存控制器逻辑驻留在银行机器中。银行机器对应于DRAM银行。给定的银行机器在任何给定时间管理单个DRAM银行。但是,银行机器分配是动态的,因此不必为每个实体银行设置银行机器。银行的数量可以配置为在区域和性能之间进行折衷。预充电政策部分对此进行了更详细的讨论。

银行机器分配给特定DRAM组的持续时间与用户请求相耦合,而不是目标DRAM组的状态。当请求被接受时,它被分配给银行机器。当请求完成时,银行机器被释放并且可用于分配到另一个请求。银行机器发出完成请求所需的所有命令。

代表当前的请求,银行机器必须生成行命令和列命令来完成请求。行和列命令是独立的,但必须符合DRAM时序要求。

以下简化的例子说明了这个概念。考虑当单个请求到达时内存控制器和DRAM空闲的情况。游泳池的银行机器:

  1.  接受你的请求
    
  2.  激活目标行
    
  3.  发出列(读取或写入)命令
    
  4.  预充电目标行
    
  5.  返回到闲置的银行机器池
    

当多个请求到达不同的行或银行时,类似的功能适用。

现在考虑一个请求到达的情况,目标是一个开放的DRAM银行,由一个已经活跃的银行机器管理。已经激活的银行机器识别新的请求以同一DRAM存储区为目标并跳过预充电步骤(步骤4 )。位于闲置池头部的银行机器接受新的用户请求并跳过激活步骤(步骤2 )。

最后,当请求全部到达同一个目标DRAM存储区时,前一请求和后一请求都到达,控制器将跳过激活(步骤2 )和预充电(步骤4 )的操作。

银行机器尽可能快地为DRAM银行预充电,除非另一个待处理的请求指向同一银行。预充电政策部分对此进行了更详细的讨论。

为了优化存储器接口吞吐量,列命令可以重新排序。排序算法名义上确保数据一致性。“重新排序” 部分详细介绍了重新排序功能。

排名机器

等级机器对应于DRAM等级。排名机器监控银行机器的活动并跟踪排名或设备特定的时间参数。例如,排名机器监视在时间窗口内发送给排名的激活命令的数量。在发送了允许的激活次数之后,等级机器产生禁止信号,该禁止信号防止银行机器发送任何进一步的激活到等级,直到时间窗口足够地移动以允许更多的激活。等级机器被静态分配给物理DRAM等级。

柱机

单列机器生成管理DQ数据总线所需的定时信息。虽然可以有多个DRAM等级,但由于存在单个DQ总线,所有DRAM等级中的所有列都作为一个单元进行管理。列机器监视银行机器发出的命令,并产生禁止信号返回银行机器,以便有序地使用DQ总线。

仲裁块

仲裁模块接收从银行机器发送命令到DRAM阵列的请求。行命令和列命令是独立仲裁的。对于每个命令机会,仲裁器块选择一行和一列命令以转发到物理层。仲裁块实施循环协议以确保前进。

重新排序

DRAM访问被分成两个准独立部分,即行命令和列命令。每个请求占用一个逻辑队列条目,并且每个队列条目都有一个关联的银行机器。这些银行机器跟踪当前绑定的DRAM等级或银行的状态(如果有的话)。

如有必要,银行机器将尝试代表当前请求激活正确的排名,银行或行。在这样做的过程中,银行机器查看DRAM的当前状态以确定是否满足各种时序参数。最终,所有时间参数都得到满足,并且银行机器进行仲裁以发送激活。仲裁以简单的循环方式完成。仲裁是必要的,因为多个银行机器可能会同时请求发送行命令(激活和预充电)。

并非所有请求都需要激活。如果先前的请求激活了相同的排名,银行或行,则后续请求可能会继承银行机器状态并避免预充/激活罚款。

在必要的等级,银行或行被激活并且满足RAS到CAS延迟时间之后,银行机器尝试发出CAS-READ或CAS-WRITE命令。与行命令不同,所有请求都会发出CAS命令。在仲裁发送CAS命令之前,银行机器必须查看DRAM的状态,DQ总线的状态,优先级和顺序。最终,所有这些因素都假定它们有利的状态,并且银行机器仲裁以发送CAS命令。以类似于行命令的方式,循环法仲裁器使用优先级方案并选择下一列命令。

循环仲裁者本身是重新排序的来源。假设例如一个空闲的存储器控制器在处理刷新时接收到一连串的新请求。这些请求排队并等待刷新完成。在DRAM准备好接收新的激活之后,所有等待请求同时断言它们的仲裁请求。仲裁器独立于请求顺序,仅基于其循环算法选择要发送的下一个激活。列命令可以观察到类似的行为。

控制器支持三种排序模式:

STRICT - 在此模式下,控制器始终按照在本机界面接收到的确切顺序向内存发出命令。这种模式适用于无法从重新排序中获益并且需要最低延迟的情况。由于读取的数据按顺序恢复,因此可能不需要用户界面层,从而减少延迟。该模式对调试也很有用。

NORM - 在此模式下,控制器重新排序读取但不写入以提高效率。所有的写入请求都是在请求顺序中相对于所有其他写入请求发出的,并且给定排名存储区内的请求按顺序退出。这确保了在先前的写入完成之前无法观察稍后写入的结果。

注意: 此重新排序仅在本地界面中可见。用户界面将读取请求重新排列回原始请求顺序。

轻松 -这是控制器的最有效的方式。可以根据需要对写入和读取进行重新排序,以实现排名库队列之间的最大效率。因此在这种模式下,可以观察写入的重新排序。但是,这种行为在用户界面层是不可观察的,因为这些请求在排序库中按顺序退出,并且用户界面层按顺序返回读取请求。因此建议使用RELAXED模式与用户界面层一起使用。

预充电政策

控制器执行积极的预充电策略。当每个事务完成时,控制器检查请求的输入队列。如果当前打开的银行/行的队列中没有请求,则控制器关闭该请求以最小化对银行中其他行的请求延迟。因为队列深度等于银行机的数量,所以通过增加银行机的数量(nBANK_MACHS)可以获得更高的效率。随着这个数量的增加,FPGA逻辑时序变得更具挑战性。在某些情况下,随着银行机器数量的增加和内存时钟频率的降低,整体系统效率会更高。应使用目标设计命令行为来执行仿真,以确定最佳设置。

错误更正代码

内存控制器可选地实现纠错码(ECC)。该代码保护DRAM阵列的内容免受损坏。使用单个错误正确的双重错误检测(SECDED)代码。所有单个错误都会被检测并更正。检测到两位的所有错误。超过两位的错误可能会或可能不会被检测到。

ECC框图如图1-52 所示。这些块在存储器控制器(mc.v )模块中实例化。

ECC模式是可选的,仅支持72位数据宽度。当启用ECC模式时,数据掩码功能被禁用。当启用ECC模式时,总是写入整个DQ宽度。DRAM DM位不能使用,因为ECC在整个DQ数据宽度上运行。称为ECC的顶级参数控制ECC逻辑的添加。当此参数设置为“ON”时,ECC被启用,并且当参数设置为“OFF”时,ECC被禁用。

ECC功能被实现为三个功能块。写入数据合并和ECC生成块。一个读数据ECC解码和正确的块以及一个数据缓冲块,用于临时保存读取 - 修改 - 写入周期的读取数据。第四块生成ECC H矩阵并将这些矩阵传递给ECC生成和校正块。

对于完整突发写入命令,从写入数据缓冲器中获取的数据遍历ECC合并并生成块。该块计算ECC位并将它们附加到数据中。ECC产生步骤给出一个CLK状态。因此,与ECC未启用时相比,数据必须从写入数据缓冲器提前一个状态相对于写入命令获取。在用户界面级别,必须在将命令写入命令缓冲区后不迟于一个状态将数据写入写入数据缓冲区。除早期的数据要求外,ECC不会为写入带来其他性能损失。

对于读取周期,所有数据都会遍历ECC解码修复(ecc_dec_fix )块。当PHY指示phy_rddata_valid 信号的读数据可用性时,该过程开始。解码修复过程分为两个CLK状态。在第一种状态下,计算出综合征。在第二种状态下,对综合征进行解码并执行任何指示的比特翻转(校正)。同样在第二状态中,ecc_single 和ecc_multiple 指示是基于由存储控制器核心逻辑产生的校正子位和定时信号ecc_status_valid 来计算的。核心逻辑还提供了一个ecc_err_addr总线。该总线包含当前读命令的地址。通过查看ecc_single ,ecc_multiple 和ecc_err_addr 总线可以记录错误位置。ECC对读取请求施加了两种状态延迟惩罚。读-修改-写

小于全部DRAM突发的任何写入都必须作为读 - 修改 - 写周期来执行。必须读取指定位置,如果执行任何更正,与写入数据合并,计算ECC,然后写回到DRAM阵列。wr_bytes命令是为ECC操作定义的。当给出wr_bytes命令时,存储器控制器总是执行读 - 修改 - 写周期而不是简单的写周期。字节使能必须始终有效,即使是简单的命令。具体而言,当启用ECC模式时,必须为所有wr命令声明所有字节使能。要部分写入内存,app_wdf_mask需要与ECC启用设计的wr_bytes命令一起驱动。表1-81 显示了启用ECC模式时的可用命令。

             _表1-81:_       **app\_cmd \[2:0\]的命令**

当给出wr_bytes命令时,存储器控制器执行读 - 修改 - 写(RMW)周期。当wr_bytes命令位于队列头部时,它首先发出读取。但与正常的读命令不同,请求保留在队列中。在读响应队列中设置一个位,指示这是一个RMW周期。当读取数据返回该读取命令时,app_rd_data_valid未被声明。相反,ECC被解码,如果有任何更正,则数据被写入ECC数据缓冲器。同时,原始的wr_bytes命令正在检查所有读取的返回值。基于存储在读取返回队列中的data_buf_addr,wr_bytes请求可以确定其读取数据何时在ECC数据缓冲区中可用。现在,wr_bytes请求开始仲裁以发送写入命令。当命令被授予时,

wr_bytes命令的性能明显低于正常写入命令。在最好的情况下,每个wr_bytes命令都需要一个DRAM读取周期和一个DRAM写入周期,而不是简单的DRAM写入周期。读写和写入读取周转惩罚进一步降低吞吐量。

内存控制器最多可缓冲nBANK_MACHS wr_bytes命令。只要这些命令在等级库上不冲突,内存控制器就将读取和写入串起来,避免了大部分的读写和写入读取周转惩罚。但是,如果wr_bytes命令流到一个单独的rank-bank,则每个RMW周期将被完全序列化,并且吞吐量会显着降低。

表1-82 提供了用户界面上ECC端口的详细信息。

表1-82: ECC操作的用户界面

ECC自检功能

在正常操作条件下,写入DRAM阵列的数据的ECC部分在用户界面处不可见。这对于系统自检是有问题的,因为没有办法测试DRAM阵列中对应于ECC位的位。也没有办法发送错误来测试ECC生成和校正逻辑。

由顶级参数ECC_TEST控制,可以生成DRAM阵列测试模式。当ECC_TEST参数为“ON”时,DQ数据总线的整个宽度通过用户界面中的读取和写入缓冲区扩展。当ECC_TEST为“ON”时,ECC校正启用被解除置位。

要将任意数据写入DRAM阵列的数据和ECC部分,将所需数据写入扩展宽度写入数据FIFO,并将数据置为相应的app_raw_not_ecc_i位。app_raw_not_ecc_i是7位宽(2:1模式下是4位),允许在ECC位或正常计算的ECC位中使用原始数据写入各个ECC块。这样,可以将任意的模式写入DRAM阵列。

在读取界面中,扩展数据与正常数据一起出现。但是,校正器可能试图“纠正”读取的数据。在阵列模式测试中这可能不是所期望的,因此应将app_correct_en_i设置为零以禁用更正。

通过以上两项功能,可以实现阵列模式测试。可以通过写入数据模式来测试ECC生成逻辑,但不会声明app_raw_not_ecc_i并取消确认app_correct_en_i。数据和计算出的ECC位可以被读出并进行比较。ECC解码正确的逻辑可以通过断言app_correct_en_i并如上所述写入所需的原始模式来测试。当数据被读回时,可以观察到解码正确的操作。

PHY

PHY为外部DDR2或DDR3 SDRAM提供物理接口。PHY产生连接到存储设备所需的信号时序和顺序。它包含时钟,地址和控制生成逻辑,写入和读取数据路径以及上电后初始化SDRAM的状态逻辑。此外,PHY包含校准逻辑,以执行读写数据路径的定时训练,以考虑系统静态和动态延迟。

PHY是作为DDR2和DDR3 SDRAM的单个HDL代码库提供的。MIG工具通过包含在XDC文件中的顶级HDL参数和约束来定制SDRAM类型和众多其他设计特定参数。

整体PHY架构

7系列FPGA PHY由专用模块和软校准逻辑组成。通过背靠背互连将专用块彼此相邻构建,以最小化构建高性能物理层所需的时钟和数据路径路由。称为字节组时钟的I / O bank内的专用时钟结构有助于最大限度地减少由字节组时钟驱动器驱动的负载数量。字节组时钟由移相器模块驱动。相位器模块(PHASER_IN和PHASER_OUT)是多级可编程延迟线环路,可以动态跟踪DQS信号变化并提供精确的相位调整。

每个7系列FPGA I / O bank都有专用模块,包括一个PHY控制模块,四个

PHASER_IN和PHASER_OUT块,四个IN / OUT_FIFO,IOLOGIC(ISERDES,OSERDES,ODDR,IDELAY)和IOB。一个I / O bank中存在四个字节组,每个字节组包含PHASER_IN和PHASER_OUT,IN_FIFO和OUT_FIFO以及十二个IOLOGIC和IOB块。一个字节组中的十个IOI中的十个用于DQ和DM位,另外两个IOI用于实现差分DQS信号。图1-53 显示了单个I / O bank中可用的专用块。单个PHY控制块与I / O bank内的全部四个PHASER_IN和PHASER_OUT块进行通信。

存储器控制器和校准逻辑与慢速时钟域中的专用PHY进行通信,该时钟域可以是除以4或除以2的版本

DDR2或DDR3内存时钟。PHY设计的框图如图1-54 所示。

存储器初始化和校准序列

在系统复位失效后,PHY执行所需的内存上电初始化序列。接下来是写入和读取数据路径的多个时序校准阶段。校准完成后,PHY指示初始化完成,并且控制器可以开始向存储器发出命令。

图1-55中的校准阶段对应于以下部分:

• 内存初始化,第134页

• PHASER_IN锁相,第135页

• PHASER_IN DQSFOUND校准,第135页

• 写入均衡,第136页

• 多用途寄存器读取调节,第139页

• OCLKDELAYED校准,第140页

• 写入校准,第141页

• 阅读调平,第143页

• PRBS读取调整,第146页

• 动态校准和定期读取行为,第146页

I / O架构

每个7系列FPGA I / O bank都有专用模块,包括一个PHY控制模块,四个

PHASER_IN和PHASER_OUT块,四个IN / OUT_FIFO,ISERDES,OSERDES,ODDR,IDELAY和IOB。单个PHY控制块与I / O bank内的全部四个PHASER_IN和PHASER_OUT块进行通信。

PHY控制块

PHY控制模块是中央控制模块,用于管理FPGA逻辑和专用PHY之间的数据和控制信息流。这包括控制IN / OUT_FIFO和ISERDES / OSERDES之间的地址,命令和数据流以及控制PHASER_IN和PHASER_OUT块。PHY控制模块以缓慢的频率(DDR2或DDR3 SDRAM时钟的1/4频率)PHY_Clk速率从校准逻辑或存储控制器接收控制字,并以DDR2或DDR3 SDRAM时钟速率(CK 频率)。

校准逻辑或存储器控制器通过将地址,命令和数据(用于写入命令)写入到DDR2或DDR3 SDRAM命令序列中来启动

IN / OUT_FIFO,同时或随后将PHY控制字写入PHY控制模块。PHY控制字定义了PHY控制块启动执行DDR2或DDR3 SDRAM命令所执行的一组操作。

PHY控制模块为其I / O bank内的字节组块提供控制接口。当需要多I / O bank实现时,给定I / O bank中的每个PHY控制块控制该bank中的字节组元素。这要求PHY控制块与其相邻的PHY控制块保持同相。中央PHY控制模块被配置为三个I / O bank实施的主控制器。对于两个银行实施,可以将任一PHY控制块指定为主控制器。

PHY控制接口由校准逻辑或存储器控制器用于将PHY控制字写入PHY。该接口中的信号与PHY_Clk同步,如表1-83所示。这是一个基本的FIFO式界面。当PHY_Ctl_WrEn为高且PHY_Ctl_Full为低时,在PHY_Clk的上升沿将控制字写入控制字FIFO。对于多I / O bank PHY,必须将相同的控制字写入每个PHY控制模块才能正常工作。

表1-83: PHY控制接口

PHY控制字分为几个字段,如表1-84 所示。

表1-84: PHY控制字

PHY命令 - 该字段定义了PHY控制模块为管理通过专用PHY的命令和数据流而采取的操作。PHY命令是:

°写入(Wr - 0x01 ) - 该命令指示PHY控制模块读取地址,命令和数据OUT_FIFO,并将从这些FIFO读取的数据传输到与其关联的IOI。

°读(Rd - 0x03 ) - 该命令指示PHY控制模块读取地址,命令OUT_FIFO,并将从这些FIFO中读取的数据传输到与其关联的IOI。另外,从存储器读取的数据在从数据IOI到达数据IN_FIFO之后被传送。

° 非数据(ND - 0x04 ) - 该命令指示PHY控制模块读取地址和命令OUT_FIFO,并将从这些FIFO读取的数据传输到其相关的IOI。

控制偏移量 - 此字段用于控制何时读取地址和命令IN / OUT_FIFO并将其传输到IOI。控制偏移量以DDR2或DDR3 SDRAM时钟周期为单位。

辅助输出 - 该字段用于控制何时使用辅助输出信号(Aux_Output [3:0])。辅助输出可以配置为在读取和写入命令期间激活。定时偏移和持续时间由表1-85,第128页中描述的属性控制。这些输出不被MIG工具生成的DDR2和DDR3接口使用; 它们被设置为0。

低索引(Bank) - 专用PHY具有内部计数器,需要此字段指定用于数据命令的八个DDR2或DDR3 SDRAM存储区中的哪一个。MIG IP内核不使用这些内部计数器; 因此,该字段应该全部为零。

保留 - 该字段必须始终设置为2’b00 。

数据偏移量 - 此字段用于根据PHY命令控制何时读取或写入数据IN / OUT_FIFO。数据偏移量以DDR2或DDR3 SDRAM时钟周期为单位。

Seq - 该字段包含一个序列号,与 来自PLL 的Sync_In 控制信号结合使用,以保持两个或更多PHY控制块执行从各自控制队列读取的命令同步。具有给定seq值的命令必须在Seq字段指定的特定阶段期间由PHY控制块内的命令解析器执行。

CAS插槽 - 存储器控制器用于写入/读取(CAS)命令的插槽号。

事件延迟 - 专用PHY具有内部计数器,需要此字段指定加载到这些计数器的延迟值。事件延迟以DDR2或DDR3 SDRAM时钟周期为单位。MIG IP内核不使用这些内部计数器; 因此,该字段应该全部为零。

激活预充电 - 专用PHY的内部计数器需要此字段指定与事件延迟计数器相关的DDR2或DDR3命令的类型。有效值是:

                    °       00:无动作

                    °       01:激活

                    °       10:预充电

                    °        11:预充/激活。

MIG IP内核不使用这些内部计数器; 因此,该字段应该全部为零。

表1-85: 辅助输出属性

表1-85: 辅助输出属性 (续)

PHY控制模块有多个未启用的计数器,因为在PHY_Clk是DDR2或DDR3 SDRAM时钟频率的1/4或1/2频率时使用同步模式。

在PHY_Clk的每个上升沿,一个PHY控制字被发送到PHY控制模块,其中有四个存储器时钟周期值的命令和一个2位Seq计数值。在同步操作模式下,对控制FIFO的写入使能始终置为有效,并且在有效命令之间不发出操作(NOP)命令。Seq计数必须每增加4个命令序列。Seq字段用于同步跨多个I / O bank的PHY控制块。

DDR3 SDRAM RESET_N 信号直接由FPGA逻辑控制,而不是PHY控制字。RDIMM接口的DDR2 SDRAM RESET_N 信号直接由FPGA逻辑控制,而不是PHY控制字。PHY控制模块与PHASER_OUT一起,在读取和写入命令期间生成写入DQS和DQ / DQS 3态控制信号。

PHY cmd字段是根据四个命令的序列是否具有写入,读取或者两者都不是。如果在命令序列中存在写入请求,PHY cmd字段被设置为写入。如果在命令序列中有读取请求,则它被设置为读取,并且如果在命令序列中既没有写入请求,也没有读取请求,则它被设置为非数据。写入和读取请求不能在四个命令序列中发出。PHY控制字中的控制偏移字段定义何时读取命令OUT_FIFO并将其传输到IOLOGIC。数据偏移量定义何时读取数据OUT_FIFO相对于正在读取的命令OUT_FIFO。对于读取命令,数据偏移在校准期间确定。

命令路径

校准逻辑或存储控制器请求的命令作为PHY控制字发送到PHY控制模块并同时输入到PHY控制模块

地址/控制/命令OUT_FIFO。由于每个PHY_Clk周期需要四个存储器时钟周期,所以每个地址/控制/命令信号必须具有四个存储器时钟周期的值。

有三种类型的命令:

• 使用自动预充电写入命令,包括写入和写入。这两个写命令的PHY控制字中的PHY命令值是相同的(0x01 )。不同的是输入到OUT_FIFO的地址值。在地址OUT_FIFO中使用自动预充电进行写入时,地址位A10为1。

• 使用自动预充电读取命令,包括读取和读取。这两个读命令的PHY控制字中的PHY命令值是相同的(0x11 )。不同的是输入到OUT_FIFO的地址值。地址位A10为1,用于在地址OUT_FIFO中进行自动预充电。

• 非数据命令,包括模式寄存器设置,刷新,预充电,预充所有存储区,激活,不操作,取消选择,ZQ校准长和ZQ校准短。所有这些命令的PHY控制字中的PHY命令值是相同的

(0x100 )。输入到与这些命令关联的OUT_FIFO 的RAS_N ,CAS_N ,WE_N ,库地址和地址值不同。

图1-56 显示了地址/控制/命令路径的框图。OSERDES用于单数据速率(SDR)模式,因为地址/控制/命令是SDR 信号。PHY控制字符合PHY_Ctl_Wr_N 信号,OUT_FIFO符合PHY_Cmd_WrEn 信号。FPGA逻辑无需在PHY控制块的有效命令之间的长时间等待期间发出NOP命令,因为地址/命令专用PHY中的默认值可根据需要设置为0 或1 。

从OUT_FIFO输出到FPGA引脚的地址/命令路径的时序图如图1-57 所示。

数据路径

数据路径包含写入和读取数据路径。7系列FPGA中的数据通路完全采用专用逻辑实现,IN / OUT_FIFO连接FPGA逻辑。除了时钟域交叉之外,IN / OUT_FIFO还提供数据通路串行化/解串行,从而允许FPGA逻辑在DDR2或DDR3 SDRAM时钟的1/4频率的低频下工作。图1-58 显示了数据路径的框图。

input [27:0] app_addr,

input [2:0] app_cmd,

input app_en,

input [511:0] app_wdf_data,

input app_wdf_end,

input app_wdf_wren,

表1-2: example_design/ rtl / traffic_gen目录中的文件

用户接口模块:
提出了用户设计的用户界面
提供了一个简单而又方便的替代本地接口
读取与写入数据缓冲
重新排序读取返回值,以匹配请求的顺序
提出了平面地址空间,并将其转换成SDRAM所需的地址

内存控制器模块:
接收来自用户设计的请求
重新排序请求,以尽量减少死状态,从而达到最高的SDRAM性能
管理SDRAM的row / rank配置
执行高级的SDRAM管理比如刷新、激活或预充电

物理层(PHY)模块:
通过一个简单的界面连接至内存控制器模块,同时将信号转换成实际的信号发送至SDRAM, 反之亦然
在多时钟域内转换和同步控制信号和数据
初始化SDRAM
执行DDR3写操作
执行时钟与读取数据的居中校准

修改示例设计

所提供的example_top设计包含流量生成器模块,并且可以进行修改以调整不同的命令和数据模式。可以在example_top.v / vhd 模块中修改几个高级参数。表1-11 描述了这些参数。

表1-11: 流量发生器参数在example_top模块中设置

1.流量发生器可能支持比7系列内存控制器更多的选项。设置必须与内存控制器中支持的值匹配。

命令模式instr_mode_i ,addr_mode_i ,bl_mode_i 和data_mode_i

所述的traffic_gen 模块可以分别独立地设定。所提供的init_mem_pattern_ctr 模块具有接口信号,允许您使用Vivado调试逻辑核心虚拟I / O(VIO)实时修改命令模式。

这是变化的命令模式:

  1.  将vio\_modify\_enable 设置为1 。
    
  2.  将vio\_addr\_mode\_value 设置为:
    

1:Fixed_address 。

2:PRBS地址。

3:顺序地址。

  1.  将vio\_bl\_mode\_value 设置为:
    

1:固定bl。

2:PRBS bl。如果bl_mode 值设置为2,则addr_mode值被强制为2以生成PRBS地址。

  1.  将vio\_data\_mode\_value 设置为:
    

0:保留。

1:固定数据模式。数据来自fixed_data_i 输入总线。

2:DGEN_ADDR (默认)。该地址被用作数据模式。

3:DGEN_HAMMER 。在DQS的上升沿期间,所有1 s都在DQ引脚上,在DQS 的下降沿期间,所有0 s都在DQ引脚上。

4:DGEN_NEIGHBOR 。除了一个引脚,DQS的上升沿期间,所有1 都位于DQ引脚上。地址确定异常引脚位置。

5:DGEN_WALKING1 。步行1 秒在DQ引脚上。的起始位置1 取决于地址值。

6:DGEN_WALKING0 。步行0 秒在DQ引脚上。起始位置0 取决于地址值。

7:DGEN_PRBS 。一个32级LFSR产生随机数据并以起始地址播种。该数据模式仅适用于PRBS地址模式或顺序地址模式。

修改端口地址空间

可以通过更改顶级测试平台文件中的BEGIN_ADDRESS和END_ADDRESS参数来修改端口的地址空间。这两个值必须设置为与端口数据宽度对齐。PRBS_SADDR_MASK_POS和PRBS_EADDR_MASK_POS这两个附加参数用于默认PRBS地址模式,以确保超出范围的地址不会发送到端口。PRBS_SADDR_MASK_POS创建一个OR掩码,将PRBS生成的地址的值低于BEGIN_ADDRESS的值移入端口的有效地址空间。应将PRBS_SADDR_MASK_POS设置为等于BEGIN_ADDRESS参数的32位值。PRBS_EADDR_MASK_POS创建一个AND掩码,将带有END_ADDRESS以上值的PRBS生成地址向下移动到端口的有效地址空间中。应将PRBS_EADDR_MASK_POS设置为32位值,1 并且所有剩余的位都被设置为0 。表1-12 显示了设置两个掩码参数的一些示例。

             _表1-12:_         **地址空间和PRBS掩码的示例设置**

             _表1-12:_         **地址空间和PRBS掩码的示例设置**

流量发生器信号描述

流量发生器信号如 表1-13所示。

表1-13: 流量发生器信号说明

内存初始化和流量测试流程

上电后,初始化存储器控制块指示流量发生器通过存储器初始化过程用选定的数据模式初始化存储器。

内存初始化

  1.  该data\_mode\_i 输入被设置为选择的数据模式(例如,data\_mode\_i \[3:0\] = 0010 的地址作为数据图案)。
    
  2.  该start\_addr\_i 输入被设置为限定下边界的地址。
    
  3.  该end\_addr\_i 输入被设置为限定所述上边界的地址。
    
  4.  将bl\_mode\_i 设置为01 以从fixed\_bl\_i 输入获取突发长度。
    
  5.  该fixed\_bl\_i 输入设置为16或32。
    
  6.  将instr\_mode\_i 设置为0001 ,以获得从指令fixed\_instr\_i 输入。
    
  7.  该fixed\_instr\_i 输入被设置到存储器设备中的“WR”指令值。
    
  8.  为顺序地址模式填充内存空间,addr\_mode\_i 设置为11 。
    
  9.  该mode\_load\_i 被断言一个时钟周期。
    

当内存空间使用所选数据模式初始化时,初始化内存

控制块指示流量生成器开始通过流量测试流程过程运行流量(默认情况下,addr_mode_i ,instr_mode_i 和bl_mode_i 输入设置为选择PRBS模式)。

交通测试流程

  1.  该addr\_mode\_i 输入被设置为想要的模式(PRBS是默认值)。
    
  2.  该cmd\_seed\_i 和data\_seed\_i 输入值用于内部PRBS发生器设置。其他模式不需要此步骤。
    
  3.  该instr\_mode\_i 输入被设置为想要的模式(PRBS是默认值)。
    
  4.  该bl\_mode\_i 输入被设置为想要的模式(PRBS是默认值)。
    
  5.  该data\_mode\_i 输入应具有相同的值作为详述的存储器模式初始化阶段存储器初始化。
    
  6.  将run\_traffic\_i 输入被触发,才能启动运行流量。
    
  7.  如果在测试期间发生错误(例如,读取的数据与期望的数据不匹配),错误位将被设置,直到应用复位。
    
  8.  接收到错误时,error\_status总线将锁定表1-13,页面66中定义的值。
    

通过一些修改,可以更改示例设计,以便在run_traffic_i 取消断言时动态更改addr_mode_i ,instr_mode_i 和bl_mode_i 。但是,在更改设置后,需要重复执行存储器初始化步骤,以确保将适当的模式加载到内存空间中。

注意:

° 禁用芯片选择选项时,仿真测试平台始终将存储器模型芯片选择位设置为零以实现正确操作。

° 禁用数据遮罩选项时,模拟测试台始终将存储器模型数据遮罩位置零以便正确操作。

7系列FPGA存储器接口解决方案内核如图1-49 所示。

X-Ref目标 - 图1-49

6 \ VWHPFORFNV \ VBFONBSDQGV \ VBFONBQV \VBFONBL5HIHUHQFHFORFNFONBUHIBSDQGFONBUHIBQFONBUHIBLDQGV \ VWHPUHVHWV \VBUVWBQSRUW FRQQHFWLRQVDUHQRWVKRZQLQEORFNGLDJUDP

                                                _图1-49:_        **7系列FPGA存储器接口解决方案**

用户FPGA逻辑

图1-49 所示的用户FPGA逻辑模块是任何需要连接到外部DDR2或DDR3 SDRAM的FPGA设计。用户FPGA逻辑通过用户界面连接到内存控制器。内核提供了一个示例用户FPGA逻辑。

AXI4从接口模块

AXI4从机接口将AXI4事务映射到UI,为存储器控制器提供工业标准总线协议接口。

用户界面块和用户界面

UI块将用户界面呈现给用户FPGA逻辑块。它通过提供一个平坦的地址空间和缓冲读写数据来为本地接口提供一个简单的替代方案。

内存控制器和本地接口

内存控制器(MC)的前端向UI块提供本地接口。本地接口允许用户设计提交内存读取和写入请求,并提供将数据从用户设计移动到外部存储设备的机制,反之亦然。内存控制器的后端连接到物理接口并处理该模块的所有接口要求。内存控制器还提供重新排序选项,对接收到的请求进行重新排序以优化数据吞吐量和延迟。

PHY和物理接口

PHY的前端连接到内存控制器。PHY的后端连接到外部存储设备。PHY处理所有的存储设备信号排序和时序。

IDELAYCTRL

任何使用IDELAY的银行都需要IDELAYCTRL。IDELAY与数据组(DQ)相关联。任何使用这些信号的银行/时钟区域都需要IDELAYCTRL。

MIG工具实例化一个IDELAYCTRL,然后使用IODELAY_GROUP属性(请参阅iodelay_ctrl.v 模块)。基于此属性,Vivado Design Suite可在设计中根据需要正确复制IDELAYCTRL。

IDELAYCTRL参考频率应设为200 MHz。基于

设置了IODELAY_GROUP属性后,Vivado Design Suite将为存在IDELAY块的每个区域复制IDELAYCTRL。当用户自行创建多控制器设计时,每个MIG输出都具有与该基元实例化的组件。这违反了IDELAYCTRL的规则和IODELAY_GRP属性的使用。IDELAYCTRL需要只有一个具有正确设置属性的组件的实例化,并允许工具根据需要进行复制。

用户界面

用户界面如表1-17 所示,并连接到FPGA用户设计以允许访问外部存储设备。

表1-17: 用户界面

表1-17: 用户界面_(续)_

1.该信号仅被引入memc_ui_top 模块级别。该信号只能在启用ECC时使用。

app_addr[ADDR_WIDTH - 1:0]

此输入指示当前正在提交给UI的请求的地址。用户界面汇总外部SDRAM的所有地址字段,并为您提供一个平坦的地址空间。

app_cmd [2:0]

此输入指定当前提交给UI的请求的命令。可用命令如表1-18 所示。表1-18:app_cmd [2:0]的命令

app_en

该输入在请求中闪烁。您必须将所需值应用于app_addr [],app_cmd [2:0]和app_hi_pri ,然后声明app_en 以将请求提交给UI。这通过声明app_rdy来启动UI确认的握手。app_hi_pri

该输入表明当前请求是高优先级。

app_wdf_data[APP_DATA_WIDTH - 1:0]

该总线提供当前正在写入外部存储器的数据。

app_wdf_end

该输入表明当前周期中app_wdf_data []总线上的数据是当前请求的最后一个数据。

app_wdf_mask[APP_MASK_WIDTH - 1:0]

该总线指示将app_wdf_data []的哪些字节写入外部存储器,哪些字节保持其当前状态。字节通过将值“1”设置为app_wdf_mask中的相应位来屏蔽。例如,如果应用程序数据的宽度是256,掩模宽度取的值32。所述的至少显著字节[7:0]的app_wdf_data 使用的[0]位被掩蔽app_wdf_mask 和最显著字节[:248 255]的app_wdf_data 被app_wdf_mask的Bit [31] 掩码。因此,如果必须屏蔽最后一个DWORD,即app_wdf_data的字节0,1,2和3,则应将app_wdf_mask 设置为32’h0000_000F。

app_wdf_wren

该输入表明app_wdf_data []总线上的数据是有效的。

app_rdy

此输出向您显示当前正在提交给UI的请求是否被接受。如果在app_en 被声明后UI没有声明这个信号,那么当前的请求必须重试。在以下情况下,app_rdy 输出未被声明:

                    °          PHY /内存初始化尚未完成

°所有的银行机器都被占用(可以视为命令缓冲区已满)

- 请求读取并且读取缓冲区已满

- 请求写入,并且没有写入缓冲区指针可用

                    °         正在插入定期读取

app_rd_data[APP_DATA_WIDTH - 1:0]

该输出包含从外部存储器读取的数据。

app_rd_data_end

此输出表明 当前循环中app_rd_data []总线上的数据是当前请求的最后一个数据。

app_rd_data_valid

该输出表明app_rd_data []总线上的数据 有效。

app_wdf_rdy

该输出表明写入数据FIFO已准备好接收数据。写入数据在app_wdf_rdy 和app_wdf_wren 都被声明时被接受。app_ref_req

置位时,此高电平有效输入请求存储控制器向DRAM发送刷新命令。它必须脉冲一个周期才能发出请求,然后至少在app_ref_ack 信号被断言以确认请求并指示它已发送之前解除置位。

app_ref_ack

置位时,该高电平有效输入确认刷新请求,并指示该命令已从存储器控制器发送至PHY。

app_zq_req

置位时,该高电平有效输入请求存储控制器向DRAM发送ZQ校准命令。它必须脉冲一个周期才能发出请求,然后至少在app_zq_ack 信号被断言以确认请求并指示它已被发送之前解除置位。

app_zq_ack

置位时,该高电平有效输入确认ZQ校准请求,并指示该命令已从存储器控制器发送至PHY。ui_clk_sync_rst

这是与ui_clk 同步的UI重置。

ui_clk

这是UI的输出时钟。它必须是输出到外部SDRAM的时钟频率的一半或四分之一,这取决于在GUI中选择的2:1或4:1模式。

init_calib_complete

校准完成后,PHY断言init_calib_complete。 在将命令发送到内存控制器之前,应用程序不需要等待init_calib_complete 。

用户界面块

UI块将用户界面呈现给用户设计。它为本地界面提供了一个简单的替代方案。UI块:

• 缓冲区读取和写入数据

• 重新排列读取返回数据以匹配请求顺序

• 提供一个平坦的地址空间并将其转换为SDRAM所需的寻址

本地接口

本地接口连接到FPGA用户设计,允许访问外部存储设备。

命令请求信号

本地接口提供一组请求从存储器控制器读取或写入命令到存储器设备的信号。这些信号汇总在表1-76中。

表1-76: 本地接口命令信号

表1-76: 本地接口命令信号_(续)_

银行,行和列包括用于读取和写入操作的存储器设备上的目标地址。命令是通过使用cmd [2:0]输入到核心来指定的。表1-77 中显示了可用的读取和写入命令。表1-77:存储器接口命令

接受

该信号向用户设计指示核心是否接受请求。当接受信号被断言时,接受在最后一个周期提交的请求,并且用户设计可以继续提交更多请求或闲置。当接受信号无效时,最后一个周期提交的请求不被接受,并且必须重试。

use_addr

用户设计声明use_addr 信号来选通上一个周期中提交给本地接口的请求。

data_buf_addr

用户设计必须包含读取和写入命令期间使用的数据的缓冲区。当一个请求被提交给本地接口时,用户设计必须在缓冲区中指定一个位置来处理请求。对于写入命令,data_buf_addr是包含要写入外部存储器的源数据的缓冲区中的地址。对于读取命令,data_buf_addr是从外部存储器接收读取数据的缓冲区中的地址。处理请求时,核心会回复此地址。

写命令信号

本机接口有内存控制器正在处理写命令时使用的信号(表1-78 )。这些信号连接到用户设计中缓冲区的控制,地址和数据信号。

表1-78: 本地接口写入命令信号

wr_data

该总线是需要写入外部存储器的数据。该总线可以连接到用户设计中缓冲区的数据输出。

wr_data_addr

当提交当前写入请求时,该总线是data_buf_addr 的回显。所述wr_data_addr 总线可以与结合wr_data_offset 信号和施加到在用户设计一个缓冲区的地址输入。

wr_data_mask

该总线是当前正在写入外部存储器的数据的字节使能(数据屏蔽)。当相应的wr_data_mask 信号无效时写入存储器的字节。wr_data_en

置位时,该信号表明内核正在从用户设计中读取写入命令的数据。该信号可以与用户设计中的缓冲器的芯片选择相关联。 wr_data_offset

当突发长度需要多个单周期完成时,该总线用于逐步通过数据缓冲区。该总线与wr_data_addr 结合,可以应用于用户设计中缓冲区的地址输入。

阅读命令信号

当内存控制器正在处理读命令时,本地接口提供一组信号(表1-79 )。这些信号与处理写入命令的信号相似,不同之处在于它们将数据从存储设备传送到用户设计中的缓冲区。

表1-79: 本地接口读取命令信号

rd_data

该总线是从外部存储器读取的数据。它可以连接到用户设计中缓冲区的数据输入。

rd_data_addr

当提交当前读取请求时,该总线是data_buf_addr 的回显。该总线可以与rd_data_offset 信号组合使用,并在用户设计中应用于缓冲区的地址输入。

rd_data_en

该信号指示何时读取请求的rd_data 有效读取数据可用。它可以与用户设计中的缓冲器的芯片选择和写入启用相关联。

rd_data_offset

当突发长度需要多个单周期完成时,该总线用于逐步通过数据缓冲区。该总线可以与rd_data_addr 结合使用,并应用于用户设计中缓冲区的地址输入。

本地接口维护命令信号

表1-80 列出了本地接口维护命令信号。

表1-80: 本地接口维护命令信号

app_ref_req

置位时,此高电平有效输入请求存储控制器向DRAM发送刷新命令。它必须脉冲一个周期才能发出请求,然后至少在app_ref_ack 信号被断言以确认请求并指示它已发送之前解除置位。

app_ref_ack

置位时,该高电平有效输入确认刷新请求,并指示该命令已从存储器控制器发送至PHY。

app_zq_req

置位时,该高电平有效输入请求存储控制器向DRAM发送ZQ校准命令。它必须脉冲一个周期才能发出请求,然后至少在app_zq_ack 信号被断言以确认请求并指示它已被发送之前解除置位。

app_zq_ack

置位时,该高电平有效输入确认ZQ校准请求,并指示该命令已从存储器控制器发送至PHY。

时钟建筑

PHY设计要求使用PLL模块来生成各种时钟,并且全局和本地时钟网络都用于在整个设计中分配时钟。PHY还需要一个与PLL相同的MMCM。该MMCM补偿BUFG到PHY的插入延迟。

时钟生成和分配电路和网络驱动PHY内的块,大致可分为四个独立的通用功能:

• 内部(FPGA)逻辑

• 写路径(输出)I / O逻辑

• 读取路径(输入)并延迟I / O逻辑

• IDELAY参考时钟(200 MHz)

PHY需要一个MMCM和一个PLL。PLL用于生成大多数内部逻辑的时钟,相位器的频率参考时钟以及在多I / O bank实现中保持PHY控制模块同步所需的同步脉冲。

对于400 MHz和933 MHz之间的DDR3 SDRAM时钟频率,相位器参考时钟频率与存储器时钟频率相同。对于400 MHz以下的DDR2或DDR3 SDRAM时钟频率,其中一个移相器频率参考时钟以与存储器时钟相同的频率运行,第二个频率参考时钟必须是存储器时钟频率的2倍或4倍,以满足范围要求400 MHz至933 MHz。两个相位器参考频率必须由相同的PLL产生,因此它们彼此同相。时钟架构的框图如图1-50 所示。freq_refclk的相位根据工作频率和选择用于存储器接口引脚的存储体而变化。

• 在GUI中选择HP存储区时,如果存储频率≥400 MHz,则相位为337.5。

• 当选择HP存储库用于GUI中的存储器接口引脚并且存储频率在200-400 MHz(不包括400 MHz)时,相位为315。

• 对于在GUI中存储器接口引脚选择HP存储区且存储频率≥400 MHz 时的低压器件,相位为337.5。

• 对于低压设备,如果在GUI中为存储器接口引脚选择了HP存储体,并且存储频率在200-400 MHz之间(不包括400 MHz),则相位为

0。

• 如果在GUI中选择HR存储器接口引脚的HR存储区并且存储频率≥400 MHz,则相位为337.5。

• 当在GUI中为存储器接口引脚选择HR库时,存储器频率在200-400 MHz(不包括400 MHz)之间时,相位为0。

PLL乘(M)和除(D)值的默认设置是系统时钟输入频率等于存储器时钟频率。这个1:1的比例是不需要的。PLL输入分频器(D)可以是_7系列FPGA时钟资源用户指南_(UG472)[参考9]中列出的任何值。只要满足PLLE2操作条件并且遵守这里列出的其他约束条件即可。PLL乘法(M)值必须介于1和16之间(含)。对于800 Mb / s及以上,内存时钟的PLL输出分频器(O)必须为2,而对于400至800 Mb / s,则必须为4。PLL VCO频率范围必须保持在硅数据手册中指定的范围内。sync_pulse必须是mem_refclk频率的1/16,并且必须具有1/16或6.25%的占空比。有关PLL物理布局和系统时钟CCIO输入的信息,请参见设计指南,第181页。

内部(FPGA)逻辑时钟

内部FPGA逻辑由DDR2或DDR3 SDRAM时钟频率的一半或四分之一频率的全局时钟资源提供时钟,这取决于在MIG中选择的4:1或2:1模式。该PLL还输出高速DDR2或DDR3内存时钟。

写路径(输出)I / O逻辑时钟

包含数据和控件的输出路径由PHASER_OUT定时。PHASER_OUT为每个字节组向OUT_FIFO和OSERDES / ODDR提供同步时钟。PHASER_OUT为其关联的字节组生成一个字节时钟(OCLK),一个分割字节时钟(OCLKDIV)和一个延迟字节时钟(OCLK_DELAYED)。这些时钟直接由频率基准时钟产生,并且彼此同相。字节时钟与频率参考时钟频率相同,分频字节时钟频率为频率参考时钟的一半。OCLK_DELAYED用于为DQS ODDR 提供时钟,以实现写入DQS 与其相关DQ 之间所需的90°相位偏移位。PHASER_OUT还驱动写入期间生成DQS 所需的信号 ,与数据字节组相关的DQS 和DQ 3状态以及字节组的OUT_FIFO的读取使能。地址/控制的时钟细节和使用PHASER_OUT的写路径如图1-56 和图1-58所示。

读取路径(输入)I / O逻辑时钟

输入读数据通路由PHASER_IN模块提供时钟。PHASER_IN块为每个字节组提供同步时钟给IN_FIFO和IDDR / ISERDES。PHASER_IN模块接收关联字节组的DQS 信号,并为DDR2或DDR3 SDRAM数据采集生成两个延迟时钟:读字节时钟(ICLK)和读分字节时钟(ICLKDIV)。ICLK是频率参考时钟的延迟版本,与相关的DQS 相位一致。ICLKDIV用于将数据捕获到ISERDES中的第一级触发器中。ICLKDIV与ICLK保持一致,是ISERDES中最后一批触发器的并行传输时钟。ICLKDIV还用作与字节组关联的IN_FIFO的写入时钟。PHASER_IN块还驱动字节组的IN_FIFO的写入使能(WrEnable)。使用PHASER_IN的读取路径的时钟细节如图1-58 所示。

IDELAY参考时钟

必须向IDELAYCTRL模块提供200 MHz IDELAY时钟。IDELAYCTRL模块持续校准I / O区域中的IDELAY元素,以应对变化的环境条件。IP内核假定外部时钟信号正在驱动IDELAYCTRL模块。如果PLL时钟驱动IDELAYCTRL输入时钟,则需要将PLL锁定信号合并到IODELAY_CTRL.v 模块内的rst_tmp_idelay 信号中。

这确保了在使用之前时钟稳定。

内存控制器

在核心默认配置中,内存控制器(MC)位于UI块和物理层之间。这是在描绘图1-51 。

存储器控制器是存储器接口的主要逻辑块。内存控制器接收来自UI的请求并将它们存储在逻辑队列中。可以对请求进行重新排序以优化系统吞吐量和延迟。

内存控制器块被组织为四个主要部分:

• 可配置数量的“银行机器”

• 可配置数量的“等级机器”

• 列机器

• 一个仲裁块

银行机器

大部分内存控制器逻辑驻留在银行机器中。银行机器对应于DRAM银行。给定的银行机器在任何给定时间管理单个DRAM银行。但是,银行机器分配是动态的,因此不必为每个实体银行设置银行机器。银行的数量可以配置为在区域和性能之间进行折衷。预充电政策部分对此进行了更详细的讨论。

银行机器分配给特定DRAM组的持续时间与用户请求相耦合,而不是目标DRAM组的状态。当请求被接受时,它被分配给银行机器。当请求完成时,银行机器被释放并且可用于分配到另一个请求。银行机器发出完成请求所需的所有命令。

代表当前的请求,银行机器必须生成行命令和列命令来完成请求。行和列命令是独立的,但必须符合DRAM时序要求。

以下简化的例子说明了这个概念。考虑当单个请求到达时内存控制器和DRAM空闲的情况。游泳池的银行机器:

  1.  接受你的请求
    
  2.  激活目标行
    
  3.  发出列(读取或写入)命令
    
  4.  预充电目标行
    
  5.  返回到闲置的银行机器池
    

当多个请求到达不同的行或银行时,类似的功能适用。

现在考虑一个请求到达的情况,目标是一个开放的DRAM银行,由一个已经活跃的银行机器管理。已经激活的银行机器识别新的请求以同一DRAM存储区为目标并跳过预充电步骤(步骤4 )。位于闲置池头部的银行机器接受新的用户请求并跳过激活步骤(步骤2 )。

最后,当请求全部到达同一个目标DRAM存储区时,前一请求和后一请求都到达,控制器将跳过激活(步骤2 )和预充电(步骤4 )的操作。

银行机器尽可能快地为DRAM银行预充电,除非另一个待处理的请求指向同一银行。预充电政策部分对此进行了更详细的讨论。

为了优化存储器接口吞吐量,列命令可以重新排序。排序算法名义上确保数据一致性。“重新排序” 部分详细介绍了重新排序功能。

排名机器

等级机器对应于DRAM等级。排名机器监控银行机器的活动并跟踪排名或设备特定的时间参数。例如,排名机器监视在时间窗口内发送给排名的激活命令的数量。在发送了允许的激活次数之后,等级机器产生禁止信号,该禁止信号防止银行机器发送任何进一步的激活到等级,直到时间窗口足够地移动以允许更多的激活。等级机器被静态分配给物理DRAM等级。

柱机

单列机器生成管理DQ数据总线所需的定时信息。虽然可以有多个DRAM等级,但由于存在单个DQ总线,所有DRAM等级中的所有列都作为一个单元进行管理。列机器监视银行机器发出的命令,并产生禁止信号返回银行机器,以便有序地使用DQ总线。

仲裁块

仲裁模块接收从银行机器发送命令到DRAM阵列的请求。行命令和列命令是独立仲裁的。对于每个命令机会,仲裁器块选择一行和一列命令以转发到物理层。仲裁块实施循环协议以确保前进。

重新排序

DRAM访问被分成两个准独立部分,即行命令和列命令。每个请求占用一个逻辑队列条目,并且每个队列条目都有一个关联的银行机器。这些银行机器跟踪当前绑定的DRAM等级或银行的状态(如果有的话)。

如有必要,银行机器将尝试代表当前请求激活正确的排名,银行或行。在这样做的过程中,银行机器查看DRAM的当前状态以确定是否满足各种时序参数。最终,所有时间参数都得到满足,并且银行机器进行仲裁以发送激活。仲裁以简单的循环方式完成。仲裁是必要的,因为多个银行机器可能会同时请求发送行命令(激活和预充电)。

并非所有请求都需要激活。如果先前的请求激活了相同的排名,银行或行,则后续请求可能会继承银行机器状态并避免预充/激活罚款。

在必要的等级,银行或行被激活并且满足RAS到CAS延迟时间之后,银行机器尝试发出CAS-READ或CAS-WRITE命令。与行命令不同,所有请求都会发出CAS命令。在仲裁发送CAS命令之前,银行机器必须查看DRAM的状态,DQ总线的状态,优先级和顺序。最终,所有这些因素都假定它们有利的状态,并且银行机器仲裁以发送CAS命令。以类似于行命令的方式,循环法仲裁器使用优先级方案并选择下一列命令。

循环仲裁者本身是重新排序的来源。假设例如一个空闲的存储器控制器在处理刷新时接收到一连串的新请求。这些请求排队并等待刷新完成。在DRAM准备好接收新的激活之后,所有等待请求同时断言它们的仲裁请求。仲裁器独立于请求顺序,仅基于其循环算法选择要发送的下一个激活。列命令可以观察到类似的行为。

控制器支持三种排序模式:

STRICT - 在此模式下,控制器始终按照在本机界面接收到的确切顺序向内存发出命令。这种模式适用于无法从重新排序中获益并且需要最低延迟的情况。由于读取的数据按顺序恢复,因此可能不需要用户界面层,从而减少延迟。该模式对调试也很有用。

NORM - 在此模式下,控制器重新排序读取但不写入以提高效率。所有的写入请求都是在请求顺序中相对于所有其他写入请求发出的,并且给定排名存储区内的请求按顺序退出。这确保了在先前的写入完成之前无法观察稍后写入的结果。

注意: 此重新排序仅在本地界面中可见。用户界面将读取请求重新排列回原始请求顺序。

轻松 -这是控制器的最有效的方式。可以根据需要对写入和读取进行重新排序,以实现排名库队列之间的最大效率。因此在这种模式下,可以观察写入的重新排序。但是,这种行为在用户界面层是不可观察的,因为这些请求在排序库中按顺序退出,并且用户界面层按顺序返回读取请求。因此建议使用RELAXED模式与用户界面层一起使用。

预充电政策

控制器执行积极的预充电策略。当每个事务完成时,控制器检查请求的输入队列。如果当前打开的银行/行的队列中没有请求,则控制器关闭该请求以最小化对银行中其他行的请求延迟。因为队列深度等于银行机的数量,所以通过增加银行机的数量(nBANK_MACHS)可以获得更高的效率。随着这个数量的增加,FPGA逻辑时序变得更具挑战性。在某些情况下,随着银行机器数量的增加和内存时钟频率的降低,整体系统效率会更高。应使用目标设计命令行为来执行仿真,以确定最佳设置。

错误更正代码

内存控制器可选地实现纠错码(ECC)。该代码保护DRAM阵列的内容免受损坏。使用单个错误正确的双重错误检测(SECDED)代码。所有单个错误都会被检测并更正。检测到两位的所有错误。超过两位的错误可能会或可能不会被检测到。

ECC框图如图1-52 所示。这些块在存储器控制器(mc.v )模块中实例化。

ECC模式是可选的,仅支持72位数据宽度。当启用ECC模式时,数据掩码功能被禁用。当启用ECC模式时,总是写入整个DQ宽度。DRAM DM位不能使用,因为ECC在整个DQ数据宽度上运行。称为ECC的顶级参数控制ECC逻辑的添加。当此参数设置为“ON”时,ECC被启用,并且当参数设置为“OFF”时,ECC被禁用。

ECC功能被实现为三个功能块。写入数据合并和ECC生成块。一个读数据ECC解码和正确的块以及一个数据缓冲块,用于临时保存读取 - 修改 - 写入周期的读取数据。第四块生成ECC H矩阵并将这些矩阵传递给ECC生成和校正块。

对于完整突发写入命令,从写入数据缓冲器中获取的数据遍历ECC合并并生成块。该块计算ECC位并将它们附加到数据中。ECC产生步骤给出一个CLK状态。因此,与ECC未启用时相比,数据必须从写入数据缓冲器提前一个状态相对于写入命令获取。在用户界面级别,必须在将命令写入命令缓冲区后不迟于一个状态将数据写入写入数据缓冲区。除早期的数据要求外,ECC不会为写入带来其他性能损失。

对于读取周期,所有数据都会遍历ECC解码修复(ecc_dec_fix )块。当PHY指示phy_rddata_valid 信号的读数据可用性时,该过程开始。解码修复过程分为两个CLK状态。在第一种状态下,计算出综合征。在第二种状态下,对综合征进行解码并执行任何指示的比特翻转(校正)。同样在第二状态中,ecc_single 和ecc_multiple 指示是基于由存储控制器核心逻辑产生的校正子位和定时信号ecc_status_valid 来计算的。核心逻辑还提供了一个ecc_err_addr总线。该总线包含当前读命令的地址。通过查看ecc_single ,ecc_multiple 和ecc_err_addr 总线可以记录错误位置。ECC对读取请求施加了两种状态延迟惩罚。读-修改-写

小于全部DRAM突发的任何写入都必须作为读 - 修改 - 写周期来执行。必须读取指定位置,如果执行任何更正,与写入数据合并,计算ECC,然后写回到DRAM阵列。wr_bytes命令是为ECC操作定义的。当给出wr_bytes命令时,存储器控制器总是执行读 - 修改 - 写周期而不是简单的写周期。字节使能必须始终有效,即使是简单的命令。具体而言,当启用ECC模式时,必须为所有wr命令声明所有字节使能。要部分写入内存,app_wdf_mask需要与ECC启用设计的wr_bytes命令一起驱动。表1-81 显示了启用ECC模式时的可用命令。

             _表1-81:_       **app\_cmd \[2:0\]的命令**

当给出wr_bytes命令时,存储器控制器执行读 - 修改 - 写(RMW)周期。当wr_bytes命令位于队列头部时,它首先发出读取。但与正常的读命令不同,请求保留在队列中。在读响应队列中设置一个位,指示这是一个RMW周期。当读取数据返回该读取命令时,app_rd_data_valid未被声明。相反,ECC被解码,如果有任何更正,则数据被写入ECC数据缓冲器。同时,原始的wr_bytes命令正在检查所有读取的返回值。基于存储在读取返回队列中的data_buf_addr,wr_bytes请求可以确定其读取数据何时在ECC数据缓冲区中可用。现在,wr_bytes请求开始仲裁以发送写入命令。当命令被授予时,

wr_bytes命令的性能明显低于正常写入命令。在最好的情况下,每个wr_bytes命令都需要一个DRAM读取周期和一个DRAM写入周期,而不是简单的DRAM写入周期。读写和写入读取周转惩罚进一步降低吞吐量。

内存控制器最多可缓冲nBANK_MACHS wr_bytes命令。只要这些命令在等级库上不冲突,内存控制器就将读取和写入串起来,避免了大部分的读写和写入读取周转惩罚。但是,如果wr_bytes命令流到一个单独的rank-bank,则每个RMW周期将被完全序列化,并且吞吐量会显着降低。

表1-82 提供了用户界面上ECC端口的详细信息。

表1-82: ECC操作的用户界面

ECC自检功能

在正常操作条件下,写入DRAM阵列的数据的ECC部分在用户界面处不可见。这对于系统自检是有问题的,因为没有办法测试DRAM阵列中对应于ECC位的位。也没有办法发送错误来测试ECC生成和校正逻辑。

由顶级参数ECC_TEST控制,可

04-28 18:16