这两个包的格式如下: 其中,AckNak_Seq_Num表示当前已经收到的最新的消息序号,所以和TCP类似,PCIe的Ack和Nak可以进行批量操作:无论是Ack还是Nak,当发送方收到这个消息之后,就可以将Retry Buffer中比这个序号老的消息全部移除了,所以Ack/Nak时只需要将最新的序号带上即可。Ack/Nak的差别在于:如果是Nak,那么发送方...
上面这个过程,暗示了我们实现ack机制link层需要哪些部件:1.seq num计数器 ack需要回复第几个tlp是ACK/NAK的;2.LCRC校验器;3.RETRY buffer,也就是说portA发送一个TLP后,在收到ACK前需要保存该TLP,方便重发;4.计时器,如果发了TLP,迟迟收不到ACK/NAK,就需要报警了。 OK,明白这个机制就行了,现在你大脑里要知...
发送端为了处理来自接收端的ACK/NAK DLLPs,设置了一个ACKD_SEQ,该计数器记录ACK/NAK DLLP中的AckNack_Seq_Num字段,该计数器的初始值为全1,数据链路层为Inactive状态时,保持为全1,在接收到接收方的ACK/NAK DLLP时,将使用ACK/NACK DLLP中的AckNak_Seq_Num字段更新ACKD_SEQ计数器。 4.6 接收端如何使用ACK/...
这两个包的格式如下: 其中,AckNak_Seq_Num表示当前已经收到的最新的消息序号,所以和TCP类似,PCIe的Ack和Nak可以进行批量操作:无论是Ack还是Nak,当发送方收到这个消息之后,就可以将Retry Buffer中比这个序号老的消息全部移除了,所以Ack/Nak时只需要将最新的序号带上即可。Ack/Nak的差别在于:如果是Nak,那么发送方...
1. 除了按照规范正确实现 IMPLICIT_RX_FLIT_SEQ_NUM 计数器之外,我们还发现,将隐式 FLIT 序列号记录在状态寄存器中或显示在调试日志中,能够更方便地进行比较和调试。 2. 确保您的监视器可以存储所有的 FLIT,将保存的 FLIT 与每个符号上的已退役 FLIT 进行比较,并报告相应的错误。
1. 除了按照规范正确实现 IMPLICIT_RX_FLIT_SEQ_NUM 计数器之外,我们还发现,将隐式 FLIT 序列号记录在状态寄存器中或显示在调试日志中,能够更方便地进行比较和调试。 2. 确保您的监视器可以存储所有的 FLIT,将保存的 FLIT 与每个符号上的已退役 FLIT 进行比较,并报告相应的错误。
ack> nak:byte 0 >byte 4 >+07 6 5 4 3 2 1 0+17 6 5 4 3 2 1 0+7 6 5 423 2 10+37 6 5 4 3 2 1 00000 0000 - ack0001 0000 - nakreservedacknak_seq_num+16-bitcrcacknak_seq_num域表明那些tlp包受影响,详 12、细介绍后续。initfck initfc2> updatefc dllp:byte 0 >byte ...
如果当前接收到的TLP中的序列号小于NEXT_RCV_SEQ(且差值不超过2048),则认为该TLP之前已经成功发送过了,此次是重复发送。需要注意的是,PCIe Spec认为重复发送并不是一个错误,只是直接将该TLP丢弃,并没有Nak或者Error Reporting,但是会返回一个包含有上一次成功接收的TLP的序列号(NRS-1)的Ack DLLP给发送端。
(3) TLP 4095第二个被成功接收,返回Ack DLLP给Device A, 同时Next_RCV_SEQ加1(也就是=0,因为4095+1超过了Next_RCV_SEQ的最大取值4095,从0开始记)。 (4) TLP 4094第三个被成功接收,返回Ack DLLP给Device A, 同时Next_RCV_SEQ加1(也就是=1)。
接收端不会为每个报文回复应答。如果发送端发送了3-5 sequence number报文,接收端NAK应答中的AckNak_Seq_Num是4,说明报文3-4已经被成功接受。 链路层发送报文的顺序 TLP、DLLP和物理层报文PLP都会使用同一个物理link发送报文,他们之间的顺序是有要求的,一般发送中的报文优先级最高,越是底层的报文优先级越高。