PCIe的理解
1. 如何理解PCIe传输的可靠性?
物理介质是不可靠的,可靠性是通过高层协议确保在不可靠的物理层之上建立可靠的传输,PCIe有点对点的特点,PCIe设备之间点对点可靠性主要是是通过数据链路层的ACK/NACK机制1(类似于TCP的ACK/NACK机制)来保证,PCIe数据链路层可靠性是PCIe系统可靠性的一大特色也是主要手段,但是单独数据链路层无法保证PCIe系统端到端(如CPU到EP设备)可靠性,数据事物层的ECRC为端到端提供了可靠性保证。具体来说如果系统中PCIe switch内部出现不可靠,TLP在不同端口之间传输出现错误,那么ECRC在接受侧的检测可以发现这种错误,如果Switch支持检测ECRC错误也会检测,但是不会纠正这个错误会将TLP报文原封不动的转发。
展开来讲 ECRC 字段区域在通过源设备和目标设备之间的任何服务点(service point,即PCIe Switch或RC端口)时都不改变,这使得目的端可以用它来验证在整个传输过程中(举个栗子:经过Switch内部转发时)都没有发生错误。TLP 的核心部分由事务层转发至数据链路层,数据链路层负责在 TLP 中添加一个序列号(Sequence)和链路层校验LCRC(Link CRC, 链路CRC);LCRC 被接收端用来进行错误检查,并将链路上传输的每个数据包的检查结果都汇报给发送端。
——LCRC只负责PCIe物理链路两端的传输是否正确:当数据包到达PCIe Switch的一个端口,并进行错误检查(LCRC)和路由检查,然后当它被从另一个端口发出时,设备会计算出一个新的 LCRC 值并添加在数据包中,新的LCRC 会取代老的 LCRC。
——如果 LCRC 已经证明了链路传输的正确,那么 ECRC 还有什么作用呢?因为LCRC有以个地方的传输错误没有被检查,那就是负责路由数据包的设备内部;因为数据在PCIe Switch的转发过程中(Switch内部交换过程)并不会对LCRC进行校验,此时如果转发过程中出现了错误,那么就需要更内层封装的ECRC来进行校验了;接收端对LCRC的检测只能说明对接的PCIe物理链路传输没有问题,而不能保证TLP数据包本身是否正确。

2. PCIe domain,host,RC, NTB, crosslink, P2P的理解。
PCIe一个Domain指的是一棵PCIe树,总线从0到最大255,具体多少由RC动态扫描得出,所以一个RC对应一个Domain,
一个系统中有多少Domain是由RC个数决定的,有几个RC就有几个Domain,并非一个host只能有一个Domain。如果一个host有双路CPU,可能有两个RC,那么该host系统下有两个Domain。
NTB是multi-host场景下供host之间通过共享内存提供了PCIe级别时延 吞吐的通信可能。Cross domain P2P如果发生在host内部(多个RC多个domain),因为host内内存地址统一编址 不需要NTB,如果发生在host之间则需要NTB。
多提一句,SW之间互联可以通过crosslink 水平扩展,也可以通过级联(Cascaded)扩展,主要区别在两个互联的端口配置上。
notes:
1. 作为一个不断发展的协议,PCIe6.0新引入了Flit模式,该模式下不再有ACK/NACK机制。见参考3
参考:
1. 硬件总线基础07:PCIe总线基础-事务层(1) - 知乎
3. PCIe 6.0 新特点和优化掉的内容(持续更新中) - 知乎
浙公网安备 33010602011771号