Error Handling
Error types
         包含两种sub-packet级别的error, 和两种packe级别的error;
  
Packet level error
 Data Error, DERR
         □ 访问的地址是正确的,但是访问的数据有错误;通常是在数据崩溃的时候使用,例如ECC,parity check;
         该Data Error, 可以在DAT packet中的resperr, poison, data check域段反映;
         如果HN收到一个RN发送过来的请求或者snp data, 包含DERR, HN必须继续处理,要继续将该命令传播到SN;
Non-data Error, NDERR
        □ 和data err不相关的错误,都是NDERR, 协议并未规定所有的场景;
        □ 通常会有如下场景:
                □ 访问一个不存在的空间;
                □ 错误的访问命令,例如,写一个read-only的空间;
                □ 使用reserved的命令类型等等;
         □ 当HN收到一个NDERR命令时,可以,但是不推荐继续往SN传;
         □ Non-data err在RSP/DAT通道的resp err域段反映; 
Error response fields
 该域段在response和data通道都有;
 □ 单个trans,不能既有ok, 也有exok;
 □ 单个trans,不能既有ok, 也有exok;
 □ Data resp, 要么没有NDERR, 要么都是NDERR;
 □ 单个trans,可以既有ok, 也有DERR;
 □ 单个trans,可以既有exok, 也有DERR;
 □ 单个trans,可以既有OK, 也有NDERR;此场景出现在data和non-data resp同时返回的时候;
 □ 单个trans,不能既有exok, 也有nderr;
Errors and transaction structure
 □ 不管transaction是否包含error response,都必须按照与协议一致的行为完成。
 □ 使用DMT的transaction的error handling和没有使用DMT相同请求的error handing处理流程一样。
 □ requests或snoops没有机制传输errors,如果在ICN上检测错误,那么该request不能使用DMT或DCT。
 □ 发生错误时,如果transaction包含data packets,则需要data packets的源发送正确数量的数据包,但不要求数据值有效。
 □ transaction中resp域的cache state可以被error handling影响。
 □ 如果transaction的响应没有包含合法的cache state,那么RespErr域必须把所有data packets指示为Non-data Error。
 □ 不管是否存在error情况,data message的每个packet的Resp域在响应中必须有相同的值;
 □ 当某个RN收到的snoopable resquest的响应,是non-data err时:
         □ 对于allocation trans
                 □ 如果当前的状态是I,RN不能缓存接收的数据;
                 □ 如果当前状态不是invalid的,则缓存的数据,不能够进行修改;
                 □ 不管是上述那种情况,cacheline state都不能修改;
                 □ 包含如下命令:
                         — ReadClean 
                         — ReadNotSharedDirty 
                         — ReadShared 
                         — ReadUnique 
                         — ReadPreferUnique 
                         — MakeReadUnique 
                         — CleanUnique 
                         — MakeUnique
         □ 对于deallocation trans;
                 □ 同正常流程一样;
                 □ 包含如下命令:
                         — WriteBack 
                         — WriteEvictFull 
                         — Evict 
                         — WriteEvictOrEvict
 □ 对于Other transactions that do not change allocation
         □ Cacheline的状态,不能升级,可以降级;
□ Snpresp中,如果是non-data err,则cacheline状态必须是invalid, 返回响应的RN,必须invalid掉local cache copy;
 □ 除此以外,如果snoop resp是forwarding的,带了non-data err, 那么被snoop的人,不要将data返回给原始RN;因此,如果compdata message已经返回给了RN, 那么返回给HN的snoop resp,就不能携带non-data err;
Error response use by transaction type
Read transactions
 □ 读操作可能包含多个compdata packets;
 □ 当错误指示,Poison, DERR, or NDERR置位时,表示数据corrupt;
 □ 当respsepdata是non-data err时,所有的datasepresp都应该标记为non-data err, 而不能只标记其中一两个;
 □ 参考协议每个命令在不同的响应中
 (read receipt/compdata/compack/datasepresp/respsepdata),可以出现的状态;
Dataless transactions
 □ Dataless trans也可以返回data error, 例如当其他component处理时产生了data corruption err;(HNF snoop时有data err返回);
Write transactions
 □ Write trans,可以包含data err, 或者non-data err; 既可以从RN往completor送,也可以从completor往RN送;
 □ Write data有错误,可以通过置位Poison or DERR来指示;
 □ Compter往RN返回错误,可以通过compDBIDResp, 或者Comp resp;completer可以在收到writedata之前,就发送错误信号,比如cache lookup,数据损坏的场景;
Atomic transactions
 略;
DVMOp
 □ DVMOp 的响应,可以包含Non-data err和data err;
 □ MN会将所有snoop resp的err进行合并,生成comp resp, 然后返回给RN;
Snoop transactions
 □ Snoop trans的resp,可以指示data err;
 □ Snoop trasn的resp, 可以混合OK和DERR;
 □ Snoop的数据错误,可以通过Poison or DERR指示;
 □ 不包含数据的Snoop trans resp, 可以有NDERR指示;
 □ 被snoop的RN返回NDERR时,必须满足如下需求:
         □ Snoop trans resp中不能包含数据;
         □ 必须将当前cache中的copy invalid;
         □ Cache state返回invalid:
         □ 如果是forwarding snoop, 不要返回compdata给原始RN;
Poison
 □ 该信号用来指示data中哪些bit时corrupted. 该bit跟随DAT通道传输;
 □ 该poison支持:每64bits数据,1bit poison
 □ 如果数据标记成poisoned;
          □    不能被RN所使用;
          □    允许存入cache;
 □ Posion一旦被set, 就必须跟随data一起传输;
 □ 当poison被检测到时,可以跳过poison的data;
Data Check
 □ 每64bits 8bits的data check, 存储的是奇偶校验结果;
 □ 如果Data packet的接受者不支持Posion或DataCheck特性,需要的话,ICN必须将其转换成DAT packet的Data Error。
 □ 如果支持Posion和DataCheck特性,但接口不是相似的话,需要遵循如下原则:
         □ 如果Posion不支持的话,Posion必须映射成DataCheck或DERR。在这样的interface下,如果DataCheck支持的话,更期望将Posion映射成DataCheck,而不是DERR;在将Posion转为DataCheck的时候,8bytes块标记为Posion,每个DataCheck的8bits必须控制产生为parity error;
          □ 如果DataCheck不支持的话,DataCheck必须映射成Posion或DERR。在这样的interface下,如果支持Posion,更期望将DataCheck映射成Posion,而不是DERR;在将DataCheck转换为Posion的时候,在一个8byte chunk中,如果一个或多个DataCheck bits产生parity error,那么chunk的Posion bit必须置位。
 注意:Posion和DERR的不同之处在于: 收到带Posion error的Data packet通常会被receiver推迟,但是DERR error通常不会被receiver推迟。
 对在检测到Posion error时将其指示到Posion bits,对于Sender来说已经足够了,但是否将其RespErr置成DERR不是需要的。
 对在检测到DataCheck error时将其指示到DataCheck bits,对于Sender来说已经足够了,但是否将其RespErr置成DERR不是需要的。
 Posion和DataCheck的域段是独立的,一个类型的错误不要求另一个类型的域段置位;
 在一个Data packet中,如果RespErr域段设置成DERR或NDERR,那么Posion和DataCheck的域段值不关心。
Quality of Service
  □ 系统中使用QOS机制来实现如下事情:
          □ 对于特定数据流,保证trans的最大latency;
          □ 对于请求数据流,保证最小的带宽;
          □ 对于特定的数据流,提供最优的带宽和延迟;
  □ 在总线中间节点的支持下,满足系统QoS需求的低latency或保证数据吞吐量需求主要是由transactions endpoint负责的。协议通过定义packets的QoS优先级值和使用defined credit机制控制request flow来支持这一点
  □ Qos一共4bits, 从源端带来;在典型使用模型中,此值取决于源类型和流量类别,QoS的升序值表示更高的优先级。源还可以根据某些累积的延迟和所需的吞吐量度量动态地改变该值。
□ 当某个trans已经发送了,qos是某个值,这个时候,协议是允许它在发送一次,并使用不同的优先级的,当然,通常是优先级更高;completer需要能够处理这种场景;