在AXI接口设计中,主端口(Master Port)和从端口(Slave Port)的交互是通过仲裁器(Arbiter)来管理的,以确保多个主设备能够有序地访问共享资源(如DDR内存)。这个过程中,每个AXI主端口都与仲裁器中的一个从端口相关联,并且采用了多种机制来确保数据的有效传输和顺序性。
命令FIFO和RAM的作用
- 命令FIFO:位于每个从端口内部,用于存储AXI命令中的地址、长度和ID信息。这是处理命令的起点,确保命令能够按顺序被处理和转发。
- 写端口RAM:用于存储写数据和字节使能信息。这些数据随后会被发送到DDR控制器进行实际写入操作。
- 读端口RAM:用于存储从核心(Core)返回的读数据。由于读数据可能会乱序到达,这个RAM还承担了数据重排序的功能,以确保数据能够按照AXI规范的要求,以接收命令的顺序返回给主设备。
命令处理和仲裁
当AXI主设备发送命令时,该命令首先被存储在命令FIFO中。一旦在写端口或读端口检测到有效的命令,就会检查命令中的长度字段,并计算出与此命令相关联的请求数量。逻辑电路向仲裁逻辑发送仲裁请求。仲裁逻辑会查看来自所有端口的请求,并一次只向一个端口授予访问权限(grant)。
数据传输
- 当写端口获得仲裁器的授权后,它会生成写地址、写数据指针,并断言命令有效。然后,写数据会被发送到DDR控制器进行存储。
- 当读端口获得授权后,它会生成读地址、读命令长度和读令牌,并断言命令有效。随后,它会等待来自核心的读数据,并使用关联的ID将数据导向正确的读端口。
由于读数据可能会乱序到达,读端口RAM负责将这些数据按照它们被请求的顺序重新排序,以确保它们能够按照AXI规范的要求返回给主设备。
DDRI的方框图
AXI 在与DDR接口(DDRI)交互时,具有一系列特定的支持特性和限制。以下是针对AXI端口到DDRI的支持和不支持的功能列表:
DDRI支持的特性
-
子宽度命令支持:支持字节(Byte)、半字(Half-word)和字(Word)的子宽度命令。这意味着AXI接口可以处理不同数据宽度的传输,增加了灵活性。
-
Sparse AXI写传输支持:支持稀疏AXI写传输,即可以在任何数据节拍中随机地断言/去断言选通信号(strobes)。这允许在写操作中跳过某些数据位,适用于需要精细控制数据写入场景的应用。
-
非对齐传输支持:支持非对齐的传输。非对齐传输是指传输的起始地址不是数据宽度(如32位、64位等)的整数倍。这种支持使得AXI接口可以处理各种复杂的内存访问模式。
DDRI不支持的特性
-
不支持固定突发类型的传输:如果AXI端口接收到固定突发类型的传输,其行为将是未知的。这要求使用AXI接口时,必须遵循非固定突发类型的传输规则。
-
EXCL访问限制:EXCL(Exclusive Access)访问仅支持在单个DDR端口上进行,不支持跨DDR端口的EXCL访问。EXCL访问通常用于需要原子操作的场景,但在此配置下,它仅限于单个DDR端口内部。
-
AWPROT/ARPROT特定位忽略:AWPROT/ARPROT[1]位用于支持TrustZone功能,但AWPROT/ARPROT[0]和AWPROT/ARPROT[2]位被忽略,没有任何效果。这意味着在AXI接口中,关于保护或权限的某些细节可能不会被完全利用或执行。
-
ARCACHE/AWCACHE缓存支持忽略:ARCACHE[3:0]/AWCACHE[3:0](缓存支持)字段被忽略,没有任何效果。这意味着AXI接口在处理缓存相关的事务时,不会根据这些字段来优化其行为或遵循特定的缓存一致性协议。
这些特性和限制是AXI接口与DDRI交互时需要考虑的重要因素。了解并遵守这些规则,可以确保AXI接口的正确运行和高效数据传输。在设计基于AXI的系统时,需要根据实际应用场景和需求,合理选择支持的特性和处理不支持的特性所带来的影响。
TrustZone 配置
TrustZone 是 ARM 架构中的一个安全功能,它允许将硬件和软件资源划分为安全区域和非安全区域,从而增强系统的安全性。在DDR 内存配置中,这种分区机制被应用于 DDR 内存中,允许将 DDR 内存划分为 64 MB 的区块,每个区块都可以被配置为安全区域或非安全区域。
通过系统级控制寄存器来配置 DDR 内存的每个区块是安全还是非安全的。这种配置提供了对内存访问权限的细粒度控制。
- 配置位为0:表示该内存区块是安全的。这意味着只有被授权为安全访问的组件(如安全世界中的操作系统、应用等)才能访问该区域。
- 配置位为1:表示该内存区块是非安全的。非安全世界中的组件(如标准操作系统、应用等)可以访问这些区域,但安全世界中的组件通常无法直接访问它们。
访问控制
如果非安全世界的组件尝试访问被标记为安全的内存区域,将触发一个安全违规。作为响应,系统会向发起请求的主设备返回一个 DECERR(解码错误)响应。
在写操作中,如果尝试将数据写入安全区域而违反了 TrustZone 规则,那么写数据将在发送到控制器之前被屏蔽掉,从而确保数据不会被实际写入到 DRAM 中。
在读操作中,如果尝试从安全区域读取数据而违反了 TrustZone 规则,那么返回的读数据将全部为零。这是一种防止敏感信息泄露到非安全世界中的安全措施。
TrustZone 提供了硬件级别的安全隔离,使得敏感数据和操作可以在一个受保护的环境中执行,而不会影响到非安全区域。这种机制在需要高安全性的应用中尤为重要,如移动支付、数字版权管理、生物识别身份验证等。通过合理配置 DDR 内存的 TrustZone 分区,系统设计师可以确保关键数据和操作的安全性,同时保持非安全区域的灵活性和效率。
DDRC
DDRC管理着待处理的读写事务队列,并通过一个调度器来处理这些队列中的事务,最终将下一个事务发送到DDR的PHY(Physical Layer)层进行实际的内存访问。这种设计确保了DDR内存的访问是有序且高效的。
DDRC内部包含了多个队列,用于存放等待处理的读写事务。这些队列是FIFO(先进先出)队列,保证了事务的按序处理。
调度器负责从队列中取出(pop off)下一个待处理的事务,并根据一定的调度策略(如优先级、轮询等)确定哪个事务应该被发送到DDR PHY进行执行。调度器的设计对于确保系统性能和公平性至关重要。
在DDRI(DDR Interface)和DDRC之间,存在仲裁逻辑(Arbitration Logic)。这个仲裁逻辑的主要作用是决定在多个可能同时请求访问DDR内存的事务中,哪个事务应该被优先发送到DDRC进行处理。仲裁逻辑可以基于多种因素来做出决策,如事务的优先级、请求的紧急程度、系统的负载状况等。
DDRC的工作流程
-
事务发起:当CPU或其他主设备需要访问DDR内存时,它会向DDRI发起一个读写事务请求。
-
事务排队:DDRI接收到事务请求后,会将其放入相应的队列中等待处理。
-
仲裁决策:仲裁逻辑会根据当前的系统状态和事务的属性,决定哪个事务应该被优先处理。
-
事务调度:被选中的事务会被调度器从队列中取出,并准备发送到DDR PHY进行执行。
-
DDR访问:DDR PHY层接收到事务后,会控制DDR内存的实际访问操作,包括地址的选择、数据的读写等。
-
结果反馈:DDR访问完成后,结果会被返回给发起事务的主设备。
通过这种设计,DDRC能够有效地管理DDR内存的访问请求,确保系统的稳定性和性能。仲裁逻辑和调度器的存在使得DDR内存的访问能够按照预定的策略和优先级进行,从而优化了系统的整体表现。
DDRC的方框图
在DDR控制器(DDRC)中,地址映射是一个关键功能,它负责将处理系统(PS)和可编程逻辑(PL)AXI主设备使用的字节可寻址物理地址转换为DDR的Row、Bank和Column地址。这种地址映射具有一定的可配置性,允许用户根据特定的数据访问模式进行优化,以减少页面和行切换的开销,从而提高DDR的利用率。
地址映射的可配置性受到限制,主要是因为不是所有可能的地址重映射组合都是可用的,特别是完全的Bank-Row-Column映射组合可能不可行。地址映射器通过选择AXI地址位来映射到每个适用的DRAM地址位,从而将线性请求地址与DRAM地址相关联。
DDRC的映射规则
-
AXI地址位到DRAM地址位的映射:地址映射器通过选择AXI地址中的特定位来映射到DRAM地址的相应位。这种映射关系是通过配置DDRC中的特定寄存器来实现的。
-
寄存器向量:每个DRAM Row、Bank和Column地址位都与一个寄存器向量相关联,用于确定该地址位在DDRC的DRAM_addr_map_bank、DRAM_addr_map_row和DRAM_addr_map_col寄存器中的AXI源。
-
地址计算:相关的AXI地址位是通过将给定寄存器的内部基址与为该寄存器编程的值相加来确定的。这种计算确保了AXI地址可以正确地映射到DRAM地址上
如下公式所示:
[internal base] + [register value] = [AXI address bit number]
以reg_ddrc_addrmap_col_b3
寄存器为例,这个寄存器负责确定DRAM列地址的第4位的映射,并且它的内部基址是6。当整个数据总线处于使用状态时,DRAM列地址的第4位将由以下决定:
[internal base] + [register value]
6 + 2 = 8
换句话说,发送到DRAM的列地址位4被映射到AXI地址位*_ADDR[8]。在半总线宽度模式(包括ECC)下,所有列位左移一位。在这种情况下,reg_ddrc_addmap_col_b2确定DRAM列地址位4的映射。在全总线宽度的情况下,reg_ddrc_addmap_col_b3确定DRAM列地址4。
- 在半总线宽度模式下,所有的列地址位都会向左移动一位(即左移一位操作),这包括ECC(错误检查和纠正)位(如果系统支持ECC的话)。这种操作是为了适应某些特定的DRAM接口或优化数据访问模式。
reg_ddrc_addrmap_col_b2
寄存器决定了DRAM列地址位4的映射。但是,由于是在半总线宽度模式下,实际上这个寄存器可能对应的是外部地址信号中经过左移一位处理后的某个位。具体来说,如果外部地址信号中的某一位(比如原本是第3位)在经过左移一位后对应于DRAM内部的列地址位4,那么reg_ddrc_addrmap_col_b2
就是这个映射关系的配置点。 - 在全总线宽度模式下,地址映射更为直接,不需要进行额外的左移操作。这意味着外部提供的地址信号直接映射到DRAM内部的相应地址位上。
reg_ddrc_addrmap_col_b3
寄存器在全总线宽度模式下决定了DRAM列地址位4的映射。这里,没有左移操作,所以reg_ddrc_addrmap_col_b3
直接对应于外部地址信号中的第4位(假设地址是从0开始编号的)。
这两种模式的主要区别在于地址映射时是否需要进行左移操作。半总线宽度模式需要左移一位以适应特定的接口或优化,而全总线宽度模式则直接映射,无需额外操作。这种灵活性允许DDR控制器根据具体的硬件设计或性能需求来选择合适的模式。