棋子 · 16 小时前

PCIe 学习(三)

2.4 事务路由

讲事务类型的时候提到了事务路由(Transaction Routing)。所谓路由,就是在 PCIe 拓扑结构中,事务如何从请求者正确走到完成者。PCIe 有三种路由方式:地址路由,ID 路由,隐式(Implicit)路由。

2.4.1 地址路由

地址路由好理解,就是按照地址去找。SoC 设计中,地址都被映射到存储器地址空间(Memory Mapped)。那么,接下来的问题是 PCIe 设备的地址从哪里来。这个地址是主机侧的处理器分配的。首先,主机的处理器要知道设备想要展现给主机的空间,然后再结合实际情况分配相应大小的存储空间给设备。这一过程是主机向设备发送配置读取/写入请求完成的,具体放在配置空间章节介绍。

支持地址路由的事务有:

  • 存储读取/写入请求
  • I/O 读取/写入请求
  • 消息请求

需要注意的是,在 Gen 5 的基础规范中特别注明,没有消息事务是使用地址路由的。也就是说消息事务的 TLP Header 中的地址字段要么是保留不用,要么是用作其它用途。这里说的消息事务支持地址路由应该沿用是 Gen 5 之前规范的说法。

2.4.2 ID 路由

Function 是 PCIe 设备中的物理实体,负责完成一项功能。只包含一个 Function 的设备叫做 SFD(Single-Function Device),包含多个 Function 的设备叫做 MFD(Multi-Function Device)。在 PCIe 拓扑结构中,为了区分不同的 Function,每个 Function 被分配了一个唯一的标识 ID,此 ID 是由 8-bit 的总线编号,5-bit 的设备编号,3-bit 的 Function 编号组成。正因为此 ID 是唯一的,所以可以通过 ID 路由方式传输 TLP。

PCI 总线是共享总线,设备编号有其作用。但是 PCIe 是点到点连接,设备编号就没有太大意义了。PCIe 协议推出了 ARI(Alternative Routing-ID, ARI)功能,将 5-bit 的设备编号取消,分配给了 Function。也就是说支持 ARI 的话,此 ID 依然是 16-bit,由 8-bit 总线编号和 8-bit 的 Function 编号组成。在后面分析 ARI 的时候会详细介绍。至此,大家记得 ID 在 PCIe 拓扑结构中是唯一的就可以了。至于主机怎么分配这些编号,留待分析 PCIe 枚举的时候再说。

对于 EP 来说,接到 ID 路由的 TLP 后,判断 ID 值是否与自己的 ID 相同,如果相同就接受此 TLP,并完成相应的动作;如果不同,则拒绝 TLP。

对于 Switch 来说,情况复杂一些。Switch 接到 ID 路由的 TLP 后,判断 ID 值是否与自己的 ID 匹配,如果匹配则接受此 TLP;如果不匹配,则继续判断 ID 值是否在其下游端口的连接的设备的 ID 范围内,如果在则说明 TLP 是发给 Switch 下游的设备,Switch 转发即可。

支持 ID 路由的事务有:

  • 配置读取/写入事务
  • 完成事务

2.4.3 隐式路由

隐式路由,顾名思义,就是不需要指定 TLP 的地址或者 ID。之所以隐式路由不需要地址或 ID,是由 PCIe 拓扑结构决定的。在 PCIe 拓扑结构中,RC 是唯一的根节点,当 EP 或 Switch 想发送消息给 RC,就不需要指明了,只需要向上游端口转发就好了。相反,如果 RC 向 EP/Switch 广播消息,只要不断向下游端口转发。对于本地消息,接收方就是链路对端,因此也不需要地址或者 ID。

对于消息 TLP,Type[2:0]字段用于指示路由方式,除去编码 001b(地址路由)和 010b(ID 路由),其它几种都是隐式路由。还记得前面提到过,Gen 5 中消息事务已不再使用地址路由。

image.png

只有消息事务支持隐式路由。

最后,总结一下 PCIe 中的 TLP 路由方式。

image.png

2.5 虚拟通道

虚拟信道(Virtual Channel,VC)机制支持在 PCIe 拓扑结构中使用 TC 标签来区分数据流量。

VC 的基础是独立的结构资源(队列/缓冲区和相关的控制逻辑)。这些资源用于通过不同 VC 之间完全独立的流量控制。

通过将 TC 映射到 VC 来将数据流量等级与 VC 相关联,这被称为 TC/VC 映射。TC0/VC0 映射是固定的,不可更改的;其它映射可以通过配置软件来设置。

下图是 VC 概念的示意图。在发送端,数据流量被复用到物理链路;在接收端,数据流量被解复用到独立的 VC 路径。

Image

在 Switch 内部,每个端口的虚拟信道都需要专用的物理资源。下图是 Switch 内部虚拟通道的示意图。

Image

2.5.1 虚拟通道 ID (VC ID)

PCIe 端口最多可以支持 8 个 VC,每个端口都是独立配置和管理的。不同 VC 使用唯一的 ID 值来标识。

支持多 VC 的端口需要同时实现 VC 能力结构。对于仅支持默认 TC0/VC0 配置的端口,是否提供这些扩展结构是可选的。配置软件负责为链路两侧的端口匹配 VC 数量。

为端口内的 VC 硬件资源分配 VC ID 的规则如下:

  • 每个端口的 VC ID 分配必须是唯一的,同一个 VC ID 不能分配给同一端口内的不同 VC 硬件资源
  • 链路两侧的两个端口的 VC ID 分配必须相同
  • 如果 MFD 实现 MFVC 能力结构,则其 VC 硬件资源不同于与其 Function 的 VC 硬件资源。VC ID 唯一性要求仍然单独适用于 MFVC 和任何 VC 能力结构
  • VC ID 0 被分配并固定为默认 VC

2.5.2 TC to VC Mapping

除了 TC0 必须映射到 VC0,其它 TC 可以映射到不同的 VC。TC/VC 的映射关系可以由系统软件决定,但必须遵守:

  • 允许将一个或多个 TC 映射到同一个 VC
  • 不允许一个 TC 映射到多个 VC
  • 链路两侧端口的 TC/VC 映射必须相同

下图是 PCIe Gen-5 基本规范中给出的 TC/VC 映射示例。

Image

2.5.3 VC and TC Rules

以下是与 TC/VC 机制的关键规则:

  • 所有设备必须支持 TC0,并且必须实现默认的 VC0
  • 每个虚拟通道都有独立的流量控制
  • 不同 TC 之间不需要保序
  • 不同 VC 之间不需要保序
  • Switch 的对等功能适用于 Switch 支持的所有虚拟信道
  • MFD 在不同 Function 之间的对等功能适用于 MFD 支持的所有虚拟通道
  • TC 未映射到入口端口中任何已启用 VC 的事务被接收设备视为格式错误的 TLP
  • 对于 Switch,TC 未映射到目标出口端口中任何已启用 VC 的事务被视为格式错误的 TLP
  • 对于根端口,TC 未映射到目标 RCRB 中任何已启用 VC 的事务被视为格式错误的 TLP
  • 对于具有 MFVC 能力结构的 MFD,TC 未映射到 MFVC 能力架构中已启用 VC 的事务被视为格式错误的 TLP
  • Switch 必须支持每个端口的独立 TC/VC 映射配置
  • RC 必须支持每个 RCRB、根端口和 RCiEP 的独立 TC/VC 映射配置

2.5.4 VC 能力寄存器

支持多 VC,或者虽然只有一个 VC 但是需要支持 TC 过滤的设备需要实现 VC 能力寄存器,在 6.3.7 章节详细介绍。

Image

2.6 流量控制

2.6.1 基于信用的流量控制

PCIe 最多支持八个虚拟通道,每个虚拟通道负责自己的流量控制。

PCIe 的流量控制基于信用(Credit-Based)机制。在链路初始化阶段,链路的接收端需要向发送端报告自己的接收缓冲区大小,即接收能力,也称作信用值;在链路正常工作期间,接收端需要有规律的向发送端告知当前的接收缓冲区情况。具体做法是通过数据链路层的流量控制 DLLP 来完成。这个 DLLP 无疑是系统开销,但是其不携带有效数据,所以这个 DLLP 很小,只有 8 个符号(Symbol),因此对链路性能的影响可以忽略不记。

参照下图,归纳一下 PCIe 流量控制的基本原理。

PCIe 设备在事务层中实现接收缓冲区(FC Buffer)和流量计数器(FC Counter)。链路双方将自己的接收缓冲区的信用值发送给对方。发送端通过自己的计数器记录接收端的信用值,发送端在发送事务前需要检查计数器,如果发现计数器为 0,说明接收端的缓冲区已满,不能再接收。此时发送端需要等待接收端处理事务;如果计数器不为 0,发送端将事务向数据链路层传递,发送端每发送一个事务,计数器减 1。

Image

流量缓冲区分为三类:

  • P:用于 MWr 和 Msg
  • NP:用于 MRd,CfgRd,CfgWr,IORd,IOWr,AtomicOp
  • CPL:用于 Cpl,Cpld

上述三种类型中,又按照 Header 和 Data 进行拆分。因此,缓冲区有六种:PH,PD,NPH,NPD,CPLH,CPLD。

Image

Header 的 1 个信用值对应 4DW(Completion)或者 5DW(Request);Data 的 1 个信用值对应 4DW,即数据信用是 16-Byte 对齐的。

PCIe 5.0 中,TLP 消耗信用的情况见下表:

Image

2.6.2 流量控制初始化

当系统平台上电,物理层完成链路训练后,物理层通过 LinkUp 信号通知数据链路层。随后,开始流量控制初始化。虚拟通道 VC0 是默认启用的,所以 VC0 的流量控制初始化是自动完成的,无需软件接入。其它虚拟通道的初始化需要等待配置软件启用这些 VC。

Image

数据链路层的控制和管理状态机(Data Link Control and Management State Machine,DLCMSM)负责流量控制初始化的过程。

Image

    1. 系统复位,DLCMSM 进入 DL_Inactive 状态。当物理层完成链路训练,拉高 LinkUp 信号,DLCMSM 检测到 LinkUp 后跳转到 DL_init 状态。DL_init 有两个子状态 FC_INIT1,FC_INIT2。
    1. 在 FC_INIT1 阶段,设备连续发送 3 个 InitFC1 流量控制 DLL 的序列,报告其接收缓冲区大小。按照协议,其报告的先后顺序是 Posted,Non-Posted,Completion。当设备发送了自己的值并接收到足够多次的完整序列来确信这些值被正确地看到,它就可以退出 FC_INIT1 进入 FC_INIT2 了。下图中的 HdrFC 字段表示的是 Header 流量控制信用值,DataFC 表示的是 Data 流量控制信用值。

Image

    1. 在 FC_INIT2 阶段,设备连续发送 InitFC2 DLLP。由于设备已经注册了来自链路对端的信用值,因此在等待查看 InitFC2s 时可以忽略任何对端发过来的 InitFC1s。两步初始化过程将不强制链路的两端在相同时间内完成初始化。
    1. 当设备完成 FC_INIT2,进入 DL_Active 阶段,通过 DL_Up 信号通知事务层。
    1. PCIe 设备的接收逻辑必须定期向链路对端发送 FC_Update DLLP,更新当前的流量控制信用值。

Image

2.6.3 缩放流量控制机制

PCIe Gen 3 中规定,Header 流量控制信用值最大值是 127,Data 流量控制信用值最大值是 2047。当没有足够的流量控制信用,链路性能可能会受到影响。这种影响在更高的链路速率下变得更加明显,127 个 Header 信用和 2047 个 Data 信用的限制可能会限制性能。因此,在 PCIe Gen 4 中引入缩放流量控制(Scaled Flow Control)机制,旨在解决这个问题。

PCIe Gen 4 提供了 x1, x4, x16 三种放大系数。这样, 对于 Header 流量信用值有 127/508/2032 三种选择,对于 Data 流量信用值有 2047/8188/32752 三种选择。

可能大家已经注意到上面的 FC DLLP 中,在 HdrFC 和 DadaFC 前面各有 2-bit 保留。其实上图的 FC DLLP 是 Gen 3 的格式,在 Gen 4 中,FC DLLP 是下图格式

Image

HdrScale 字段和 DataScale 就是指示放大系数。

2.7 事务顺序

为了提高 PCIe 链路性能,设备可以连续发出事务,而不必等待上一个事务完成才能发送下一个。设备连续发送事务的能力取决于硬件设计,不在本节讨论范围内。

本节要分析的是这些事务的排序关系。如果严格按照时间先后,可能会造成死锁。如果完全乱序,则可能会造成逻辑错误。PCIe 协议的制定者们为此花费了大量心思。

2.7.1 生产者/消费者模型

PCIe 基于生产者/消费者(Producer/Consumer)模型。下图描述生产者/消费者模型,其中有五个重要的组成部分:

  • 数据生产者(Producer of Data)
  • 数据缓冲区(Memory Buffer of Data)
  • 标志信号(Flag Semaphore),指示数据生产者已经发送完数据
  • 数据消费者(Consumer of Data)
  • 状态信号(Status Semaphore),指示数据消费者已经取走数据

参照下图,在这个示例中,左下角的 PCIe 设备是数据生产者,主机的处理器是数据消费者,数据缓冲区在主机内存中,标志信号和状态信号存储在右下角的物理设备中。

Image

如果以下列的顺序处理事务,不会产生问题:

    1. 生产者通过 MWr 将数据写入到内存中,这一过程需要一些时间才能完成
    1. 消费者采用轮询的方式,通过 MRd 去读取标志信号 Flag,检查当前否有可用数据
    1. 通过 CplD 将 Flag=0 的信息返回给消费者,消费者知道暂时没有可用数据
    1. 生产者通过 MWr 写入 Flag=1
    1. 消费者等待一段时间后,重复第 2 步
    1. 这次消费者读取到 Flag=1
    1. 消费者通过 MWr 将 Flag 再次写成 0
    1. 生产者还有其它数据需要发送,所以需要周期性发送 MRd 去读取 Status 信号
    1. 生产者读取到 Status=0,说明消费者还没有取走数据,继续等待
    1. 此时消费者知道内存中有数据可用,因此通过 MRd 来取走数据
    1. 数据全部被消费者取走
    1. 第 11 步结束后,消费者通过 MWr 写入 Status=1,指示数据已被全部取走
    1. 生成者重复第 8 步,继续轮询 Status
    1. 这次消费者读取到了 Status=1,说明内存中的数据已经被消费者读走,可以继续发送数据了
    1. 生产者通过 MWr 清除 Status
    1. 一次的数据生产/消费结束,生产者可以从第 1 步重复,继续数据生成/消费

上诉过程如下两图中的编号所示。

Image

Image

上面的例子是在一切正常的情况下,按照事务顺序执行。来看另一个的例子。

    1. 生产者通过 MWr 将数据发送给主机内存,但这次出现了一些问题,MWr 事务被阻塞在 Switch 的上游端口,并没有真的写入主机内存
    1. 生产者通过 MWr 写入 Flag=1
    1. 消费者通过 MRd 读取 Flag
    1. Flag=1 通过 CplD 返回给消费者
    1. 消费者发现 Flag=1,随即去读取内存中的数据,但是消费者并不在知道真正的数据还被阻塞在 Switch 的上游端口,并没有写入到内存,因此消费者读取到的数据是以前旧数据。数据消费过程出现错误。

Image

要解决上述的问题,有很多办法,比如消费者向生产者发出一个“空读”事务,生产者返回完成响应事务给消费者。如果能保证该完成响应事务不会超越先前的写内存事务,也就是消费者接到完成响应就意味着前面的写内存事务已经完成,即可解决。

综上,必要的时候需要保证事务的顺序关系,即保序;非必要的时候,可以打乱事务顺序,提高链路效率,避免死锁发生。

2.7.2 PCIe 的排序模型

PCIe 中有三种排序模型:

  • 强排序(Strong Ordering):相同 TC 值的事务需要严格遵守时间先后顺序,不同 TC 的事务不需要遵守顺序要求。PCIe 协议允许多个 TC 映射到相同 VC,在同一个 VC 内不同 TC 的事务也不需要遵守顺序要求。
  • 弱排序(Weak Ordering):除非重新排序有帮助,否则事务将按顺序进行。保持事物之间的强序要求可能会带来一些不必要的依赖关系,而这些依赖关系可能会造成死锁,这时对事务进行重新排序会解决这个问题。
  • 松散排序(Relaxed Ordering):在特定的受控条件下对事务进行重新排序。好处是提高了性能,就像弱排序模型一样,但只有在由软件指定时,才能避免依赖性问题。缺点是只有一些事务会针对性能进行优化。

前面讲虚拟通道和流量控制的时候提到过,VC 缓冲区分成 P,NP,CPL 三个子缓冲区;在流量控制机制中,将 TLP 的 Header 和 Data 拆分成两个子缓冲区。这样,VC 中实际有 6 个子缓冲区。这些子缓冲区的设计有助于简化事务排序规则的处理。

强排序模型会事务停顿(Transaction Stall),参照下图,左侧是发送端,右侧是接收端。事务编号表示事务发送的时间顺序。如果遵守强排序,由于接收端的 NP 缓冲区满了,不能接收新的事务,发送端的事务 1 被迫停止,等待接收端的 NP 缓冲区有空间。事务 2-8 也不得不停止,等待事务 1 发送完成以后才能继续进行。

Image

实际上,这些子缓冲区的事务不存在依赖关系,比如上图中的事务 2 不依赖事务 1,因此事务 2 可以继续发送。这就实现了事务弱排序。

此外,PCIe 支持松散排序,可以让软件来决定 TLP 是否需要遵守强序模型。如果软件认为 TLP 可以被重新排序,则启用 TLP Header 的 Attr[1]字段的 RO 位。MWr 和 Msg 都是 Posted 类型,都被存在 Posted 子缓冲区,因此遵守相同的排序要求。当 Switch 或 RC 发现 MWr/Msg 的 RO 被启用,则:

  • Switch 允许后发出的 MWr/Msg 超车前面的 MWr/Msg,并且 Switch 转发 TLP 时保持 RO 不变
  • 允许 RC 对 TLP 重新排序。此外,在接收到 MWr(RO=1)后,允许 RC 以任何地址顺序将每个字节写入内存。

对于 Read 事务,PCIe 按照拆分事务来处理,当设备开启 RO 发出 MRd,完成者需要返回 ClpD(RO 被设置)。Switch 的行为如下:

  • Switch 不可以将后发的 MRd 超车前面的 MWr,这保证了在读取请求的方向上的所有写事务都被推到读事务之前。
  • 完成者收到 MRd 后,返回 Completion,这些 Completion 的 RO 也被置位。
  • Switch 接收到 Completion(RO=1),允许将这些 Completion 超车完成者发出的 MWr。这样即使 MWr 被阻塞,Completion 仍可执行,有助于提高读取性能。

下表总结了 Switch 的松散排序下可超车的事务。

Image

另一种优化排序和提高性能的做法是基于 ID 排序,其基本思想是不同请求者不在同一线程的话,之间的事务没有依赖关系。下图中,事务 1 先到达 Switch 的上游端口,但由于某些原因被阻塞。随后事务 2 也到达 Switch 的上游端口,按照强序要求,事务 2 必须停下来等待事务 1 先通过。但是,如果事务 1 和事务 2 之间没有依赖关系,强制事务 2 等待必然造成系统性能下降。解决办法是允许使用不同 ID(Requester ID 或者 Completer ID)的事务重新排序,在本示例中也就是允许事务 2 超越事务 1。使用此功能需要软件开启 TLP Header 的 Attr[2]字段的 IDO 位。

Image

2.7.3 PCIe 排序规则

PCIe 协议规定,事务排序规则仅在事务使用相同 TC 值时适用,对于不相同 TC 值则不适用。也就是说,不同 TC 值的事务不需要遵守排序规则。PCIe 事务可以分为 Posted 类型和 Non-Posted 类型。因此,全部 TLP 可以分为三类:

  • Posted:包括 MWr,Msg/MsgD
  • Non-Posted:包括 MRd,IORd,IOWr,CfgRd0,CfgRd1,CfgWr0,CfgWr1,AtomicOp。Non-Posted 请求又被分为两部分:Read Request(MRd,IORd,CfgRd0,CfgRd1)和 NPR with Data(IOWr,CfgWr0,CfgWr1,AtomicOp)。
  • Completion:包括 Cpl/CplD

TLP 排序规则见下表:

表中的 Col 2-5 表示是时间维度上先发出的 TLP,Row A-D 表示的是时间维度上后发出的 TLP。表中间的 Yes 表示后发出的 TLP(Row A-D)必须被允许“超车(overtake)“先发出的 TLP(Col 2-5),即 Row 中的事务虽然比 Col 中的事务发出时间晚,但是可以先被接收端接收,以避免死锁发生;No 表示不允许后发出的 TLP 超车先发出的 TLP,即后发出的 TLP 必须遵守强排序要求排在先发出的 TLP 后面被接收;Y/N 表示后发出的 TLP 可以但不强制超车先发出的 TLP。

Image

逐一解释一下这些表项:

  • A2a:Row 事务不可以超越前 Col 事务,除非是 A2b 所允许的情况。
  • A2b:RO 开启的 Posted Request 可以超车前一个 Posted Request;如果两个请求者 ID 不同,或者两个请求都包含 PASID TLP Prefix 并且两个 PASID 值不同,则允许 IDO 开启的 Posted Request 超车前一个 Posted Request
  • A3,A4:Posted Request 必须可以超车前一个 Non-Posted Request,以避免死锁。比如 MWr 可以超车 MRd 或者 CfgWr
  • A5a:允许 Posted Request 超越 Completion,但不要求。比如 MWr 超车 CplD
  • A5b:对于 PCIe 到 PCI 方向上传输的事务,Posted Request 必须可以超越 Completion。
  • B2a:Read Request 不可以超越前一个 Posted Request 除非 B2b 所允许的情况
  • B2b:如果两个请求者 ID 不同,或者两个请求都包含 PASID TLP Prefix 并且两个 PASID 值不同,则允许 IDO 开启的 Read Request 超越前一个 Posted Request
  • C2a:NPR with Data 不可以超越 Posted Request,除非 C2b 所允许的情况
  • C2b:RO 开启的 NPR with Data 可以超越前一个 Posted Request;如果两个请求者 ID 不同,或者两个请求都包含 PASID TLP Prefix 并且两个 PASID 值不同,则允许 IDO 开启的 NPR with Data 超越前一个 Posted Request
  • B3,B4,C3,C4:允许 NPR 超越另一个 NPR
  • B5,C5:允许 NPR 超越 Completion
  • D2a:不允许 Completion 超越 Posted Request
  • D2b:允许 IO 和 configuration write completion 超越 Posted Request;RO 开启的 completion 可以超越 Posted Request;如果完成者 ID 与 Posted Request 的请求者 ID 不同,则允许 IDO 开启的 Completion 超越 Posted Request
  • D3,D4:Completion 必须可以超越 NPR,以避免死锁
  • D5a:允许不同事务 ID 的 completion 互相超越
  • D5b:相同事务 ID 的 completion 必须遵守顺序,这是为了确保与单个内存读取请求相关联的多个 completion 保持地址升序顺序。

这一部分有点绕,不过很多是软件需要考虑的,比如在开启 IDO 或 RO 时,软件必须保证事务之间确实没有依赖关系,否则重新排序可能会造成功能错误。

2.8 服务质量,QoS

QoS 这个概念在很多总线标准中都会提到。QoS 的基本原理是让软件对不同的传输需求划分出优先级,优先级高的会分配更多的资源。

PCIe 中为了实现 QoS,首先提出了流量等级(Traffic Class,TC)概念。在 TLP Header 的第一个 DW 中有 3-bit 的 TC 字段,也就是说 TC 从 0 到 7 有八个等级。其中,TC0 是默认等级。

Image

然后,PCIe 又提出了虚拟通道(Virtual Channel,VC)概念。VC 虽然挂着虚拟的名号,却是实打实的硬件缓冲区。前面讲流量控制时,提到设备中会实现缓冲区,这里的 VC 代表可用于传出数据包的不同路径。打个比方,PCIe 设备是一条高速公路且有多条车道,车道就是 VC,而行驶的车辆就是 TLP,这些 TLP 最终汇聚到物理层发送出去,物理层链路就是一个检查站。软件可以指定 TLP 不同的 TC 等级,相同 TC 值的 TLP 行驶在同一个 VC 上,VC 等级高的车道具有优先通过检查站的权利。

VC 最多也可以有 8 个,即 0-7。实际上,考虑到 VC 是硬件逻辑资源,所以不同的 PCIe 设备很可能不会实现全部的 VC。这里就涉及到一个问题,如何分配 TC 到 VC 上,即 TC/VC 映射。PCIe 协议中做了如下的约束:

  • 对于连接在同一链路任一端的两个端口,TC/VC 映射必须相同
  • TC0 将自动映射到 VC0
  • 其它 TC 可以映射到任何 VC
  • 一个 TC 不能映射到一个以上的 VC

PCIe 设备关于 VC 的信息存放在扩展能力(Capability)寄存器中,其中每个 VC 有单独的一组寄存器。主机软件获得设备的 VC 数目,并为这些 VC 分配 ID。

VC 可以有多个,但是物理链接只有一条,这就出现了一个问题,如何分配链路资源给 VC,或者说哪些 VC 车道上的 TLP 可以优先其它 VC 上的 TLP,发给链路的对端。PCIe 提供三种 VC 仲裁方法:

  • 严格优先级仲裁:优先级最高的 VC 始终会优先通过
  • 分组仲裁:将 VC 分为高优先级组和低优先级组,其中高优先级组执行严格优先级仲裁,低优先级组执行软件指定的仲裁方式
  • 硬件固定仲裁:仲裁机制由硬件实现

下图是一个 VC 仲裁的例子,VC1 和 VC0 采用了 3:1 的比例,即每发送 3 个 VC1 上的数据包以后,发送 1 个 VC0 上的数据包。这种仲裁机制的好处是,优先级低的 VC 也有机会获得链路资源。

Image

关于虚拟通道,详见后面第六章中的部分。

END

作者:老秦谈芯
文章来源:老秦谈芯

推荐阅读

更多 IC 设计干货请关注IC 设计专栏。欢迎添加极术小姐姐微信(id:aijishu20)加入技术交流群,请备注研究方向。

推荐阅读
关注数
21084
内容数
1328
主要交流IC以及SoC设计流程相关的技术和知识
目录
极术微信服务号
关注极术微信号
实时接收点赞提醒和评论通知
安谋科技学堂公众号
关注安谋科技学堂
实时获取安谋科技及 Arm 教学资源
安谋科技招聘公众号
关注安谋科技招聘
实时获取安谋科技中国职位信息