• Drano Rauteon

Hardware - PCI Express (PARTE 2)

Atualizado: 13 de Dez de 2020


Imagem 1


Como foi dito no primeiro tópico sobre a arquitetura do PCI Express, agora teremos o texto sobre o controlador desta conexão. Observe o diagrama abaixo:

Imagem 2 - Diagrama de blocos do controlador PCI Express


Mas o que significa esses blocos? Como eles são organizados internamente? É o que será visto agora!

-> Packet e Flow Control: "Packet" é processador de pacotes, isto é, as sequências de dados que chegam ao controlador PCI Express. Já o "Flow Control" é um circuito de controle de distribuição de pacotes entre os lanes. Cada conjunto de lanes possui um Processador e Controlador de Pacotes, por exemplo, um slot PCIe x16 possui um Packet e Flow Control. O agrupamento de lanes depende da fabricante do chip. Por exemplo, se o chip possui 40 lanes, a fabricante pode colocar dois grupos x16 e o restante x1, ou dividir os 40 em um grupo x16, dois grupos x8 e o restante x1;

-> TX / RX FIFO: Tanto no hardware quanto no software existem sistemas de enfileiramento de processos. O FIFO, sigla para First In, First Out que em português significa "Primeiro Entrar, Primeiro Sair" é um buffer, ou seja, uma memória RAM do tipo cache (formada por flip-flops), que permite enfileirar pacotes (sequências de dados) para que os dados fiquem armazenados temporariamente enquanto outros dados estão sendo tratados pelos circuitos. Para o receptor (RX) do lane há um FIFO e para o transceptor (TX) do lane há outro, já que um recebe e outro envia informações;

-> PCIe Link Layer: É a camada de ligação entre o Packet e Flow Control e os circuitos seguintes do lane. Nele que são executados os protocolos de comunicação. Um desses protocolos é o Flow Control Protocol, que faz com que os pacotes de dados sejam enviados se no buffer do receptor tiver espaço. Você verá mais detalhes sobre este protocolo na explicação sobre a arquitetura do PCI Express, na sequência desse texto;

-> PCIe Transaction: Para cada lane há um circuito que prepara os dados para serem enviados (é uma espécie de controlador dentro do controlador). Esta camada é a responsável por tratar as solicitações feitas pelo sistema operacional e pela camada de ligação. Neste circuito os dados podem receber atributos que otimizam a transmissão. Por exemplo, a um pacote de dados pode ser atribuído prioridade, assim ele será enviado o quanto antes;

-> MAC Layer: assim como nas redes de internet, os dispositivos precisam ter endereços físicos para que o receptor saiba de que link veio o dado ou para qual ele será enviado;

-> PCIe PHY: PHY é a abreviação de Physical, que é a camada física, a parte do circuito responsável pela preparação dos dados para serem enviados pelo meio físico, ou seja, as trilhas da placa-mãe. Este processo de preparação é a modulação ou codificação. Como já foi dito, o PCIe utiliza a sinalização LVDS para a transferência dos dados nas trilhas. O PCIe também tem codificação, que como já foi dito, nas revisões 1.0 e 2.0 é a 8B/10B e na revisão 3.0 e 4.0 é a 128B/130B (mantendo a compatibilidade com a 8B/10B). Na sequência desse texto você vê a lógica usada na codificação dos dados no circuito PHY;

-> O PLL (Phase Locked Loop) você já deve saber se leu o artigo sobre clock. O clock base do PCI Express, que é por padrão 100 MHz, é recebido pelo PLL e ele faz a multiplicação deste sinal por 25 vezes (revisão 1.0), 50 vezes (revisão 2.0), 80 vezes (revisão 3.0) ou 160 vezes (4.0) para sincronizar o emissor com o receptor de dados, além de gerar o sinal de sincronismo dos circuitos internos do controlador PCIe. Futuramente você verá mais detalhes sobre um circuito PLL.

Para fazer com que todos estes circuitos se relacionem e funcionem há o firmware, conjunto de instruções que faz o hardware funcionar. No caso do PCI Express, não temos acesso ao firmware, a prova disso é que não podemos alterar o multiplicador de clock do PLL. Em algumas placas só temos acesso ao PLL externo (da placa-mãe) que gera o clock base do PLL do controlador PCIe, que como foi dito mais acima, é setado em 100 Mhz.

O padrão PCI Express possui uma arquitetura que é dividida em quatro camadas. Elas serão explicadas a seguir:

PHYSICAL (CAMADA FÍSICA)

São os grupos de trilhas de comunicação, conhecidas como lanes e o circuito controlador PCI Express. Mais abaixo você vê o diagrama do controlador PCI Express. É só continuar lendo.

A camada PHY é dividida em duas subcamadas: a elétrica e a lógica.

A camada elétrica diz respeito aos padrões eletrônicos dos sistema (socket, trilhas, controlador e afins) e a camada lógica se refere ao sistema de codificação e comunicação da conexão.

A subcamada lógica às vezes é dividida em uma subcamada MAC e uma PCS, embora essa divisão não seja formalmente parte da especificação PCIe. Existe uma especificação publicada pela Intel sobre a camada PHY (Physical) para PCI Express (PIPE), que define a divisão funcional MAC / PCS e a interface entre essas duas subcamadas. A especificação PIPE também identifica a camada de anexo de mídia física (PMA), que inclui o serializador / desserializador (SerDes) e outros circuitos analógicos, no entanto, como as implementações de SerDes variam muito entre os fornecedores de ASIC, o PIPE não especifica uma interface entre o PCS e o PMA.


Para complementar o assunto e iniciar o próximo tópico:


No que se refere a transmissão de dados, o PCI Express envia todas as mensagens de controle, incluindo interrupções, pelas mesmas linhas de dados. O protocolo serial nunca pode ser bloqueado, de forma que a latência ainda é comparável ao PCI, que tem linhas de interrupção dedicadas.

A transmissão de dados em múltiplos caminhos é intercalada, o que significa que cada pacote de dados é enviado por caminhos sucessivos. A especificação do PCIe refere-se a esta intercalação como "Data Striping". Apesar de requisitar complexidade de hardware para sincronizar os dados, o Data Striping pode aumentar significativamente o volume de processamento da conexão. Devido às exigências, o Data Striping pode não necessariamente reduzir a latência de pequenos pacotes de dados em uma ligação.

O PCI Express não inclui uma linha de sincronismo dedicada, portanto a informação de clock deve ser incorporada aos pacotes de dados. Para que isso aconteça, é utilizado o sistema de codificação 8B/10B e 18B/130B. Estes esquemas de codificação são muito comuns para assegurar que não haja uma sequência de uns ou zeros consecutivos. Isto é necessário para evitar que o receptor se perca na contagem dos bits.

Muitos outros protocolos (tais como SONET) utilizam uma forma diferente de codificação conhecido como "Scrambling" para inserir informações de clock nos fluxos de dados. A especificação do PCI Express também define um algoritmo de Scrambling, mas ele é utilizado para reduzir a interferência eletromagnética, impedindo a repetição do padrão de dados no fluxo de dados transmitidos.

Você verá mais sobre o assunto codificação na sequência do texto.


DATA LINK (CAMADA DE LIGAÇÃO)

Esta camada garante o envio e recebimento de dados através de protocolos de comunicação. Um desses protocolos é o Flow Control Protocol que faz com que os pacotes de dados sejam enviados se no buffer (pequena quantidade de memória RAM) do receptor tiver espaço.

Esta camada implementa a sequenciação do "Transaction Layer Packets" (TLP's) que são geradas pela camada "Transaction Layer", a proteção dos dados de 32 bits através de um controle de redundância cíclica de código (CRC, porém neste contexto é conhecido como LCRC) e um protocolo de aviso (sinalizadores ACK e NAK).

Cada pacote da camada de transação (TLP) é transmitido entre dois pontos junto com um número sequencial (este número serve como uma etiqueta de identificação exclusiva para cada TLP transmitido e é inserido no cabeçalho do TLP de saída.), que é verificado e dado um resultado na forma de aviso "ACK", enquanto aqueles que não cumprem essas verificações, recebem um resultado negativo no aviso (NAK). TLP's que resultam em um NAK, ou timeouts que ocorrem enquanto se espera por um ACK, resultam no reenvio das TLP's a partir de um buffer especial, na transmissão de dados via Camada Data Link. O código LCRC é anexado ao final de cada TLP de saída.

Sinais ACK/NAK são comunicados através de um pacote de baixo nível conhecido como uma "Data Link Layer Packet", ou "DLLP". DLLP's também são usados para controlar fluxo, comunicar informações entre as duas camadas de transação entre dispositivos conectados, bem como de algumas funções de gestão.

No lado do recebimento, o LCRC do TLP recebido e o número de sequência são ambos validados na camada de Data Link. Se a verificação LCRC falhar (indicando um erro de dados), ou o número de sequência estiver fora do intervalo (não consecutivo desde o último TLP válido recebido), então o TLP é invalidado, bem como quaisquer TLP's recebidos após o TLP inválido, são considerados inválidos e descartados. O receptor então envia uma mensagem de confirmação negativa (NAK) com o número de sequência do TLP inválido, solicitando a retransmissão de todos os TLP's para a frente desse número de sequência.

Se o TLP recebido passar na verificação de LCRC e tiver o número de sequência correto, ele será tratado como válido. O receptor do link incrementa o número de sequência (que rastreia o último TLP válido recebido) e encaminha o TLP válido para a camada de transação do receptor. Uma mensagem ACK é enviada ao transmissor do pacote.

Se o transmissor receber uma mensagem NAK, ou nenhuma confirmação (NAK ou ACK) for recebida até que o período de tempo limite expire, o transmissor deve retransmitir todos os TLP's que não possuem uma confirmação positiva (ACK). Salvo um mau funcionamento persistente do dispositivo ou meio de transmissão, a camada de enlace apresenta uma conexão confiável com a camada de transação, uma vez que o protocolo de transmissão garante a entrega de TLP's em um meio não confiável.

Além de enviar e receber TLP's gerados pela camada de transação, a camada de link de dados também gera e consome DLLP's. Os sinais ACK e NAK são comunicados por DLLP's, assim como algumas mensagens de gerenciamento de energia e informações de crédito de controle de fluxo (em nome da camada de transação).

Na prática, o número de TLP's não confirmados é limitado por dois fatores: o tamanho do buffer de reprodução do transmissor (que deve armazenar uma cópia de todos os TLP's transmitidos até que o receptor os reconheça) e os créditos de controle de fluxo emitidos pelo receptor para um transmissor. O PCI Express exige que todos os receptores emitam um número mínimo de créditos.

SOFTWARE

Nesta camada está o driver que se comunica com o firmware da placa conectada através do SM Bus e faz a comunicação com o sistema operacional. Assim é possível detectar e configurar a placa conectada da melhor maneira possível, pois o sistema sabe onde a placa está conectada e consegue utilizar todas as funções e configurações que ela possui. Também é possível otimizar a comunicação do sistema operacional com a placa conectada (já que o SO controla todos os dados que circulam sobre os circuitos).

CAMADA DE TRANSAÇÃO

Esta camada é a responsável por tratar as solicitações feitas pelo sistema operacional e pela camada de ligação. Nesta camada os dados podem receber atributos que otimizam a transmissão. Por exemplo, a um pacote de dados pode ser atribuído prioridade, assim ele será enviado o quanto antes.

O PCI Express implementa transações divididas (transações com solicitação e resposta separadas por tempo), permitindo que o link carregue outro tráfego enquanto o dispositivo de destino coleta dados para a resposta.

O PCI Express usa controle de fluxo baseado em crédito. Nesse esquema, um dispositivo anuncia uma quantidade inicial de crédito para cada buffer recebido em sua camada de transação. O dispositivo na extremidade oposta do link, ao enviar transações para este dispositivo, conta o número de créditos que cada TLP consome de sua conta. O dispositivo de envio só pode transmitir um TLP quando isso não faz com que sua contagem de crédito consumido exceda seu limite de crédito. Quando o dispositivo receptor termina de processar o TLP de seu buffer, ele sinaliza um retorno de créditos ao dispositivo remetente, o que aumenta o limite de crédito pelo valor restaurado. Os contadores de crédito são contadores modulares, e a comparação dos créditos consumidos com o limite de crédito requer aritmética modular.

A vantagem desse esquema (em comparação com outros métodos, como estados de espera ou protocolos de transferência baseados em handshake) é que a latência do retorno de crédito não afeta o desempenho, desde que o limite de crédito não seja encontrado. Essa suposição geralmente é atendida se cada dispositivo for projetado com tamanhos de buffer adequados.

Como outros sistemas de interconexão serial de alta taxa de dados, o PCIe tem uma sobrecarga de protocolo e processamento devido à robustez de transferência adicional (CRC e confirmações). Transferências unidirecionais longas e contínuas (como aquelas típicas em controladores de armazenamento de alto desempenho) podem se aproximar de 95% da taxa de dados brutos (via) do PCIe. Essas transferências também se beneficiam ao máximo com o aumento do número de lanes (x2, x4, x8, x16 e x32). Mas em aplicações mais típicas (como um controlador USB ou Ethernet), o perfil de tráfego é caracterizado como pacotes de dados curtos com confirmações aplicadas frequentes. Este tipo de tráfego reduz a eficiência do link, devido à sobrecarga da análise de pacotes e interrupções forçadas (seja na interface do host do dispositivo ou na CPU do PC). Por ser um protocolo para dispositivos conectados à mesma placa de circuito impresso (PCB), não requer a mesma tolerância para erros de transmissão que um protocolo para comunicação em distâncias maiores e, portanto, essa perda de eficiência não é particular do PCIe.

Cada camada pode trabalhar de forma individual, se interferir na outra. O PCI Express consegue dividir a camada física em até 8 canais de comunicação (chamados de Virtual Channels - Canais Virtuais) e prioriza os dados a serem transmitidos para que aplicações em tempo real, como jogos não sejam prejudicadas.

Vale lembrar que o PCIe também utiliza o modelo OSI, o mesmo utilizado na rede mundial de computadores para efetuar a comunicação entre emissor e receptor de dados. O modelo OSI consiste em 7 camadas de protocolos (neste caso, os protocolos são específicos para o PCIe). Estas 7 camadas são divididas entre as cinco camadas da arquitetura, onde a camada 1 do modelo OSI é a mais baixa, ou seja, a camada física e a camada 7 a mais alta, ou seja, a camada de software.

O slot PCIe, como já foi dito, é uma conexão ponto-a-ponto. Esta conexão é responsável por ligar o circuito controlador PCIe que está presente no chipset da placa-mãe, ou no caso das placas mais novas, o controlador que está dentro da CPU. Para que o controlador envie e receba informações da placa que está conectada ao(s) slot(s) PCIe, estas informações devem estar codificadas.

No caso da revisão 1.0 e 2.0 do padrão PCIe, era utilizada a codificação 8B/10B. Já na revisão 3.0 e 4.0 é utilizado a codificação 128B/130B.

Mas o que significa 8B/10B e 128B/130B?


Codificação 8B/10B: A cada 8 bits enviados, são acrescentados mais 2 bits, fazendo com que sequência tenha 10 bits no total. Para que esta codificação aconteça, tanto o controlador presente no chipset da placa-mãe ou na CPU, quanto o controlador da placa que está conectada no slot tem que dividir o pacote de dados a ser enviado (os 8 bits) em dois grupos: um de 5 bits (os bits menos significativos) para aplicar a codificação 5B/6B, e outro grupo de 3 bits (os bits mais significativos) para aplicar a codificação 3B/4B.

A fórmula para o resultado desta codificação é:


Esta é a maneira de explicar o resultado da codificação. "D" significa o dado (o pacote de 8 bits), "x" é o valor decimal do resultado da codificação 5B/6B, que é os 5 bits, e o "y" é o valor decimal do resultado da codificação 3B/4B, que é os 3 bits.

Tem mais um quesito: não é só aplicar mais um bit em cada grupo. O total de 10 bits deve ter a mesma quantidade de 0 e 1 e deve respeitar uma determinada sequência padronizada, para que não fiquem longas sequências de zeros ou uns, fazendo com que o controlador possa errar. Para que o controlador faça a codificação é utilizado 3 tabelas.

Veja a primeira tabela abaixo. Esta tabela se chama tabela de disparidade e o sistema a usa para saber se falta 1 bit(-1) ou não(+1) na sequência de 8 bits, para daí ser aplicado os 2 bits adicionais. Também é utilizada a disparidade do pacote de dados anterior para se saber qual coluna das outras duas tabelas vai ser utilizada:

Tabela 1


A segunda tabela mostra os valores de "Dx" para disparidade de "-1" e "+1" bit. Veja só:

Tabela 2


Veja agora a tabela para os valores de "y":

Tabela 3


Temos o código binário 00101010 para ser enviado. Sua codificação será:

Exemplo 1


O código 00101010 será transmitido pelas trilhas da conexão PCIe na sequência 1101001001.

Lembrando que este é só um exemplo. Para saber a codificação utilizada deve-se utilizar a tabela de disparidade para saber a disparidade do dado anterior e do dado a ser enviado.

Esta é a codificação 8B/10B. É meio complexo entender esta explicação mas, é só para você ter uma ideia de como funciona a transferência de dados na realidade. A interface SATA também utiliza este sistema de codificação. Para saber mais sobre a interface SATA, CLIQUE AQUI!

Codificação 128B/130B: funciona da mesma forma que a codificação 8B/10B. A diferença é que se perde menos na taxa de transferência, já que apenas 2 bits extras são utilizados para codificar 128 bits, diferente do 8B/10B que para cada 8 bits era somado mais 2, ocupando 20% da largura de banda.

Os 48 bits mais significativos utilizam uma tabela e os 80 bits menos significativos utilizam outra tabela. São milhares e milhares de combinações de zeros e uns, o que tornaria muito extenso e sem sentido mostra-las aqui, já que esse sistema funciona de forma similar ao 8B/10B.

Por se tronar um conteúdo muito grande e complexo, resolvi dividir o artigo sobre PCI Express em 2 capítulos. Para ver o primeiro capítulo, CLIQUE AQUI!


Se gostou do artigo, tem alguma sugestão, se viu alguma inconsistência ou erro de gramática, entre em contato com o Hardware Central pelo e-mail hardwarecentrallr@gmail.com.

FONTES e CRÉDITOS


Texto: Leonardo Ritter

Imagens, diagramas e tabelas: Leonardo Ritter

Referências: Livro de Redes de computadores de Gabriel Torres (codificação 8B/10B); Guia do Hardware; Clube do Hardware; Pinouts.ru; Biblioteca de diagramas do Hardware Central; Wikipedia (Somente artigos com fontes verificadas!) Trabalho de engenharia reversa feito pelo autor deste texto.


Última atualização: 13 de Dezembro de 2020.

43 visualizações

© 2020 Hardware Central Tecnologia Entretenimento e Comunicação do Brasil Ltda. Todos os direitos reservados.

Wix Editor / Revisão da web page: 3.1/2020 (16/07/20)