第 3 章 网络层
本章描述负责确定目标节点 ID 的网络层。它包含以下部分:
• 第 3-134 页的系统地址映射。
• 第 3-135 页的节点 ID。
• 第 3-136 页的目标 ID 确定。
• 第 3-138 页的网络层流程示例。
3.1 系统地址映射
每个请求方,即系统中的每个 RN 和 HN,必须有一个系统地址映射 (SAM) 来确定请求的目标 ID。SAM 的范围可能简单到为所有传出请求提供一个固定的节点 ID 值。
SAM 的确切格式和结构是实现定义的,不在本规范的范围内。
SAM 必须提供对整个地址空间的完整解码。本规范建议,任何不对应于物理组件的地址都应发送给能够提供适当错误响应的代理。
3.2 节点 ID
连接到互连上端口的每个组件都被分配一个节点 ID,用于识别通过互连通信的数据包的源和目的地。一个端口可以被分配多个节点 ID。一个节点 ID 值只能被分配给一个端口。
本规范支持 7 到 11 位的可变 NodeID 字段宽度。
对于给定的实现,宽度可以配置为此范围内的任何固定值,并且该值必须在所有 NodeID 字段中保持一致。
为系统中的每个节点定义和分配节点 ID 是实现定义的,不在本规范的范围内。
3.3 目标 ID 确定
本节描述如何为不同的消息类型确定目标 ID。它包含以下部分:
• 请求消息的目标 ID 确定。
• 第 3-137 页的响应消息的目标 ID 确定。
• 第 3-137 页的侦测请求消息的目标 ID 确定。
3.3.1 请求消息的目标 ID 确定
对于来自 RN 的请求中目标 ID 的映射,本规范要求系统地址映射 (SAM) 逻辑存在于 RN 或互连中。如果存在于互连中,互连可以重新映射 RN 提供的请求包中的目标 ID。
请求消息的目标 ID 使用系统地址映射逻辑以以下方式确定。PCrdReturn 除外:
• 如果请求不使用预分配的信用,则目标 ID 由以下方式确定:
--- DVMOp 的操作码。
--- 所有其他请求的地址到节点 ID 映射。
PrefetchTgt 使用与其他请求不同的地址到节点 ID 映射器。来自 RN 的、发往同一地址的两个请求,其中一个是 PrefetchTgt,会指向不同的节点。PrefetchTgt 始终指向 SN。来自 RN 的所有其他使用地址到节点 ID 映射器的请求指向 HN。
• 如果请求使用预分配的信用,则请求的目标 ID 必须从 RetryAck 的源 ID(作为对原始请求消息的响应提供)或原始请求的目标 ID 中获取。
对于 PCrdReturn:
• RN 提供的目标 ID 必须与先前提供被归还信用的 PCrdGrant 中包含的源 ID 匹配。
RN 必须期望互连重新映射请求的目标 ID。
对于来自 RN 的事务,除了目标是 SN-F 的 PrefetchTgt 外,本规范期望可侦测事务的目标是 HN-F,而不可侦测事务的目标是 HN-I 或 HN-F。将可侦测事务指向 HN-I 是合法的。例如,这可能由于软件编程错误而发生。在这种情况下,要求 HN-I 以符合协议的方式响应事务,但不保证一致性。
HN 也可以使用地址映射逻辑来确定每个请求的目标从属节点 ID。
3.3.2 响应消息的目标 ID 确定
响应包是作为接收到消息的结果而发出的。响应包中的目标 ID 必须与导致发送该响应的接收消息中的 SrcID 或 HomeNID,或 ReturnNID 或 FwdNID 匹配。表 3-1 显示了每种响应消息类型的响应包目标 ID 的来源,以及接收消息中确定目标 ID 的字段。

表 3-1 响应包目标 ID 的来源
| 响应消息 | 从以下获取的目标 ID | ||
|---|---|---|---|
| 在 HN 处 | 在 SN 处 | 在 RN 处 | |
| RetryAck | Request.SrcID | Request.SrcID | - |
| PCrdGrant | Request.SrcID | Request.SrcID | - |
| ReadReceipt | Request.SrcID | Request.SrcID | - |
| RespSepData | Request.SrcID | - | - |
| Comp | Request.SrcID | Request.SrcID | - |
| DataSepResp | Request.SrcID | Request.ReturnNID | - |
| CompData | Request.SrcID 或 SnpResp∗.SrcIDa | Request.ReturnNID | Snoop.FwdNID |
| CompAck (读) | - | - | Comp.SrcID 或 RespSepData.SrcID 或 CompData.HomeNID |
| CompAck (写) | - | - | DBIDResp.SrcID 或 CompDBIDResp.SrcID |
| DBIDResp | Request.SrcID | Request.SrcID | - |
| WriteData | - | - | DBIDResp.SrcID 或 CompDBIDResp.SrcID |
| NCBWrDataCompAck | - | - | Comp.SrcID 或 DBIDResp.SrcID 或 CompDBIDResp.SrcID |
| Persist | Request.SrcID | Request.ReturnNID | - |
| CompPersist | Request.SrcID | Request.SrcID 或 Request.ReturnNID | - |
| SnpResp*b | - | - | Snoop.SrcID |
| a. 对于数据拉取请求,侦测响应可以是 SnpResp 或 SnpRespData 或 SnpRespDataPtl。 | |||
| b. SnpResp, SnpRespData, SnpRespDataPtl, SnpRespFwded, 和 SnpRespDataFwded。 |
3.3.3 侦测请求消息的目标 ID 确定
侦测请求不包含目标 ID。该协议没有定义一种架构机制来寻址和发送侦测请求到目标。预计这种机制将是实现定义的,并且不在本规范的范围内。
3.4 网络层流程示例
本节展示网络层的事务流程。它包含以下部分:
• 简单流程。
• 第 3-139 页的基于互连 SAM 的流程。
• 第 3-139 页的基于互连 SAM 和重试请求的流程。
3.4.1 简单流程
图 3-1 是一个简单事务流程的示例,展示了如何为请求和响应确定 TgtID:
-
RN0 使用 RN0 内部的 SAM 发送一个目标 ID 为 HN0 的请求。
• 互连不重新映射节点 ID。
-
HN0 查找内部 SAM 以确定目标 SN。
-
SN0 接收请求并发送数据响应。
• 数据响应包的 TgtID 源自请求的 ReturnNID。
-
RN0 接收来自 SN0 的数据响应。
-
如果需要,RN0 发送一个 CompAck,其 TgtID 为 HN0(源自数据响应包中的 HomeNID),以完成事务。

图 3-1 无重映射的目标 ID 分配
3.4.2 基于互连 SAM 的流程
图 3-2 展示了在互连中发生目标 ID 重映射的情况。
注
只有来自 RN 的请求的目标 ID 被重映射。事务流程中所有其他包的 TgtID 的确定方式与第 3-138 页的简单流程类似。

图 3-2 带重映射逻辑的目标 ID 分配
图表描述:显示了互连 (Interconnect) 内部有重映射逻辑 (Remap logic)。RN0 的请求 (TgtID=HN0) 进入互连,经过重映射逻辑后,目标 ID 变为 HN1 (TgtID=HN1) 发送出去。后续流程与简单示例类似。
3.4.3 基于互连 SAM 和重试请求的流程
图 3-3 在第 3-140 页展示了一个请求被重试的情况。
-
互连将 RN0 提供的 TgtID 重新映射到 HN1。
-
请求收到 RetryAck 响应。
• RetryAck 和 PCrdGrant 响应的 TgtID 信息来自接收到的请求中的 SrcID。
-
RN0 在收到 RetryAck 和 PCrdGrant 响应后重新发送请求。
• 重试请求中的 TgtID 与接收到的 RetryAck 中的 SrcID 或原始请求中的 TgtID 相同。TgtID 必须再次通过重映射逻辑。
-
事务流其余部分的数据包获取 TgtID 的方式与基于互连 SAM 的流程类似。
