PCIE协议-3-数据链路层规范-数据完整性机制

3.6 数据完整性机制

3.6.1 引言

事务层向数据链路层提供TLP边界信息,这使得数据链路层能够为TLP应用一个TLP序列号和链路CRC(LCRC)进行错误检测。接收数据链路层通过检查TLP序列号、LCRC码以及接收物理层的任何错误指示来验证接收到的TLP。如果TLP中存在这些错误中的任何一个,将使用数据链路层重试机制进行恢复。

图3-14显示了应用了TLP序列号和LCRC码的TLP的格式。

在支持协议多路复用的端口上,包含符号+0位7:4非零值的数据包是PMUX数据包。对于TLP,这些位必须是000b。详情请见附录G。

在不支持协议多路复用的端口上,符号+0位7:4是保留的。

3.6.2 TLP传输器的LCRC、序列号和重传管理

数据链路层(如图3-1中标记为1和3的路径)通过为每个TLP分配序列号,然后计算并附加一个链路CRC,以确保TLP在从一个组件传输到另一个组件的链路上的完整性。TLP存储在重试缓冲区中,除非收到其他组件的确认接收的积极确认,否则将重传。如果多次尝试传输TLP失败,传输器将确定链路不正常工作,并指示物理层重新训练链路(通过LTSSM恢复状态,第4.2.6节)。如果链路重训练失败,物理层将指示链路不再可用,导致DLCM状态机移动到DL_Inactive状态。

用于确定TLP LCRC和序列号以及支持数据链路层重试的机制,以概念性的“计数器”和“标志”来描述。这种描述并不意味着也不要求特定的实现,仅用于澄清要求。

3.6.2.1 TLP传输器的LCRC和序列号规则

以下计数器和计时器用于解释本节中剩余的规则:

  • 以下12位计数器被使用:
    • NEXT_TRANSMIT_SEQ - 存储应用于TLP的数据包序列号。在DL_Inactive状态下设置为000h。
    • ACKD_SEQ - 存储在最近接收到的Ack或Nak DLLP中确认的序列号。在DL_Inactive状态下设置为FFFh。
  • 以下2位计数器被使用:
    • REPLAY_NUM - 计数重试缓冲区被重新传输的次数。
    • 在DL_Inactive状态下设置为00b。
  • 以下计时器被使用:
    • REPLAY_TIMER - 根据以下规则计算重传所需的时间:
      • 如果尚未运行,则在任何TLP传输或重传的最后一个符号处启动
      • 对于每次重播,当发送要重传的第一个TLP的最后一个符号时,重置并重新启动REPLAY_TIMER
      • 当收到Ack DLLP时,如果还有未确认的TLP未完成,则重置并重新启动,前提是收到的Ack DLLP确认了重试缓冲区中的某个TLP。
        • 注意:这确保只有在向前推进时才重置REPLAY_TIMER。
      • 对于每次接收到的Nak(除了在重播期间),或当REPLAY_TIMER到期时,重置并保持,直到满足重新启动条件
      • 在链路重训练期间不前进(当LTSSM处于恢复或配置状态时保持其值)。请参阅第4.2.5.3节和第4.2.5.4节。
      • 如果支持协议多路复用,可选地在接收PMUX包期间不前进(见附录G)。
      • 当没有未完成的未确认TLP时,重置并保持。

以下规则描述了TLP在传递给物理层之前是如何准备传输的:

  • 事务层在传输TLP时指示TLP的开始和结束给数据链路层
  • 数据链路层将TLP视为“黑盒”,不处理或修改TLP的内容
  • 每个TLP在从事务层的传输端接收时被分配一个12位序列号
  • 从事务层接收TLP后,通过以下方式将数据包序列号应用于TLP:
    • 将NEXT_TRANSMIT_SEQ中的12位值添加到TLP的前面
    • 在序列号之前,向TLP添加4个保留位(见图3-15)
  • 如果等式为真,则传输器必须停止从事务层接收TLP,直到等式不再为真。

  • 在将NEXT_TRANSMIT_SEQ应用于从事务层传输端接收的TLP后,NEXT_TRANSMIT_SEQ会递增(除非TLP被无效化):

  • TLP数据在数据链路层之间传输时的完整性是使用32位LCRC保护的。
  • LCRC值的计算机制如下(见图3-16):
    • 使用的多项式系数表示为04C1_1DB7h。
    • 种子值(LCRC存储寄存器的初始值)是FFFF FFFFh。
    • LCRC的计算是在应用TLP序列号之后进行的(见图3-15)。
    • LCRC计算从字节0的位0(TLP序列号的位8)开始,并按顺序从每个连续字节的位0到位7进行。
    • 注意,LCRC计算使用TLP的所有位,无论字段类型如何,包括保留字段: LCRC计算的余数被补码,并且将补码结果位映射到32位LCRC字段中,如表3-6所示。 

32位LCRC字段被附加到TLP之后,位于从事务层接收的字节之后(见图3-14)。

为了支持TLP的直通路由,传输器被允许修改已传输的TLP,以指示接收器必须忽略那个TLP(“无效化”TLP)。

  • 允许传输器无效化正在传输的TLP。为了以一种能够可靠地防止误解或损坏的方式进行,传输器必须执行以下操作:
    • 当物理层使用128b/130b编码时,传输TLP的所有DW(见第4.2.2.3.1节)
    • 使用计算出的LCRC值的其余部分,不进行反转(通常使用的值的逻辑反)
    • 向传输物理层指示TLP已被无效化
  • 当这样做时,传输器不会递增NEXT_TRANSMIT_SEQ。

以下规则描述了必要时从数据链路层重试缓冲区重新传输TLP的操作:

  • 已传输TLP的副本必须存储在数据链路层重试缓冲区中,无效化的TLP除外。

当由于接收到Nak或REPLAY_TIMER到期而启动重传时,以下规则描述了必须遵循的操作顺序:

  • 如果所有传输的TLP都已被确认(重试缓冲区为空),则终止重传,否则继续。
  • 递增REPLAY_NUM。当重传是由接收到的Nak启动的,该Nak确认了重试缓冲区中的一些TLP时,REPLAY_NUM将被重置。然后允许(但不是必需)递增。
    • 如果REPLAY_NUM从11b翻转到00b,传输器向物理层发出信号以重新训练链路,并等待重新训练完成后再继续重传。这是与端口相关联的报告错误(见第6.2节)。
    • 请注意,除非物理层报告Physical LinkUp = 0b(导致数据链路控制和管理状态机转换到DL_Inactive状态),否则此操作不会重置数据链路层状态,包括重试缓冲区的内容。
    • 如果REPLAY_NUM没有从11b翻转到00b,则继续重传。
  • 阻止从传输事务层接收新的TLP。
  • 完成当前正在传输的任何TLP的传输。
  • 重新传输未确认的TLP,从最早的未确认TLP开始,并按原始传输顺序继续。
    • 在发送要重传的第一个TLP的最后一个符号时,重置并重新启动REPLAY_TIMER。
    • 一旦所有未确认的TLP都已重新传输,返回正常操作。
    • 如果在重传期间收到任何Ack或Nak DLLP,传输器允许完成重传,而不考虑Ack或Nak DLLP(s),或者跳过任何新确认的TLP的重传。
      • 一旦传输器开始重新发送TLP,它必须在任何情况下完成该TLP的传输。
    • 在重传期间收到的Ack和Nak DLLP必须被处理,并且可以被合并:
      • 示例:如果收到多个Ack,只有指定最新序列号值的那个必须被考虑 - 指定早期序列号值的Ack实际上被“合并”到这个中。
      • 示例:在重传期间,先收到Nak,然后收到指定更晚序列号的Ack,Ack取代了Nak,Nak被忽略。 注意:由于重试缓冲区中的所有条目已经被传输器的流量控制门控逻辑在接收器中分配了空间,因此不需要进一步的流量控制同步。
  • 重新启用从传输事务层接收新的TLP。

重传可以通过REPLAY_TIMER到期或收到Nak来启动。以下规则涵盖了REPLAY_TIMER的到期情况:

  • 如果传输重试缓冲区包含尚未收到Ack或Nak DLLP的TLP,并且(如REPLAY_TIMER所示)在超过REPLAY_TIMER限制的时间段内没有收到Ack或Nak DLLP,则传输器启动重播。
    • 简化的REPLAY_TIMER限制为:
      • 当扩展同步位清除时,值为24,000到31,000个符号时间。
      • 当扩展同步位设置时,值为80,000到100,000个符号时间。
      • 如果未确认的TLP在传输过程中,扩展同步位改变了状态,当扩展同步位改变状态或下次REPLAY_TIMER重置时,硬件实现可以调整其REPLAY_TIMER限制。
    • 支持16.0 GT/s或更高数据速率的硬件实现必须在所有数据速率下使用简化的REPLAY_TIMER限制。
    • 仅支持低于16.0 GT/s的数据速率的硬件实现强烈建议在所有数据速率下使用简化的REPLAY_TIMER限制,但它们被允许使用[PCIe-3.1]中描述的REPLAY_TIMER限制。

这是一个重传计时器超时错误,它是与端口相关联的报告错误(见第6.2节)。

TLP传输器和合规性测试必须基于TLP传输器端口处测量的重传计时。计时从传输的TLP的最后一个符号或接收到的Ack DLLP的最后一个符号开始,以确定最早的未确认TLP。计时以TLP重传的第一个符号结束。

在测量重传计时到TLP重传开始时,合规性测试必须考虑到在同一方向上已经进行的任何其他TLP或DLLP传输(从而防止TLP重传)。

3.6.2.2 接收到的DLLP的处理

由于Ack/Nak和流量控制DLLPs会影响链路上相反方向传输的TLPs,数据链路层中的TLP传输机制也负责处理从链路另一端组件接收到的Ack/Nak和流量控制DLLPs。这些DLLPs按照以下规则进行处理(见图3-17):

  • 如果物理层指示接收器错误,丢弃当前正在接收的DLLP,并释放为DLLP分配的任何存储空间。注意,这类错误的报告由物理层完成(因此,数据链路层不会报告)。
  • 对于所有接收到的DLLPs,通过以下方式检查CRC值:
    • 将用于计算传输DLLPs的相同算法应用于接收到的DLLP,不包括接收到的DLLP中的16位CRC字段
    • 将计算结果与接收到的DLLP的CRC字段中的值进行比较
      • 如果不相等,则DLLP已损坏
      • 接收到的损坏的DLLP将被丢弃。这是一个坏的DLLP错误,并且是与端口相关联的报告错误(见第6.2节)。

  • 接收到的未损坏的DLLP,但如果使用了不支持的DLLP类型编码,则会被丢弃,无需进一步操作。这不被认为是一个错误。
  • 保留字段中的非零值将被忽略。
  • 接收器必须按照接收到的速率处理所有接收到的DLLP。
  • 接收到的NOP(无操作)DLLPs将被丢弃。

  • 接收到的FC(流量控制)DLLPs将传递给事务层。

  • 接收到的PM(电源管理)DLLPs将传递给组件的电源管理控制逻辑。

  • 对于Ack和Nak DLLPs,将遵循以下步骤(见图3-18):

    • 如果AckNak_Seq_Num指定的序列号与未确认的TLP不对应,或者与ACKD_SEQ中的值不匹配,则丢弃该DLLP。
      • 这是一个数据链路协议错误,是与端口相关联的报告错误(见第6.2节)。
      • 请注意,当没有未确认的TLP时接收到Ack DLLP并不是一个错误,包括在重置和首次TLP传输之间的时间,只要指定的序列号与ACKD_SEQ中的值匹配。
    • 如果AckNak_Seq_Num没有指定最近确认的TLP的序列号,那么DLLP确认了重试缓冲区中的一些TLP:
      • 从最早的TLP开始,清除重试缓冲区中所有TLP,直到对应于AckNak_Seq_Num的TLP。
      • 将ACKD_SEQ加载为AckNak_Seq_Num字段中的值。
      • 重置REPLAY_NUM和REPLAY_TIMER。
    • 如果DLLP是Nak,启动重传(见上文)。
  • 注意:接收到Nak不是一个报告错误。

以下规则描述了数据链路层重试缓冲区的操作,必要时从该缓冲区重新传输TLPs:

  • 传输的TLPs副本必须存储在数据链路层重试缓冲区。

3.6.3 TLP接收器的LCRC和序列号

数据链路层的TLP接收路径(如图3-1中标记为2和4的路径)通过检查LCRC和序列号来处理物理层接收到的TLPs,如果通过检查,则将TLP传递给接收事务层;如果损坏,则请求重传。

用于检查TLP LCRC和序列号以及支持数据链路层重试的机制,是以概念性的“计数器”和“标志”来描述的:这种描述并不意味着也不要求特定的实现方式,仅用于阐明要求。

3.6.3.1 TLP接收器的LCRC和序列号规则

以下计数器、标志和计时器用于解释本节中剩余的规则:

  • 以下12位计数器被使用:
    • NEXT_RCV_SEQ - 存储下一个TLP的预期序列号
      • 在DL_Inactive状态下设置为000h
  • 以下标志被使用:
    • NAK_SCHEDULED
      • 在DL_Inactive状态下清除
  • 以下计时器被使用:
    • AckNak_LATENCY_TIMER - 计时决定何时安排发送Ack DLLP,根据以下规则:
      • 在DL_Inactive状态下设置为0
      • 每次安排发送Ack或Nak DLLP时从0重新开始;当所有接收到的TLP都已用Ack DLLP确认后重置为0
      • 如果最初没有未确认的TLP,然后接收到一个TLP,AckNak_LATENCY_TIMER仅在TLP已转发到接收事务层时开始计时

以下规则按顺序应用,以描述如何处理接收到的TLP,以及什么事件触发发送Ack和Nak DLLPs(见图3-19):

  • 如果物理层指示接收器错误,丢弃当前正在接收的任何TLP,并释放为TLP分配的任何存储空间。注意,这类错误的报告由物理层完成(因此,数据链路层不会报告)。
    • 如果在指示接收器错误时正在接收TLP,并且NAK_SCHEDULED标志清除,
      • 立即安排传输Nak DLLP
      • 设置NAK_SCHEDULED标志
  • 如果物理层报告接收到的TLP被无效化,并且LCRC是计算值的逻辑非,丢弃TLP并释放为TLP分配的任何存储空间。这不被认为是一个错误。
  • 如果TLP被无效化但LCRC与计算值的逻辑非不匹配,TLP已损坏——丢弃TLP并释放为TLP分配的任何存储空间。
    • 如果NAK_SCHEDULED标志清除,
      • 立即安排传输Nak DLLP
      • 设置NAK_SCHEDULED标志
      • 这是一个坏TLP错误,是与端口相关联的报告错误(见第6.2节)
  • LCRC值的检查方法:
    • 将用于计算的相同算法应用于接收到的TLP,不包括接收到的TLP中的32位LCRC字段
    • 将计算结果与接收到的TLP的LCRC字段中的值进行比较
  • 如果计算结果不相等,则TLP已损坏 - 丢弃TLP并释放为TLP分配的任何存储空间。
    • 如果NAK_SCHEDULED标志被清除,
      • 立即安排传输Nak DLLP
      • 设置NAK_SCHEDULED标志
      • 这是一个坏TLP错误,并且是与端口相关联的报告错误(见第6.2节)。
  • 如果TLP序列号与存储在NEXT_RCV_SEQ中的预期值不相等:

    • 丢弃TLP并释放为TLP分配的任何存储空间
    • 如果TLP序列号满足以下等式:

      • (NEXT_RCV_SEQ - TLP Sequence Number) mod 4096 <= 2048     TLP是重复的,将安排传输Ack DLLP(根据传输优先级规则)。

    • 否则,TLP序号错误(表明一个或多个TLP丢失):

      • 如果NAK_SCHEDULED标志被清除,
        • 立即安排传输Nak DLLP
        • 设置NAK_SCHEDULED标志
        • 这是一个坏TLP错误,并且是与端口相关联的报告错误(见第6.2节)。
      • 无论NAK_SCHEDULED标志的状态如何,允许这是一个与端口相关联的报告错误(见第6.2节),图3-17中说明了这种允许的行为。然而,为了防止错误传播,建议端口仅在NAK_SCHEDULED标志被清除时报告此类错误。
  • 如果TLP序列号等于存储在NEXT_RCV_SEQ中的预期值:

    • 四个保留位、TLP序列号和LCRC(见图3-14)都被移除,并将TLP的其余部分转发到接收事务层
      • 数据链路层在传输TLP时指示TLP的开始和结束给事务层
        • 数据链路层将TLP视为“黑盒”,并且不处理或修改TLP的内容
      • 请注意,接收端流量控制机制在TLP转发到接收事务层之前不考虑任何接收到的TLP。
    • NEXT_RCV_SEQ递增
    • 如果已设置,清除NAK_SCHEDULED标志

  • TLP接收器必须安排传输Ack DLLP,以便在满足以下所有条件时不晚于传输:
    • 数据链路控制和管理状态机处于DL_Active状态
    • TLPs已转发到接收事务层,但尚未通过发送Ack DLLP确认
    • AckNak_LATENCY_TIMER达到或超过表3-7中指定的2.5 GT/s模式操作值,表3-8中指定的5.0 GT/s模式操作值,表3-9中指定的8.0 GT/s及更高模式操作值
    • 用于Ack DLLP传输的链路已经在L0状态或已转换到L0状态
    • 注意:如果尚未处于L0状态,则链路必须转换到L0状态才能传输Ack DLLP
    • 当前没有其他TLP或DLLP正在用于Ack DLLP传输的链路上传输
    • NAK_SCHEDULED标志被清除 
    • 注意:每次安排传输Ack或Nak DLLP时,AckNak_LATENCY_TIMER必须从0重新开始
  • 数据链路层Ack DLLPs可以安排传输得比要求的更频繁。
  • 数据链路层Ack和Nak DLLPs在AckNak_Seq_Num字段中指定的值是(NEXT_RCV_SEQ - 1)。

表3-7、表3-8和表3-9定义了AckNak_LATENCY_TIMER的阈值,对于任何特定情况,称为Ack延迟限制。

TLP接收器和合规性测试必须基于TLP接收器端口处测量的Ack延迟计时,从接收到TLP的最后一个符号的时间到传输Ack DLLP的第一个符号的时间。

在测量直到Ack DLLP传输时,合规性测试必须考虑到在该方向上已经进行的任何TLP或其他DLLP传输(从而阻止Ack DLLP传输)。如果启用了L0s,合规性测试必须考虑到链路在Ack DLLP传输方向上的L0s退出延迟。如果链路控制寄存器的Extended Synch位置起,则合规性测试还必须考虑到其对L0s退出延迟的影响。

TLP接收器不需要根据L0s退出延迟或扩展同步位的值来调整其Ack DLLP调度。

 

 

 

  • 13
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值