Надежная передача TLP (PL) пакетов через каждое соединение
Функции уровня передачи данных при выполнении этой задачи (Протокол ACK/NAK) заключаются в обеспечении:
- надежной передачи пакетов TLP на уровне передачи данных DLL (TLP(DLL)) через соединение от одного устройства А к другому устройству Б,
- приемная часть одного устройства, например, Б должна принять пакеты TLP(DLL) и DLLP в том же самом порядке, в котором передающая часть устройства А их отправила.
Для каждого пакета TLP(DLL), который посылается от одного устройства A к другому устройству Б, приемная часть, используя поле LCRC, проверяет ошибки в принимаемом пакете TLP (DLL) . Приемник устройства Б уведомляет передатчик устройства А о правильном или неправильном приеме пакета TLP (DLL) , возвращая ACK или NAK пакеты DLLP, см. табл. 2.5.7.. Прием пакета ACK приемником устройства А указывает на то, что получатель принял успешно один или более пакетов TLP(DLL). Прием пакета NAK передатчиком указывает, что получатель принял один или более пакетов TLP(DLL) с ошибкой. Устройство А, которое получает пакет NAK , повторяет отправку соответствующего пакета TLP(DLL) из своего буфера повтора.
На рис. 2.5.7. приведена структурная схема, поясняющая работу протокола ACK/NAK уровня передачи данных, для устройств А и Б. Рассмотрим основные блоки этой схемы.
Пояснения к схеме
Приемник использует поле LCRC, чтобы проверить на ошибку CRC принятый пакет TLP(DLL).
CRС- это блок проверок на ошибки CRC пакетов DLLP, приходящих на вход приемника устройства.
Регистр AS (ACK_SEQ) этот 12-битный регистр, отслеживащий и сохраняющий последовательностный номер последнего полученного пакета ACK DLLP или пакета NAKDLLP
Регистр UAS (Update ACK_SEQ) этот 12-битный регистр.отслеживащий и сохраняющий последоватеностный номер последнего полученного ACK пакета DLLP или NAK пакета DLLP. Он инициализируется всеми единицами при сбросе или когда передача данных неактивна. Этот регистр заполняется значением поля AckNak_Seq_Num [11:0], полученого ACK пакета DLLP или NAK пакета DLLP. Значение регистра UAS сравнивается с значением счетчика NTS (NEXT_TRANSMIT_SEQ).
Если (NTS - UAS) mod 4096>=2048, тогда новые пакеты TLP с уровня транзакции не принимаются уровнем передачи данных, до тех пор, пока это соотношение будет нарушено. Кроме того, уровень передачи данных сообщает об ошибке протокола, которая является неисрпавимой некорректируемой ошибкой.
Буфер приема (Receivebuffer) временно сохраняет принимаемый пакет TLP(DLL), пока проводятся проверка на CRC и проверка его последовательностного номера. Если нет никаких ошибок, пакет TLP(DLL) обрабатывается (удаляются поля SN и LCRC) и пакет TLP передается на транзакционный уровень получателя. Если в пакете TLP(DLL) есть ошибки, то пакет TLP(DLL) отбрасывается, и пакет NAKDLLP ставится в очередь на отправку. Если вновь принятый пакет TLP(DLL) является дубликатом ранее принятого пакета TLP(DLL), то пришедший пакет отбрасывается, и пакет ACK DLLP ставится в очередь на отправку.
LCRC этот блок, который проверяет принятые пакеты TLP(DLL) на ошибки CRC, используя его 32-битное поле LCRC.
Счетчик NRS- 12битный счетчик последовательностного номера следующего приема (NEXT_RCV_SEQ) следит за последовательностным номером следующего ожидаемого пакета TLP(DLL). Все разряды этого счетчика устанавливаются в нуль при системном сбросе, или когда передача данных неактивна. Содержимое этого счетчика увеличивается на 1 каждый раз, когда безошибочный пакет TLP(DLL) принят и передан на транзакционный уровень. Счетчик сбрасывается в 0 после достижения значения 4095. Содержимое счетчика не увеличивается для пакетов TLP(DLL), принятых с ошибкой CRC, аннулировнных пакетов TLP(DLL), или пакетов TLP(DLL) с неправильными последовательностными номерами.
CNC- блок проверки последовательностного номера полученного пакета TLP(DLL) на соответствие текущему значению содержимого счетчика NRS, а именно:
если последовательностный номер пакета TLP(DLL) равен значению содержимого счетчика NRS, то пакет TLP(DLL) принимается, обрабатывается (удаляются поля SN и LCRC) и передается уровню транзакции. Значение счетчика NRS инкрементируется. Получатель продолжает обрабатывать входящие пакеты TLP(DLL) и не обязан возвращать пакет ACK DLLP, пока таймер LT (ACKNAK_LATENCY_TIMER) не превышает свое установленное значение.
если последовательностный номер пакета TLP(DLL) является более ранним последовательностным номером по отношению к последовательностному номеру, хранимому в счетчике NRS, то такой пакет TLP(DLL) является дубликатом. Он отбрасывается, и пакет ACK DLLP ставится в очередь на отправку передатчика.
если последовательностный номер TLP(DLL) является более поздним последовательностным номером по отношению к последовательностному номеру, хранимому в счетчике NRS, то пакет TLP(DLL) отбрасывается, и пакет NAKDLLP ставится в очередь для возвращения передатчику.
Таймер LT (ACKNAK_LATENCY_TIMER) контролирует прошедшее время, с того момента, как последний из пакетов ACK DLLP или NAKDLLP были поставлены в очередь для отправки. Получатель использует этот таймер, чтобы убедиться, что он обрабатывает пакеты TLP(DLL) достаточно быстро и возвращает пакеты ACK DLLP или NAKDLLP, когда таймер превышает установленное значение.
ACK/NAKG (Генератор пакетов ACK/ NAKDLLP ) - этот блок, который создает пакеты ACK DLLP или NAKDLLP, смотри табл. 2.5.7. . Пакеты ACK DLLP и NAKDLLP содержит в себе поле AckNak_Seq_Num [11:0], полученное от счетчика NRS и равное значению NRS минус 1.
Вопрос 24