文章目录
- 4.11 Hazard conditions
- 4.11.1 At the RN-F node
- 4.11.2 At the ICN(HN-F) node
4.11 Hazard conditions
本节列出了 RN-F 和 HN-F 处理地址hazards和Snoopable事务之间竞争条件的责任。
除了多个请求者同时发出事务外,该协议还允许每个请求者发出多个未完成的请求,并接收多个未完成的snoop请求。 互连的责任,即 ICN(HN-F, HN-I 和 MN),是确保对同一缓存行的事务发生有一个定义的顺序,并且该定义的顺序对所有组件都是相同的。
4.11.1 At the RN-F node
RN-F 节点必须及时响应接收到的snoop请求,除了 SnpDVMOp(Sync),而不在未完成请求的完成上创建任何协议层依赖。
如果在RN-F处存在对同一缓存行的待处理请求,并且该待处理请求尚未收到任何数据响应数据包:
- snoop请求必须正常处理。
- 缓存状态必须根据每种snoop请求类型进行相应的转换。
- 缓存的数据或CopyBack请求数据必须与snoop响应一起返回,或者在需要时转发给请求者,这取决于snoop请求类型、snoop请求属性和缓存状态。
如果在RN-F处存在对同一缓存行的待处理请求,并且该待处理请求已收到至少一个数据响应数据包:
- RN-F必须等待接收所有数据响应数据包后再对snoop请求做出响应。
- 一旦RN-F接收到所有数据响应数据包:
— snoop请求必须正常处理。
— 缓存状态必须根据每种snoop请求类型进行相应的转换。
— 缓存的数据或CopyBack请求数据必须与snoop响应一起返回,或者在需要时转发给请求者,这取决于snoop请求类型、snoop请求属性和缓存状态。
如果待处理请求是CopyBack请求,则适用以下附加要求:
- 请求事务流必须在接收到 CompDBIDResp 或 Comp 响应后完成。
- 在 CopyBackWrData 或 CompAck 响应中的缓存状态必须是处理snoop请求后缓存行的状态,而不是发送 CopyBack 请求时的状态。
- 如果在发送snoop响应后缓存行状态为 I,则在 CopyBackWrData 或 CompAck 响应中的缓存状态必须为 I。此外,对于 CopyBackWrData 响应,所有字节使能必须被取消,且相应的数据必须设置为零。
- 如果在发送snoop响应后缓存行状态为 UC 或 SC,请求节点可以不发送有效的 CopyBack 数据。如果请求节点决定不发送有效的 CopyBack 数据,则在 CopyBackWrData 或 CompAck 响应中的缓存状态必须为 I。此外,对于 CopyBackWrData 响应,所有字节使能必须被取消,且相应的数据必须设置为零。
- 如果数据与 CopyBackWrData 一起包含,则可以是:
— 与snoop响应中发送的相同数据
— 比snoop响应中发送的数据更新的更多数据。这仅在snoop为 SnpOnce、SnpOnceFwd 或SnpCleanShared,并且snoop响应指示缓存行可以进一步修改时才可能。
— 比snoop响应中发送的数据更旧。这仅在 CopyBack 写入为 WriteClean,snoop请求为 SnpOnce*,并且响应指示缓存行可以进一步修改时才可能。
对于non-ordered事务,请求节点可以在不等待 DataSepResp 的情况下发送 CompAck。对于ordered事务,请求节点可以在收到 DataSepResp 的第一个数据包后立即发送 CompAck。 在这两种情况下,请求节点在接收到所有数据包之前不得对snoop请求做出响应。
RN-F 可能在收到同一缓存行的待处理 CopyBack 请求的响应之前接收到多个snoop请求。 在这种情况下,数据响应携带了在最后一次snoop请求响应完成后缓存行的状态。 这种情况是可能的,因为CopyBack请求可以在HN-F后面排队多个读取和无数据请求。
4.11.2 At the ICN(HN-F) node
HN-F通过对请求者的事务响应和snoop事务进行排序来对同一缓存行的事务进行排序。由于互连不要求有序,因此在某些情况下,这些消息的到达顺序可能与它们在HN-F处发出的顺序不同。
如果包含数据的响应消息需要通过互连传输多个数据包或节拍,则Home节点接收或发送该消息意味着发送或接收与该消息对应的所有数据包。 也就是说,当Home节点开始发送消息时,它必须在不依赖于任何其他请求或响应消息完成的情况下发送该消息的所有数据包。
同样,当Home节点接受数据消息的一部分时,它必须在不依赖于任何其他请求或响应消息的前进进度的情况下接受该消息的其余数据包。当后续的数据转发依赖于接收数据消息时,数据转发操作可以在接收到第一个数据包后进行。 后续的非数据转发操作,即Home节点因发送或接收数据而处理的后续请求,必须等到所有数据发送或接收完毕后才能进行。
在snoop事务响应待处理期间,允许发送到同一地址的唯一事务响应是:
- RetryAck for a CopyBack
- RetryAck and DBIDResp for a WriteUnique and Atomics
- RetryAck and, if applicable, a ReadReceipt for a Read request type
- RetryAck for a Dataless request type
一旦事务的completion被发送,HN-F必须在接收到以下内容之前,不得向同一缓存行发送snoop请求:
- 对于除ReadOnce*和ReadNoSnp之外的任何读取和无数据请求的CompAck。
- 对于HN-F请求完成且没有数据传输的CopyBack请求的CompAck。
- 对于HN-F请求完成且有数据传输的CopyBack请求的CopyBackWrData响应。
- 对于原子请求的NonCopyBackWriteData响应。
- 对于WriteUnique请求的WriteData应答,如果适用,还包括CompAck,,前提是HN-F未使用DWT流。
- 对于WriteUnique请求的从属节点的Comp响应,前提是HN-F已使用DWT流。