DDR核心和事务调度程序(DDRC)

news2024/11/13 12:52:37

DDR Core and Transaction Scheduler (DDRC)是内存管理系统中一个关键组件,它主要负责管理和调度对DDR(Double Data Rate,双倍数据率)内存的读写操作。这个组件对于确保系统能够高效地访问内存至关重要,特别是在处理多个并发内存请求时。
DDRC由未决读写事务的队列和从队列中弹出并将下一个事务发送到DDR PHY的调度器组成。在DDRI和DDRC之间,有仲裁逻辑来决定下一个将哪个事务发送到DDRC。

行(Row)、Bank和列(Column)地址映射

DDRC负责将PS(Processing System)和PL(Programmable Logic)AXI主设备使用的字节可寻址的物理地址映射到DDR的行(Row)、Bank和列(Column)地址。这种地址映射具有一定的可配置性,允许用户根据特定的数据访问模式进行优化,以提高DDR的利用率并减少页面和行变更的开销。

许多地址重映射组合不可用,特别是完整的存储体行列映射。

地址映射器负责将线性的请求地址(通常来自PS或PL的AXI主设备)映射到DRAM的实际地址上。这个映射过程通过选择AXI地址中的特定位来对应DRAM地址中的每一位来实现。然而,要使整个可用的地址空间对用户完全可访问,必须确保DRAM地址中的每一位都是由AXI地址中唯一的一位来确定的,即不能有两位DRAM地址位由AXI地址中的同一位来同时决定。

在DDR控制器(DDRC)中,DRAM行(Row)、Bank和列(Column)地址的每一位都通过相应的寄存器向量与AXI地址的某一位相关联,这些寄存器向量通常包括DRAM_addr_map_bankDRAM_addr_map_rowDRAM_addr_map_col。这种映射机制允许用户根据需要配置AXI地址空间如何映射到DRAM的物理地址空间上。对于每个DRAM地址位(无论是行、Bank还是列),其关联的AXI地址位是通过将给定寄存器的内部基址与为该寄存器编程的值相加来确定的。这个过程可以用以下公式来描述:

[internal base] + [register value] = [AXI address bit number]

例如,从reg_ddrc_addmap_col_b3的描述中可以看出,该寄存器确定了DRAM列位4的映射,其内部基址为6。当使用全数据总线时,DRAM列位4由以下决定:

[internal base] + [register value]

如果reg_ddrc_addmap_col_b3寄存器被编程为2,则AXI地址位为:

6 + 2 = 8

换句话说,发送到DRAM的列地址位4被映射到AXI地址位*_ADDR[8]。

在半总线宽度模式(包括ECC)下,所有列位左移一位。在这种情况下,reg_ddrc_addmap_col_b2确定DRAM列地址位4的映射。在全总线宽度的情况下,reg_ddrc_addmap_col_b3确定DRAM列地址4。

DDRC仲裁

DDRC Arbitration(DDRC仲裁)主要涉及在DDR(Double Data Rate,双倍数据速率)内存系统中,对多个访问请求进行管理和调度,以确保数据访问的有序性和高效性。

DDRC仲裁分为三个阶段(见图10-5):

  • 第一阶段是AXI读/写端口仲裁
  • 第二阶段是读写比赛的获胜者
  • 第三阶段是事务调度程序

优先级、老龄计数器和紧急信号

DDR控制器仲裁是基于老化循环的。循环机制循环扫描所有请求设备,并在再次为同一设备提供服务之前为所有未完成的请求提供服务。老化机制测量每个请求等待的时间,并为等待时间较长的请求分配更高的优先级。
每个DDRC读写端口都被分配了一个10位优先级值(如寄存器axi_priority_wr_port0-3和axi_priority _rd_port0-3)。此值用作倒计时老化计数器的初始值。因此,在任何时刻,较低的老化计数器值都优先于较高的值。
此外,每个DDRC读写端口都有一个紧急输入信号。此信号可重置老化计数器。当断言紧急时,该端口的老化计数器会重置,立即使该端口的优先级最高。紧急位的来源可通过SLCR主机可编程寄存器(DDR_urgent_SEL)选择为以下之一:

  • 端口AXI接口中4位QoS信号的最高有效位(除用于CPU和APU使用的内存端口0)
  • 可编程SLCR寄存器值(DDR_URGENT)
  • PL信号DDRARB[3:0]位之一

虽然优先级值本质上是静态的,但可以操纵紧急比特和QoS信号动态。

页面匹配

为了提高DDR利用率,将每个新请求的地址与前一个请求的地址进行比较。DDRC倾向于接收与前一个请求位于同一页面的新请求。内存端口比较地址以确定是否存在页面匹配。只要继续有页面点击,仲裁器选择的端口就会继续获得优先级(优先级0)。它们将与优先级为0的其他端口竞争。

页面大小由page_MASK(所有位都是掩码的32位寄存器)定义,并且始终是地址对齐的。为了正常运行,软件必须对page_MASK中的页面大小进行编程,以匹配DDR内存的大小。将此寄存器设置为0将禁用仲裁的页面匹配步骤。

老化计数器

当请求处于挂起状态且未得到服务时,会启用递减老化计数器。此计数器的起始值从优先级寄存器中的10位值加载(axi_priority_<rd/wr>_port<n>,有8个寄存器,每个端口一个)。当请求得到处理时,计数器会重新加载。此计数器的值用于帮助指示AXI内存端口的优先级。此计数器的数值越低,优先级越高。当优先级达到0时,请求具有最高优先级。

出于仲裁目的,仅使用最高位的5位来区分端口之间的优先级。这使仲裁机制保持在可管理的大小和延迟,同时仍然理解每个端口基于年龄的优先级的近似值。

在正常使用模式下,建议启用老化功能。禁用老化可能会导致低优先级端口的过度延迟/饥饿。

第一阶段——AXI端口仲裁

八个端口(四个读端口和四个写端口)竞争以使DDRC接受他们的请求。仲裁器根据许多因素批准请求。读和写请求被同等对待,这意味着它们经过相同的仲裁。每个端口都保持一个优先级,该优先级从预设状态稳定地移动到最高状态或0。此机制对于保持端口上的最小带宽非常重要。每个端口也有不同的方式来通知紧急情况,无论是基于每个事务(QoS)还是针对多个事务。对于低延迟主设备来说,每个事务的紧迫性可能很好。

图10-6所示的优先级具有以下逻辑。如果老化计数器中有优先级为0或0的端口(最高优先级),则获胜。如果没有优先级为0的端口,仲裁将检查正在服务的端口是否具有页面匹配。如果没有页面匹配,则老化计数器中的最低值获胜。如果老化计数器中的最低值出现平局,则使用循环来解决任何平局。

第二阶段——读与写

读取和写入在DDR Core中都有一个队列。然后,这些队列中的条目争夺下一级仲裁,如图10-7所示。

如图10-7所示,仲裁的这一阶段从老化计数器开始。如果存在优先级为0的同类交易,则获胜。例如,如果一个读取赢得了最后一轮仲裁,并且有一个优先级为0的读取,则它获胜。如果不存在优先级为0的同一类型的事务,并且存在优先级为零的另一类型的交易,则获胜。如果队列中没有优先级0,则它将保持相同类型的事务。在上述所有情况下,在选择任何请求之前,都会进行适当的信用可用性检查。

高优先级读取端口

在进入仲裁的第三阶段之前,需要描述DDRC的一个特征,即高优先级读取。HPR或高优先级读取功能允许将DDRC内的读取数据队列(32个字)拆分为两个单独的队列,分别用于低优先级和高优先级。四个读取端口中的每一个都可以被分配低或高优先级。默认情况下,此功能处于禁用状态。使用时,高优先级读取设备不会因低优先级设备的读取数据速率(可能较慢)而减慢速度。在典型的用例中,HPR在端口0(CPU)上启用,从而降低了CPU的平均读取延迟。读取数据队列的分割不必是两个相等的部分。因此,为CPU提供了一个小队列,以绕过较大的队列,为需要较低延迟的读取提供服务。图10-8显示了读取队列的分割位置。

这可以通过将AXI端口的reg_arb_set_hpr_rd_port<n>位设置为1'b1来更改(见AXI_priority_<rd/wr>_port<n>寄存器)。DDRC默认配置为仅服务LPR。默认情况下,读取的CAM只能为LPR提供服务。读取的CAM总深度为32(始终为ECC分配一个插槽)。ddrc ctrl_reg1寄存器中的reg_ddrc_lpr_num_entrys寄存器字段指定了为lpr保留的条目数。取31并减去reg_ddrc_lpr_num_entrys,得到为HPR保留的条目数。
如果端口配置为HPR端口,则有必要更改REG_DDRC_LPR_NUM_ENTRIES字段,以避免信用机制中的死锁。

第三阶段——交易状态

事务状态是事务进入DDR PHY和DDR设备之前的最后一个仲裁阶段。可以读取或写入事务状态。要更改事务状态,必须不再有该类型的事务,否则可能会有其他类型的关键事务。图10-9显示了用于此的简单状态机。

事务状态保持不变,直到另一种类型的事务变得关键或不再有这种类型的事务。状态机默认为读取状态。表10-4显示了队列中的事务如何从正常状态变为关键状态。

表10-4:事务存储状态转换
正常关键此事务存储的一个事务一直处于挂起状态,并且在32个周期计时器的*_max_starve_x32个脉冲计数内未得到服务。
关键硬非关键*_xact_run_length此事务存储已处理的事务数。
硬非关键正常*_在这种状态下已经过了min_non-critical循环数。

以低优先级读取事务存储为例,预计事务存储通常基于以下信号独立运行:

  • lpr_max_starvex32
  • lpr_xact_run_length
  • lpr_min_non-critical

DDRC ctrl_reg2寄存器中的reg_arb_go2critical_en字段使仲裁器能够将co_gs_go2critical_*信号驱动到DDRC。AXI上有侧带信号(awurgent 和 arurgent)驱动co_gs_go2critical_*信号。如果任何端口断言其紧急侧带信号,并且启用了此功能,则仲裁器向控制器断言相应的co_gs_go2critical_*信号。

在控制器内部,该信号的断言导致状态机从一个状态切换到另一个状态。例如,如果DDRC当前正在为读取提供服务,并且co_gs_go2critical_wr变为高,则控制器会忽略正常的状态切换方法(饥饿计数器等),并跳到为写入提供服务。控制器中有一个寄存器,用于控制在切换到另一种命令类型之前,为当前命令类型提供服务的时间(ddrc ctrl_reg2中的reg_ddrc_go2critical_hysteresis字段)。

总之,此go2critical功能用于控制器中,可确保在具有超高优先级的事务的读写之间快速切换。

注意:

  1. 正常编程条件预计为reg_ddrc_preform_Write=0。(这是DRAM_param_reg4寄存器中的一个位字段)这意味着当空闲控制器接收到读取请求时,总是会立即提供服务。此外,通常希望将reg_ddrc_rdwr_idle_gap(此字段位于ddrc_ctrl寄存器中)设置为非常低的数字(如0、1或2),以确保写入不会在空闲的控制器中持续任何时间,从而浪费带宽。(这里的权衡是,通过更快地为写入提供服务,在写入后立即向控制器发出的读取可能会导致额外的延迟,从而允许对写入进行服务并扭转总线局面。)
  2. 由于向控制器发出的所有请求都保证了顺序,因此写入延迟不应成为系统设计的问题。(如果后续读取需要写入数据,控制器会在为读取提供服务之前自动强制将写入数据输出到DRAM。)

读优先级管理

通常在读取模式下,高优先级读取请求比低优先级读取请求更适合服务。然而,如果低优先级读取事务存储是关键的,而高优先级读取事务存储器不是,那么低优先级读取请求比高优先级读取请求更可取。这可以防止低优先级读取的饥饿。

写入组合

写入组合功能允许将对同一地址的多次写入合并为对DRAM的一次写入。当新写入与CAM中的排队写入冲突时:

  • 如果启用了写合并,DDRC会用新写的数据覆盖旧写的数据,并且只执行一个写事务(写合并)。
  • 如果禁用写组合,DDRC将遵循以下操作顺序:
  1. 将新的写入事务保存在临时缓冲区中
  2. 将流控制应用回核心,以防止更多事务到达
  3. 刷新包含冲突事务的内部队列,直到该事务得到处理
  4. 接受新交易并取消流量控制
信用机制

DRAM控制器采用信用机制来确保缓冲区不会溢出(未决DDR事务)。向控制器发出请求的接口只能请求已被授予信用或队列中开放插槽的命令。

以下三种命令类型的积分分别跟踪:

  • 高优先级读取
  • 低优先级读取

每种命令类型的信用点数(credits)是根据一定的规则独立计算的。这些规则旨在管理接口向控制器发送请求的能力,确保不会因请求过多而导致控制器过载。

  1. 初始状态:接口开始时拥有零个信用点数。这意味着在没有从DRAM控制器接收到任何信用点数之前,接口不能发送任何命令请求。
  2. 信用点数的发放:当DRAM控制器的复位信号被释放(即去断言)后,控制器会根据需要向接口发放信用点数。这通过在每个时钟上升沿上断言(即激活)相应的*_credit信号来实现,其中*代表不同类型的命令。对于每种命令类型,都有一个独立的信用点数计数器。每当相应的*_credit信号被断言时,对应类型的信用点数计数器就会增加。
  3. 发送请求:当某种类型的信用点数计数器大于零时,接口可以向DRAM控制器发送该类型的请求。这表示接口有足够的“权限”或“信用”来发送这种类型的命令。每次向控制器发送请求时,与该请求类型相关的信用点数计数器就会减少。这是为了确保接口不会发送超出其被授权范围的请求数量。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1956953.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

实验15.多线程调度

简介 实验.多线程调度 内核线程 1.在时钟中断函数中处理中&#xff0c;减少当前线程pcb的tick&#xff0c;tick为0则启动调度2.调度&#xff0c;把当前线程pcb放入就绪对立队尾&#xff0c;把就绪线程队首拿出来执行主要代码 引导 省略内核 list.h #ifndef __LIB_KERNEL_…

【GoodERP更新日志】增加采购发票、销售发票 批量抵扣记账 批量撤销入账 功能

开源项目GoodERP更新-2024年7月29日 本次提交合并增加的功能或解决的问题&#xff1a; 1、增加采购发票、销售发票 批量抵扣记账 批量撤销入账 功能&#xff08;增加上了批量抵扣记账&#xff08;会检查发票号、开票日期有没有填写上&#xff09;、批量撤销入账 两个批量功能…

H616设计时候存在的问题

1.存在大量孤铜的问题&#xff1a; 这种情况是绝对不允许的&#xff0c;但是GBA焊盘打大量的过孔会出现很多这样的孤铜&#xff1a; 解决办法&#xff1a; 像这种出现大量重复焊盘的&#xff0c;用导线连接起来&#xff0c;之后铺铜形成铜皮&#xff0c;再在这个小铜皮上面打…

用frp内网穿透https网站

场景说明 在微信小程序上线测试的时候&#xff0c;自主开发的后端服务在公司局域网&#xff0c;小程序前端在微信公众平台只支持配置https协议的域名来访问服务端。公司一直在使用frp内网穿透工具实现公网访问公司局域网服务&#xff0c;因此&#xff0c;研究如何实现frp代理h…

低代码平台飞书apaas

1. 低代码平台 1.1 概述 低代码是无需编码&#xff08;0 代码&#xff09;或通过少量代码就可以快速生成应用程序的开发平台。 通过可视化进行应用程序开发的方法&#xff0c;具有不同经验水平的开发人员可以通过图形化的用户界面&#xff0c;使用拖拽组件和模型驱动的逻辑来…

BIM、数字孪生、可视化一结合,我就知道这大屏效果稳稳的啦

在日常的项目中&#xff0c;经常会用到上述三个方面的能力结合&#xff0c;比如智慧工地、智慧楼宇、智慧园区等项目&#xff0c;本文就分享一批这方面的精彩作品。 BIM&#xff08;建筑信息模型&#xff09;、数字孪生和可视化大屏可以结合起来&#xff0c;为建筑行业和工程管…

C语言中的二维数组

文章目录 &#x1f34a;自我介绍&#x1f34a;二维数组&#x1f34a;代码实战 你的点赞评论就是对博主最大的鼓励 当然喜欢的小伙伴可以&#xff1a;点赞关注评论收藏&#xff08;一键四连&#xff09;哦~ &#x1f34a;自我介绍 Hello,大家好&#xff0c;我是小珑也要变强&…

AI 绘画是否符合当代主流审美?

在当今时代&#xff0c;AI 绘画成为了一个备受关注的热门话题。那么&#xff0c;AI 绘画是否符合当代主流审美呢&#xff1f; AI 绘画有着诸多符合当代审美的特质。它能展现出独特的视觉效果&#xff0c;风格丰富多样&#xff0c;如后现代风格、奇幻风格等等&#xff0c;足以满…

前端必备基础【网络通信】(2024最新版)

Ajax Asynchronous Javascript and XML 的缩写&#xff0c;是使用 JS 发起网络通信的技术统称&#xff0c;具体步骤为&#xff1a; 创建 XMLHttpRequest 实例发出 HTTP 请求接收服务器传回的数据更新网页数据&#xff08;通常是部分内容&#xff0c;而不是整个网页&#xff09…

B端:导航条就框架提供的默认样式吗?非也,看过来。

导航条不一定必须使用框架提供的默认样式&#xff0c;你可以根据项目需求和设计风格进行自定义。通过使用框架提供的自定义选项、CSS样式覆盖、自行设计或者使用其他UI库或组件&#xff0c;你可以实现独特且符合需求的导航条样式。 下面发一些参考给友友们&#xff0c;可以让设…

请你谈谈:vue的渲染机制(render)- 2举例说明问题

如何在 Vue 的 render 函数中使用 createElement 方法来创建虚拟节点&#xff08;VNode&#xff09;。这里是一个稍微整理后的示例&#xff0c;它直接对应于你提供的注释和代码片段&#xff0c;但作为一个完整的 render 函数的一部分&#xff0c;可能位于一个 Vue 组件的 scrip…

关于ITSS认证-IT服务工程师、IT服务项目经理常见问题解答!

TSS&#xff0c;即信息技术服务标准&#xff08;Information Technology Service Standards&#xff0c;简称ITSS&#xff09;&#xff0c;是一套系统化的信息技术服务规范。 它全面规定了信息技术服务产品及其组成要素&#xff0c;旨在指导标准化的信息技术服务实施&#xff…

企业微信开发智能升级:AIGC技术赋能,打造高效沟通平台

文章目录 一、AIGC在企业微信开发中的核心价值1. 智能化客服体验2. 自动化工作流程3. 个性化内容推荐4. 深度数据分析与洞察 二、使用AIGC进行企业微信开发的实践路径1. 需求分析与场景定义2. 技术选型与平台搭建3. 模型训练与调优4. 接口对接与功能集成5. 测试与优化 《企业微…

css各种使用案例合集(一)

1、文字不换行 场景1&#xff1a;使 div 标签的文字内容不换行 代码示例&#xff1a; <div class"nowrap-div">这是一段很长的文字&#xff0c;我们不会让它换行。</div> .nowrap-div { white-space: nowrap; } 2、步骤条 场景2&#xff1a;特殊样式的…

【模拟电路】电与磁的关系,电感与震荡电路

文章目录 前言电与磁的关系电感及其应用电感的电路符号 震荡电路及其作用震荡电路的画法 总结 前言 在电子技术的世界中&#xff0c;电与磁的关系是理解许多电路和设备工作原理的基础。电与磁不仅在理论上紧密相连&#xff0c;在实际应用中也发挥着重要作用。电感器和震荡电路…

新学年即将到来,IT管理员面临一系列挑战

新学年即将到来&#xff0c;学校的IT管理员们又将迎来一场风暴般的挑战。你知道吗&#xff1f;许多教育机构在管理学生账户和访问权限方面都面临着巨大的困难。随着数字化学习的普及&#xff0c;简化和安全的账户管理需求比以往任何时候都更加迫切。本文将详细探讨学生账户管理…

java使用hutool工具判断ip或者域名是否可用,java使用ping判断ip或者域名是否可用

1.导入hutool工具 <dependency><groupId>cn.hutool</groupId><artifactId>hutool-all</artifactId><version>5.8.16</version></dependency>2.复制以下代码直接运行 import cn.hutool.core.net.NetUtil;public class Test {p…

python爬虫的基础知识

1.学习爬虫的好处 提升编程技能&#xff1a;爬虫开发需要掌握编程基础&#xff0c;特别是网络请求、HTML/CSS/JavaScript解析、数据存储和异常处理等技能。通过学习爬虫&#xff0c;你可以巩固和提升你的编程技能&#xff0c;特别是Python等编程语言的应用能力。 数据驱动决策…

LitCTF2024赛后web复现

复现要求&#xff1a;看wp做一遍&#xff0c;自己做一遍&#xff0c;第二天再做一遍。&#xff08;一眼看出来就跳过&#xff09; 目录 [LitCTF 2024]浏览器也能套娃&#xff1f; [LitCTF 2024]一个....池子&#xff1f; [LitCTF 2024]高亮主题(划掉)背景查看器 [LitCTF 2…

VRT: 关于视频修复的模型(论文复现)

VRT: 关于视频修复的模型&#xff08;论文复现&#xff09; 本文所涉及所有资源均在传知代码平台可获取 文章目录 VRT: 关于视频修复的模型&#xff08;论文复现&#xff09;2. 视频修复概述3. 现有方法的挑战与局限性4. VRT模型详解5. 实验与结果6. VRT的优势与创新点7. 实际应…