Node—设备一致性接口(DCP)

设备一致性

指的是在一个计算机系统中,处理器(CPU) ​ 与外部设备 (如DMA控制器、GPU、网络加速器等)在访问共享数据时,能够看到完全相同、最新版本的数据,而不会因为缓存的存在导致数据陈旧或冲突。

您可以把它理解为多方协作时的 "数据版本统一协议"

核心比喻:共同编辑一份共享文档

想象一下,你和几位同事需要共同编辑一份在线文档:

  • 处理器核心 :就像使用离线缓存编辑文档的你。为了速度,你把文档下载到本地编辑,但本地副本可能不是最新的。

  • 主内存 :就像云端的原始文档,是唯一的权威版本。

  • 外部设备:就像另一位同事,他可能直接在线编辑云端文档,或者也有一份自己的本地副本。

如果没有"设备一致性"

  • 你修改了本地缓存,但没同步到云端。同事看到的是旧内容。

  • 同事更新了云端文档,但你的本地缓存还是旧的,你基于旧内容继续工作,导致覆盖冲突。

有了"设备一致性"

  • 系统有一套自动的同步机制。任何一方的修改,要么立即同步到云端并通知他人缓存失效,要么在他人读取前确保从云端拉取最新版本。

  • 最终,所有参与者(CPU和设备)在任何时刻看到的数据视图都是严格一致的

在计算机系统中的具体含义与挑战

在硬件层面,设备一致性主要解决由 "缓存" ​ 和 **"直接内存访问"**​ 带来的核心矛盾:

  1. CPU的缓存:CPU为了性能,将常用数据缓存在高速的L1、L2 Cache中,修改可能暂存于Cache,未立即写回主内存。

  2. 设备的DMA:外设为了效率,通过DMA直接与主内存交换数据,不经过CPU缓存。

这导致了两种典型的数据不一致场景,也正是您之前提到的DCP所解决的:

  • 场景一(设备写,CPU读) :设备通过DMA将新数据写入内存,但CPU Cache中仍是旧数据副本。CPU后续读取会得到过时数据

  • 场景二(CPU写,设备读) :CPU修改了Cache中的数据("脏数据"),但未写回内存。设备从内存DMA读取时,得到未更新的旧数据

如何实现设备一致性?

实现设备一致性需要软硬件协同,主要机制包括:

  • 硬件一致性协议 :这是最先进和高效的方式,例如C908V2的DCP 。它将外设接入处理器的缓存一致性域,使外设能像另一个CPU核心一样,通过硬件协议(如监听总线)自动维护缓存一致性。外设可以发起缓存无效化缓存写回请求。

  • 软件管理 :在缺乏硬件支持时,由操作系统驱动在关键点(DMA开始前/结束后)手动刷新CPU缓存(写回脏数据、无效化旧数据)。这种方式开销大、效率低。

  • 非缓存内存区域 :将设备需要共享的内存区域标记为"非缓存",CPU直接读写该区域内存,不经过缓存。这保证了一致性,但严重牺牲了CPU访问性能

为什么设备一致性至关重要?

  1. 正确性基石:对于存储、网络、图形处理等任务,数据错误是致命的。一致性是系统功能正确的根本保证。

  2. 性能赋能 :它让CPU能安全地、无顾虑地使用高速缓存 ,同时允许外设高效地进行DMA,从而释放CPU负担。没有它,系统只能在"性能低下"和"可能出错"之间二选一。

  3. 异构计算的核心:在现代SoC中,GPU、NPU等加速器与CPU协同处理同一份数据(如图像、张量)。设备一致性是它们高效、无缝协作的基础设施。

设备一致性 的本质是:建立一套规则和硬件机制,确保拥有缓存的CPU和直接访问内存的外设,在并发访问共享数据时,能像访问单一、统一的数据源一样行为正确。 ​ 它不是一个可选功能,而是现代高性能、异构计算系统得以可靠运行的基础支撑技术

DCP

处理器中的设备一致性接口(DCP)是一个关键设计,它的存在主要是为了解决异构计算系统中处理器核心与外设之间数据访问的一致性问题。在现代复杂的片上系统(SoC)中,如果没有这样的接口,系统将面临数据错误、性能下降甚至功能故障的风险。

为什么需要 DCP?------核心原因

1. 解决"内存 vs 缓存"数据不一致的根本矛盾

  • 问题场景:处理器核心为了提升性能,会将频繁使用的数据缓存在 L1/L2 Cache 中。而外设(如 DMA、网络加速器、AI 加速器)通常直接读写主内存(DRAM)。

  • 不一致示例

    • 外设写,核心读:DMA 将新数据从磁盘写入内存,但核心的 Cache 中仍保留着旧数据的副本,导致核心读到过期数据。

    • 核心写,外设读:核心计算后更新了 Cache 中的数据,但尚未写回内存。此时外设直接从内存读取,得到的是旧数据。

  • DCP 的作用 :DCP 为外设提供了一个"窗口",让它能感知并管理处理器的 Cache。外设可以通过 DCP 发起缓存无效化缓存写回请求,确保双方看到的数据视图是同步的。

2. 提升系统性能与效率

  • 避免低效的"绕路":如果没有 DCP,为了保证一致性,软件只能采用两种低效方式:

    • 禁用缓存:将外设访问的内存区域设置为"非缓存",牺牲巨大性能。

    • 软件维护:在每次外设访问前后,由软件手动刷新/无效化缓存,增加延迟和 CPU 开销。

  • DCP 的作用 :将一致性维护任务硬件化、自动化。外设通过 DCP 直接、高效地与缓存子系统交互,大幅减少了软件干预和总线流量,提升了数据传输效率。

3. 适应异构计算与智能外设的趋势

  • 现代外设更智能:如今的外设(如 GPU、NPU、高速网卡)本身可能带有缓存或本地内存,它们与 CPU 协同处理同一份数据。

  • 复杂的数据流:数据可能在 CPU Cache、外设本地存储和主内存之间流动,形成复杂的共享关系。

  • DCP 的作用:DCP 作为标准化的硬件一致性接口,为这些智能外设接入处理器的缓存一致性域提供了"插槽"。它使得 CPU 和外设可以像多个 CPU 核心之间那样,以一套统一的协议(或类似机制)来维护数据一致性,简化了编程模型。

4. 保证系统的正确性与实时性

  • 功能正确性:在涉及安全、金融、控制等关键任务中,数据一致性错误是绝对不允许的。DCP 从硬件层面提供了可靠保障。

  • 实时性:软件维护一致性会引入不可预测的延迟。硬件化的 DCP 操作延迟更确定,有利于满足实时系统的要求。

类比理解

你可以把处理器核心外设想象成两个办公室的同事,需要共同编辑一份文件。

  • 没有 DCP:文件只能放在一个公共档案柜(内存)里。每次有人修改,必须跑去档案柜替换文件,并打电话通知所有人"去档案柜取新文件",非常低效且容易有人拿到旧版本。

  • 有 DCP :每个人桌上都有该文件的缓存副本(Cache)。当一个人修改了自己桌上的副本并通过 DCP 更新后,系统会自动同步其他人的副本,或者标记他们的副本为失效。这样大家总能基于最新版本工作,效率极高。

缓存无效化和缓存写回

想象一下,处理器的CacheCPU的私人工作本主内存共享的公共档案柜。数据不一致就发生在"本子"和"柜子"内容不同步的时候。

操作 目标 解决的问题场景 硬件动作比喻
缓存无效化 作废Cache中的副本 外设更新了数据,但CPU Cache里是旧数据 在私人工作本上,把某一页划个大叉,标记为"此页作废,不可信"。下次需要时,必须去档案柜取新版本。
缓存写回 将Cache脏数据刷到内存 CPU更新了Cache,但外设需要读最新数据 强制把私人工作本上修改过的某一页誊抄回公共档案柜,更新档案柜内容,然后本子上的这一页可以保留或也标记为"已同步"。

详细解释与DCP中的应用

1. 缓存无效化
  • 是什么Invalidate ​ 操作。它告诉处理器的缓存子系统:指定内存地址在Cache中的副本已经"失效"、"过时"了。Cache会将该地址对应的缓存行标记为无效状态。

  • 发生了什么 :仅修改缓存行的状态位 (从"有效"改为"无效"),不移动任何数据。该操作速度极快。

  • 为什么需要(在DCP中) :解决 **"外设写,核心读"**​ 的数据陈旧问题。

  • DCP工作示例

    1. 场景:一个网络加速器(外设)通过DMA将新收到的网络包数据直接写入内存的某个缓冲区。

    2. 风险:CPU的L1/L2 Cache里可能还缓存着该缓冲区地址的旧数据。

    3. DCP操作 :网络加速器在完成DMA写入后,通过DCP接口向处理器发出一个"缓存无效化"请求,指明刚写入的那个内存地址范围。

    4. 结果 :处理器收到请求,立即将Cache中对应地址的缓存行标记为无效。当CPU核心下次读取该网络包数据时,会发生Cache未命中,从而被迫从内存(那里有外设刚写的新数据)中加载最新数据。保证了CPU总能读到最新内容。

2. 缓存写回
  • 是什么Writeback ​ 或 Flush ​ 操作。它强制要求处理器的缓存子系统:将指定内存地址在Cache中已被修改但尚未保存到内存的数据(即"脏数据"),立即写回到主内存中

  • 发生了什么 :硬件会查找Cache,如果找到对应地址的缓存行且其"脏位"被置位(表示数据被CPU修改过),则将该缓存行的数据块传输到主内存。完成后,该缓存行的"脏位"通常被清除。

  • 为什么需要(在DCP中) :解决 **"核心写,外设读"**​ 的数据未同步问题。

  • DCP工作示例

    1. 场景:CPU完成了一帧图像的处理,结果保存在内存的某个帧缓冲区中(实际上,结果可能只更新在Cache里,内存里还是老画面)。现在,显示控制器(如GPU)需要读取这个缓冲区来刷新屏幕。

    2. 风险:显示控制器直接从内存读取,得到的是未更新的旧画面,导致显示错误。

    3. DCP操作 :在启动显示控制器读取之前,软件或控制器本身通过DCP接口向处理器发出一个"缓存写回"请求,指明帧缓冲区的地址范围。

    4. 结果 :处理器收到请求,立即检查并将Cache中所有该区域的"脏"数据块写回内存。确保内存中是最新处理完成的图像数据。随后,显示控制器从内存读到的就是正确的画面。

总结与关联

在SOC中的DCP上下文中:

  • 缓存无效化 ​ 是外设告诉CPU:"我改了内存,你的缓存废了,下次记得重拿。"

  • 缓存写回 ​ 是外设要求CPU:"把你缓存里改好的东西存回内存,我现在要读。"

它们共同构成了硬件一致性协议的基础。DCP接口标准化了外设发起这两种请求的"语言"和"通道",使得外设能够主动、高效地维护与处理器缓存的数据一致性,无需操作系统频繁介入进行低效的软件刷新操作。这正是DCP提升整个异构计算系统性能和可靠性的关键所在。

DCP使用举例

在C908V2的DCP架构中,交互关系:

是"智能外设"利用DCP接口,向"处理器的缓存一致性控制器(或缓存子系统)"发出了"缓存一致性维护请求"。

具体交互三方详解

角色 实体 说明
请求发起方 智能外设 通常是带有DMA能力或本地存储的硬件模块,如: • DMA控制器GPU/显示控制器网络加速器(NIC)AI加速器(NPU)视频编解码器
请求接收与处理方 处理器的缓存一致性控制器 这是处理器内部的一个硬件模块,负责维护所有CPU核心的L1/L2 Cache之间,以及Cache与内存之间的一致性。DCP接口直接连接到这个控制器。
传递的请求 缓存一致性维护命令 主要是两种硬件原语: 1. 缓存无效化请求 2. 缓存写回请求

典型工作流程示例

示例一:外设写入数据后,通知CPU缓存失效
  1. 场景:网络加速器收到一个数据包,通过DMA直接写入内存的接收缓冲区。

  2. 交互

    • 发起方:网络加速器的硬件逻辑。

    • 动作 :在DMA传输完成后,自动 通过其DCP接口发起一个 "缓存无效化请求"

    • 请求内容 : "请将物理地址范围 0xA00000000xA0000FFF在CPU所有Cache中的副本标记为无效。"

    • 接收处理方:处理器的缓存一致性控制器。

    • 结果 :控制器立即在所有CPU Cache中查找并无效化该地址范围内的缓存行。确保后续CPU读取该数据包时,会从内存获取最新内容。

示例二:外设读取数据前,要求CPU提交更新
  1. 场景:CPU完成图像渲染,结果保存在帧缓冲区(数据可能在Cache中)。GPU需要读取该缓冲区显示。

  2. 交互

    • 发起方:GPU的显示控制器硬件。

    • 动作 :在启动读取DMA之前,自动 通过其DCP接口发起一个 "缓存写回请求"

    • 请求内容 : "请将物理地址范围 0xB00000000xB00FFFFF在CPU Cache中所有已修改的(脏)数据写回内存。"

    • 接收处理方:处理器的缓存一致性控制器。

    • 结果 :控制器检查所有Cache,将该地址范围内所有"脏"缓存行的内容写回主内存,并清除脏位。确保GPU随后DMA读取到的是最新渲染结果。

关键要点总结

  1. 发起者是硬件 :请求由外设的硬件逻辑自动发起,无需CPU软件干预。这是高性能的关键。

  2. 目标是缓存系统 :请求发给处理器的缓存一致性控制器,由它来具体执行对L1/L2 Cache的无效化或写回操作。

  3. 请求是标准化的硬件命令:不是软件函数调用,而是通过总线或网络传输的、格式固定的硬件级一致性消息。

  4. 意义 :通过这套机制,外设从被动的"内存访问者"变成了主动的缓存一致性域参与者,能够高效、正确地与CPU协同工作。

简单来说,DCP就是让外设能和CPU的缓存系统"直接对话"的硬件通道,外设通过它向CPU的缓存管理器发出"同步一下数据"的指令,从而在硬件层面自动保障了设备一致性。

DCP要具有那些特点?

支持这些特点是为了确保DCP接口在实际芯片设计中能够实现高性能、高可靠性和易集成性。每一项特点都针对特定的工程挑战和性能目标。

以下是每个特点的必要性解释:

特点 为什么需要支持? 解决了什么问题?
1. 支持AMBA4.0 AXI总线协议 生态系统与兼容性。AXI是业界事实标准的片上互连协议,几乎所有现代外设和互连IP都支持AXI。 使得DCP能够无缝接入基于AXI的SoC系统,外设无需额外的协议转换桥,降低了集成复杂度,提高了互操作性
2. 支持128位总线宽度 带宽与效率。DCP操作的对象是缓存行(Cache Line),其大小通常为64字节。128位(16字节)宽度意味着只需4次突发传输即可完成一整行数据的操作。 最大化数据吞吐量,最小化延迟。更窄的总线(如32位)需要更多传输周期,会成为性能瓶颈;更宽的总线(如256位)则面积开销大,收益递减。128位是性能与面积的平衡点。
3. 支持系统时钟与CPU主时钟的不同频率比 时钟域隔离与灵活性。在复杂的SoC中,外设所在的"系统时钟域"和CPU核心所在的"CPU时钟域"通常由不同的PLL产生,运行频率可能不同(如外设跑在200MHz,CPU跑在1GHz)。 允许DCP接口作为异步时钟域交叉桥 ,使CPU和外设可以独立进行时钟频率优化与电源管理,提升了系统设计的灵活性和能效
4. 所有信号 flopped in/out 时序收敛与可靠性。这意味着在接口的输入和输出边界都对信号进行了寄存器打拍。 改善时序 :打破关键路径,使接口更易于满足建立和保持时间要求,能工作在更高频率。 提高鲁棒性:对输入信号同步化,防止亚稳态传播;对输出信号寄存,提供干净的时序。这是高质量IP设计的标志。
**5. 读写分别最多支持8个并发传输(AxID不同)**​ 并发性能与服务质量。现代高性能外设(如GPU、NPU、多通道DMA)需要同时处理多个独立的数据流。每个唯一的AxID标识一个独立的事务。 支持高并发 :允许外设同时发起多个未完成的一致性请求,极大提升了总线的利用率和整体吞吐量。 保持顺序:协议规定相同ID的事务保持顺序,不同ID的事务可以乱序完成,这兼顾了效率与逻辑正确性。

核心设计思想总结

这些特点共同服务于DCP的两个根本目标:

  1. 提供极高的数据一致性操作带宽和低延迟(通过128位宽、8并发传输、AXI高效协议实现)。

  2. 确保接口在物理上可实现、易集成且稳定可靠(通过支持异步时钟、信号寄存、标准AXI协议实现)。

因此这些特点是为了让"外设直接管理CPU缓存"这一强大功能,能够在一个真实的、高性能的、复杂的芯片系统中稳定且高效地运行所必需的工程实现约束和优化。

在使用AXI4实现DCP接口时的规定

一、为什么对读请求要这样规定?

这些规定的核心逻辑源于内存属性的根本差异,主要分为 Device ​ 和 Normal​ 两种类型,其区别如下:

内存类型 本质 访问特性 设计目标
Device 映射到外设寄存器 访问具有副作用 (如读状态寄存器能清中断),必须严格按程序顺序执行,不可合并、不可推测。 保证功能正确性、原子性
Normal 映射到普通数据内存(如DDR)。 无副作用,允许为提升性能而进行访问优化(如合并、突发、预取)。 追求高带宽、高效率

基于以上本质差异,规定具体如下:

  1. 对Device访问的严格限制(ARLEN=0等)

    • 规定ARLEN=0(单次传输),ARBURST=INCR(仅递增)。

    • 原因 :外设寄存器每次读写都可能改变硬件状态。必须确保每次访问都是精确、原子、按序 的。不允许突发(ARLEN=0)是为了防止一次请求触发多次不可预测的寄存器访问。仅支持INCR模式简化了外设设计。

  2. 对Normal的Non-Cacheable访问的优化支持

    • 规定ARSIZE仅支持 3'b100(即128位,16字节),ARLEN支持0/1/3 (突发长度为1、2、4次传输),ARBURST支持INCRWRAP

    • 原因 :这类访问通常是高效的数据搬运(如DMA传输大数据块)。固定128位宽度与缓存行对齐,支持突发和回环突发传输,能最大化总线利用率,实现高带宽的连续数据读取。

  3. 对Cacheable访问的特定要求

    • 规定ARSIZE仅支持 3'b100(128位),ARLEN支持0/1/3,ARCACHE有特定值。

    • 原因 :这类访问是DCP的核心------用于维护缓存一致性 。读取单位必须是完整的缓存行 (通常为64字节)。通过突发传输(ARLEN=3即4次*128位=64字节)一次性读回整个缓存行,效率最高。ARCACHE属性指示了该访问是可缓存的,并定义了分配、修改策略。

二、都使用在哪些场合?

  1. 访问Device类型的场合

    • 场景外设控制与状态查询

    • 具体操作 :通过DCP读取DMA控制器的状态寄存器、中断标志位,或配置寄存器的回读。此时必须使用ARLEN=0的单次访问,确保每个寄存器操作精确无误。

  2. 访问Normal的Non-Cacheable类型的场合

    • 场景外设与CPU之间的大块数据搬移

    • 具体操作

      • CPU为外设准备数据 :CPU将待处理数据(如网络包、待编码帧)写入一片Non-Cacheable内存,外设通过DCP发起ARLEN=3的突发读,高效取走数据。

      • 外设为CPU提供数据:外设(如传感器接口)将数据写入内存后,CPU通过DCP以突发读方式获取。

    • 为什么是Non-Cacheable:避免数据在Cache中,导致外设与CPU看到的数据不一致。通过硬件一致性接口(DCP)访问,本身就是为了解决这个问题。

  3. 访问Cacheable类型的场合 (DCP最主要的价值体现)

    • 场景主动的缓存一致性维护操作

    • 具体操作

      • 缓存行无效化 :外设更新内存后,需要让CPU缓存失效。它通过DCP发起一个对Cacheable 区域的、带有ARCACHE特定属性的读请求。这个"读"操作的真实目的不是取数据 ,而是将对应缓存行"拉"入一致性域并标记为无效。这就是"缓存无效化请求"的实现方式之一。

      • 缓存行写回 :外设需要CPU的最新数据。它通过DCP发起一个对Cacheable 区域的、带有ARCACHE特定属性(可能指示"写回")的读请求。这会触发CPU将该缓存行的脏数据写回内存,随后外设才能从内存读到新数据。这就是"缓存写回请求"的实现方式之一。

总结

DCP接口对读请求的这些细致规定,是功能正确性、访问效率和硬件一致性维护三大目标的直接体现:

  • 对Device访问的严格限制 ,是为了绝对正确,任何优化都不能以牺牲外设寄存器访问的原子性和顺序性为代价。

  • 对Normal Non-Cacheable访问的优化 ,是为了极致效率,在保证数据一致性的前提下,用最有效的方式搬运大量数据。

  • 对Cacheable访问的针对性设计 ,是DCP的灵魂所在,它使得一个"读请求"被赋予了"缓存管理命令"的语义,让外设能够以标准化、高性能的方式主动维护与CPU缓存的一致性,这是实现硬件级设备一致性的核心机制。

同样的对写请求也有规定:

一、为什么对写请求要这样规定

1. 对 Non-Cacheable 访问​ 的规定
  • 访问 Device 类型

    • 规定AWSIZE支持 1/2/4/8 字节 (3'b0003'b011),AWLEN=0(单次),AWBURST仅支持 INCR

    • 原因 :这与读请求完全一致。外设寄存器的写入通常具有直接的物理效应 (如启动DMA、清中断、发送命令)。因此必须保证每次写入的原子性、精确性和顺序性 。不允许突发写入(AWLEN=0)是为了防止单次事务意外触发多次寄存器操作。支持多种大小(AWSIZE灵活)是为了精确匹配不同位宽的寄存器。

  • 访问 Normal 类型

    • 规定AWSIZE仅支持 128位 (3'b100),AWLEN支持 0/1/3,AWBURST支持 INCRWRAP,地址必须对齐。

    • 原因 :这类写入的核心是高效率、高带宽的数据搬运 。固定为128位宽,与总线宽度和缓存行自然对齐,是数据搬运的最优位宽。支持突发(AWLEN=1/3)和WRAP模式,可以最大化总线利用率,连续写入大块数据。地址对齐要求是高效突发传输的前提。

2. 对 Cacheable 访问​ 的规定
  • 规定AWSIZE仅支持 128位,AWLEN支持 0/1/3,AWBURST支持 INCR/WRAPAWCACHE有特定编码 (4'b1011, 4'b1111, 4'b0111)。

  • 原因

    1. 缓存行操作 :对Cacheable区域的写入,最小操作单位是缓存行 。128位宽度是高效写入/填满一个缓存行的基础。突发传输(AWLEN=3)可以一次性完成整个缓存行(通常64字节)的写入。

    2. 缓存策略控制AWCACHE属性位是关键。它控制着该写入如何影响缓存:

      • 是否分配缓存行 (AWCACHE[0])。

      • 是直写还是写回 (AWCACHE[1])。

      • 等。通过配置这些属性,外设的写入可以精确地控制数据在CPU缓存层次结构中的行为,这是实现一致性协议的基础。

3. 注解部分的关键说明
  • 不支持独占传输、原子操作、Barrier :这明确了DCP接口的功能边界 。它是一个用于高效率、批量化数据传输和一致性维护 的接口,而非一个细粒度的同步原语接口。复杂的同步操作应由CPU通过其他指令完成。

  • 不支持CMO请求 :缓存维护操作(CMO)如明确的无效化/清空指令,很可能是通过前面提到的、对特定Cacheable区域的特殊写入 (带有特定AWCACHE属性)或特殊读请求来间接触发的,而非通过独立的命令。

  • 相同ID不支持Outstanding,不同ID支持8个 :这是AXI协议的典型用法。相同ID 必须保序,限制了流水线深度。不同ID可乱序完成,最多8个未完成请求,这在外设多流水线并发处理数据时至关重要,极大地提升了吞吐量。


二、都使用在哪些场合?

  1. 访问 Device 类型 (Non-Cacheable)

    • 场景外设配置与控制

    • 具体操作

      • 配置DMA的源/目标地址、传输长度。

      • 写入控制寄存器以启动ADC采样、使能中断、复位外设模块。

      • 向通信控制器(如UART、SPI)的数据寄存器写入待发送的数据。

  2. 访问 Normal 类型 (Non-Cacheable)

    • 场景外设向内存输出数据

    • 具体操作

      • DMA传输结果写入:网络控制器将接收到的完整数据包通过DMA写入内存中的接收环缓冲区。

      • 加速器输出写入:GPU渲染完一帧画面,将帧缓冲区数据写入内存;NPU完成计算,将结果张量写入内存。

      • 数据采集:传感器接口(如摄像头CMOS)将采集到的图像数据流式写入内存。

  3. 访问 Cacheable 类型

    • 场景主动的、复杂的一致性操作与数据预置

    • 具体操作

      • 预加载数据到缓存 :外设(如NPU)在开始计算前,可以通过Cacheable写入(并配合特定的AWCACHE属性,如4'b1111表示"写回、可分配"),将待处理的数据"推"入CPU的缓存。这样当CPU稍后需要处理这部分数据时,命中率会极高。

      • 实现复杂的缓存一致性协议 :特定的写入序列(可能结合特定的地址和AWCACHE属性)可以被CPU的缓存控制器解释为一种一致性消息或指令,用于维护更复杂的多设备一致性状态。这是实现硬件一致性协议的关键。

总结

DCP接口对写请求的规定,是其设计哲学在"数据输出"方向的完美体现:

  • 对Device的写入安全第一,规定严格,确保每一次对外设的"触碰"都精准可控。

  • 对Normal NC的写入效率优先,规定宽松,旨在为外设向内存倾泻数据提供一条无阻塞的高速公路。

  • 对Cacheable的写入功能强大 ,通过AWCACHE等属性,将简单的数据写入升维成了一种与CPU缓存子系统进行复杂交互的通信机制,这是DCP实现其核心价值------硬件一致性------的重要途径。

这些规定共同确保了外设不仅能高效地搬移数据 ,还能智能地管理数据在缓存中的状态,从而在保证正确性的前提下,最大化异构计算系统的整体性能。

DCP接口在AXI总线层面的具体行为约束

根据您提供的图片信息,这些注解条目定义了DCP接口在AXI总线层面的具体行为约束和功能边界。每一条都深刻影响了接口的性能、复杂性和使用方式。

1. 读写传输 AxID 均为 16 bits

  • 含义:在DCP接口发起的AXI读(ARID)和写(AWID)请求中,用于标识事务的ID字段宽度均为16位。

  • 定义与目的

    • ID是AXI协议中区分并发事务的标签。不同ID的事务可以乱序完成,相同ID的事务必须按顺序完成。

    • 16位宽度 意味着理论上可以支持高达 65536个独立的"逻辑流"或事务源。这为系统提供了极大的灵活性,允许一个外设内部的不同处理单元、不同通道或不同类型的请求(如数据搬运与控制命令)使用不同的ID,从而最大化总线的利用率和吞吐量。

2. 写传输均支持 Wstrb 任意字节有效

  • 含义 :在AXI写数据传输阶段,WSTRB信号(写选通)的每一位都可以独立设置为有效或无效,以精确控制写入数据的哪些字节。

  • 定义与目的

    • WSTRB信号与 WDATA的每个字节对应。WSTRB[n]为1表示 WDATA[(8n)+7: (8n)]的字节有效,应被写入目标地址。

    • 支持任意字节有效 意味着DCP接口可以进行非对齐写入部分更新 。例如,外设只想更新内存中一个32位数据的低16位,而保持高16位不变,就可以通过设置 WSTRB=4'b0011来实现。这对于寄存器配置、协议包封装等场景至关重要。

3. 所有相同 ID 的请求不支持 OutStanding

  • 含义 :对于具有相同 AxID的所有请求,DCP接口不支持未完成事务。即,在发出一个具有特定ID的请求后,必须等到该请求的响应返回,才能发出下一个具有相同ID的请求。

  • 定义与目的

    • Outstanding​ 指允许在未收到前一个事务响应的情况下,发出后续事务的能力,是提升总线利用率的关键性能特性。

    • 对相同ID禁用此功能 ,是为了简化硬件设计并保证强顺序性。AXI协议规定相同ID的事务必须保序。禁止相同ID的Outstanding,使得接收端(如内存控制器或缓存控制器)无需维护复杂的同ID事务排队和排序逻辑,简化了实现。这通常意味着相同ID的请求序列性能较低,但确定性更强。

4. 不同 ID 的读写请求 OutStanding 均为 8

  • 含义 :对于具有不同 AxID的读请求和写请求,DCP接口分别支持最多 8个​ 未完成事务。

  • 定义与目的

    • 这是对第3点的补充和性能补偿。不同ID的请求可以乱序完成,因此支持Outstanding不会引入复杂的排序问题。

    • 深度为8​ 是一个权衡后的设计:

      • 足够深:可以有效地隐藏内存访问延迟,保持总线繁忙。当一个请求在等待DDR内存的漫长访问时,其他7个请求可以被处理,极大提升了整体吞吐量。

      • 不过度:避免因队列过深而增加硬件面积、功耗和复杂度,也控制了最坏情况下的延迟。

5. 不支持独占式传输

  • 含义 :DCP接口不支持AXI的独占访问(Exclusive Access)传输类型。

  • 定义与目的

    • 独占访问 ​ 是AXI提供的一种用于实现信号量原子读-修改-写的轻量级机制。一个主设备先执行"独占读",随后尝试"独占写",只有在期间没有其他主设备写入该地址时,独占写才会成功。

    • DCP不支持 ,因为它的核心职责是高效的数据搬运和缓存一致性维护,而非细粒度的软件级同步。复杂的同步原语应由CPU通过其原子指令(如RISC-V的A扩展)在更上层实现。这简化了DCP控制器的设计。

6. 不支持 CMO 请求

  • 含义 :DCP接口不支持直接的、显式的缓存维护操作(Cache Maintenance Operation)请求。

  • 定义与目的

    • CMO ​ 通常指类似 CACHE.INVALCACHE.FLUSH这样的明确指令。

    • DCP的设计哲学是"间接"触发缓存操作 ,而非直接支持CMO命令。如前所述,外设通过向特定属性的 Cacheable内存区域发起读写请求 (例如,一个带有特殊ARCACHE属性的读请求),来"间接"触发CPU缓存控制器执行无效化或写回操作。这允许DCP复用标准的数据传输通路来实现一致性功能,硬件设计更统一。

7. 不支持原子操作

  • 含义 :DCP接口不支持AXI定义的原子操作,如原子交换、原子比较交换等。

  • 定义与目的

    • 原子操作​ 保证一个"读-修改-写"序列在执行过程中不可被中断,是多核/多设备同步的基础。

    • DCP不支持 ​ 的原因与"不支持独占传输"类似。原子操作是同步原语 ,逻辑复杂,需要硬件保证原子性。DCP作为数据搬运和一致性通道,其设计目标是最大化带宽和效率,而非提供强同步语义。同步应由CPU负责。

8. 不支持 Barrier 请求

  • 含义 :DCP接口不支持AXI的屏障(Barrier)传输类型。

  • 定义与目的

    • 屏障​ 用于在多个事务之间创建严格的内存顺序点。例如,在屏障之前的所有写操作必须在屏障之后的任何操作开始之前,对所有观察者都可见。

    • DCP不支持 ,因为维护跨多个设备、具有精确顺序的全局内存视图极其复杂。DCP通常依赖于更简单的模型:外设自身保证其事务的顺序 (通过ID),而系统级的全局顺序则由软件通过CPU发出数据同步屏障指令(如FENCE)来确保。这再次简化了DCP硬件的设计复杂度。

了C908V2 DCP接口的能力画像

  1. 它是一个高性能、高并发的数据搬运引擎:拥有宽ID空间、深度为8的不同ID未完成事务、灵活的字节写入,专为大数据量传输优化。

  2. 它是一个简化但高效的一致性维护接口:通过"属性化"的标准内存访问来间接触发缓存操作,而不是支持复杂的显式CMO命令。

  3. 它明确界定了功能范围,不做"瑞士军刀" :将同步 (原子操作、屏障、独占访问)这类复杂功能留给CPU和软件,自己则专注于核心的数据传输与一致性维护职责,从而在性能、面积和复杂度之间取得最佳平衡。

相关推荐
余大大.1 个月前
RDMA-InfiniBand和RoCEv2
数字ic前端