这段文字详细介绍了TLP(事务层包)的路由机制,特别是通过地址路由(Address-Based Routing)和ID路由(ID-Based Routing)两种方式进行路由。主要内容如下:
1. 地址路由(Address-Based Routing)
地址路由用于内存请求(Memory Requests)和I/O请求(I/O Requests)。它根据地址信息将TLP发送到目标设备。地址路由有两种格式:64位地址格式和32位地址格式。
• 64位地址格式:这种格式使用4个双字(DW,4字节)作为TLP头部,适用于较大的地址范围。64位地址格式适用于大于4GB的地址空间。
• 32位地址格式:这种格式使用3个双字(DW)作为TLP头部,适用于较小的地址空间。32位地址格式用于处理4GB以下的内存地址。
具体规则:
• 内存读/写请求与原子操作(AtomicOp):如果地址小于4GB,必须使用32位格式;如果地址大于4GB,则使用64位格式。如果使用64位地址来访问小于4GB的内存,接收方的行为没有明确规定。
• I/O读/写请求:总是使用32位格式。
• 地址解析:所有设备必须解码TLP头部中的所有地址位,不能有地址别名(即同一地址不能映射到多个设备)。
2. ID路由(ID-Based Routing)
ID路由用于配置请求(Configuration Requests)、ID路由消息(ID Routed Messages)和完成请求(Completions)。这种路由方式不依赖于内存或I/O地址,而是通过设备的总线号(Bus Number)、**设备号(Device Number)和功能号(Function Number)**来确定目标。 ID路由的工作方式:
• 非ARI路由ID:对于非ARI(高级路由接口)设备,通过总线号、设备号和功能号来确定目标设备。比如,总线号占用TLP头部的一个字节,设备号占用下一个字节的一部分,功能号占用设备号字节的低三位。
• ARI路由ID:对于ARI(Advanced Routing Interface)设备,路由ID通过总线号和功能号来确定目标设备。ARI设备可以有更多的功能,因此功能号会用8位来表示。
具体规则:
• 非ARI设备使用4 DW头部格式,包含总线号、设备号和功能号。
• ARI设备使用4 DW头部格式,包含总线号和功能号。
• ID路由格式有两种,分别是4 DW头部和3 DW头部。无论是哪种格式,头部字段的位置是相同的(可以参考文中给出的表格和图示)。
3. 头部字段位置:
• 非ARI ID路由(4 DW格式):总线号在TLP头部第8字节的低8位,设备号在第9字节的高5位,功能号在第9字节的低3位。
• 非ARI ID路由(3 DW格式):类似的映射方式,但字段的具体分布会略有不同。
• ARI ID路由:总线号占第8字节,功能号占第9字节的低8位。
4. 关键概念:
• 地址路由:通过物理地址来决定TLP的去向,适用于内存和I/O请求。分为64位和32位两种格式,要求设备必须完整解码地址。
• ID路由:通过设备的ID(总线号、设备号和功能号)来确定TLP的目标,适用于配置请求和一些特定消息。可以是非ARI设备或ARI设备,格式不同但都是基于设备ID的。
5. 实施建议:
• 地址别名的防止:即使某些系统设计师知道只有64位地址的低32位有效,仍然需要完整解码所有地址位。这样做的目的是确保正确的软件操作。
总结:
• 地址路由基于内存地址或I/O地址来传递数据,分为32位和64位两种格式。32位格式适用于4GB以下地址,64位格式适用于更大的地址空间。
• ID路由基于设备的ID信息(总线号、设备号和功能号)来路由TLP,常用于配置请求和完成请求。
• TLP头部字段的位置和格式由设备类型(非ARI或ARI)和路由类型(地址路由或ID路由)决定。
这些规则确保了TLP能够准确无误地到达目标设备或组件,同时避免了地址冲突和路由错误。