Imagem 1
Esta é a sequência do Capítulo 1 sobre o PCIe. Aqui vamos abordar mais detalhes sobre os blocos de hardware do controlador, sobre o sistema de codificação e protocolo de comunicação.
Semelhante ao controlador da interface SATA, o PCIe consegue ser ainda mais modular e ter mais utilidades. Observe o diagrama abaixo:
Diagrama 1 - 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.
Vamos nos concentrar no PHY, o bloco de hardware onde se encontram o Buffer elástico, o CDR e o PLL para recuperação do clock incorporado aos dados, bem como o sistema de codificação. Veja o diagrama abaixo:
Diagrama 2 - O Bloco de hardware PHY e seus circuitos
O Nexperia PX1011B ainda utiliza-se de uma interface PCIe x1 de revisão 1.0. O mesmo bloco de hardware se aplica ao PCIe 2.0.
Note que há uma interface de 8 bits Full Duplex (8 para enviar e 8 para receber) entre o bloco PHY e o bloco MAC. É uma interface PIPE (PHY Interface For PCI Express), que pode ter 8, 16 ou até 32 bits de largura.
CURIOSIDADE: Note o uso da sinalização SSTL_2, a mesma utilizada para os barramentos de memória RAM DDR2, que operam com 2,5 Volts. Obviamente, na atualidade, o padrão SSTL utilizado deve ser mais moderno, tal como o SSTL_12, utilizado nas memórias RAM DDR4 (que operam com 1,2 Volts).
Agora veja o bloco de hardware PHY padrão para a interface PCI 3.0, 4.0 e 5.0:
Diagrama 3 - O bloco PHY das revisões mais atuais do PCIe
CURIOSIDADE: Ao invés de utilizar o PIPE, pode ser implementado um SerDes com barramento de 10, 20, 40 ou 80 bits de largura entre o PHY e o MAC, porém, esta forma de interconectar estes blocos de hardware dentro do chip é opcional.
A modularidade das interfaces seriais atuais permitiu que a indústria criasse controladores que, com a alteração do PHY, fosse possível implementar um punhado de interfaces, tais como PCIe, SATA, USB 3.x e DisplayPort. Isso barateou muito o custo de produção de chips. O que permite tal façanha é a padronização da interface PIPE, que através de comandos específicos permite a comunicação do bloco de hardware MAC com o PHY de várias interfaces.
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 para o controlador PCIe, que como foi dito mais acima, é setado em 100 Mhz, e incrementar muito este valor no Setup do BIOS pode gerar bugs.
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. No Diagrama 1, 2 e 3 você vê a estrutura dos controladores PCI Express 1.0, 2.0, 3.0. 4.0 e 5.0.
A camada PHY é dividida em duas subcamadas:
→ A camada elétrica diz respeito aos padrões eletrônicos dos sistema (socket, trilhas, sinalização 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. De qualquer forma, os diagramas 2 e 3 explicam bem o hardware envolvido aqui.
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últiplas pistas é 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", aquilo lá que expliquei no Capítulo 1 sobre o Clock Data Recovery e eliminação das trilhas em zigue-zague (consequentemente a diminuição do CrossTalk).
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 (apenas um clock de referência para sincronizar emissor e receptor, e que é opcional), 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 128B/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.
CURIOSIDADE: 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" (TLPs) 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). TLPs que resultam em um NAK, ou timeouts que ocorrem enquanto se espera por um ACK, resultam no reenvio das TLPs 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 "Data Link Layer Packet", ou "DLLP". DLLPs 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 TLPs 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 TLPs 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 TLPs 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 TLPs em um meio não confiável.
Abaixo, dois diagramas de TLP:
Diagrama 4 - Como é formado um pacote de dados no protocolo de funcionamento para o PCIe
O "Payload" é a carga útil que um pacote leva, isto é, um pedaço de uma informação de imagem ou um pedaço de um arquivo... O tamanho limite é 4096 Bytes, no entanto, ele pode ser formado por meros 128 Bytes, por exemplo.
Além de enviar e receber TLPs gerados pela camada de transação, a camada de link de dados também gera e consome DLLPs. Os sinais ACK e NAK são comunicados por DLLPs, 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 TLPs 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 TLPs 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 SMBus 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 equipamento 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 o seu limite. 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 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 frequentes confirmações aplicadas. 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 por exemplo 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, 4.0 e 5.0 é utilizado a codificação 128B/130B. Todas elas são moduladas da forma NRZ Unipolar (Não Retorna a Zero, pulsação apenas em tensão positiva).
Tabela 1 - As especificações gerais do PCIe 3.0, 4.0 e 5.0
Primeiro vamos entender o que é NRZ:
Gráfico 1 - Exemplificando a diferença entre RZ e NRZ
Note que a "Differential Output Voltage" da Tabela 1 está entre 800 e 1300 miliVolts, o que indica que o pulso "0" é em torno de 800 mV e o pulso "1" fica na faixa dos 1300 mV.
Agora, compreender o que é Error Bit Rate (taxa de Erro de Bit):
A BER é uma medida adimensional, isto é, não possui uma unidade física específica que a defina. Pode, portanto, ser expressa como um percentual ou como uma potência de 10, o que é mais adotado. A título de exemplo, em redes locais Ethernet (LAN – Local Área Network) em 10 Mbit/s espera-se uma qualidade de transmissão com um valor melhor do que um bit errado em um bilhão de bits transmitidos, isto é, uma BER de 10E-9. No caso do PCIe é uma BER máxima de 10E-12 (na tabela é mencionado como 1E-12). Um BER de 10E-12 é menos que 1 bit errado dentro de um universo de 1 trilhão de bits.
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 2
A segunda tabela mostra os valores de "Dx" para disparidade de "-1" e "+1" bit. Veja só:
Tabela 3
Veja agora a tabela para os valores de "y":
Tabela 4
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.
E quem diria que o textinho lançado em 2018 chegasse nesse nível. Esperamos um dia lançar o Capítulo 4, e creio que logo virá, afinal o PCIe 6.0 já teve suas especs lançadas em 2022, utilizando modulação PAM (ao invés da NRZ) e já foi dada a largada para a criação do PCIe 7.0, com expectativa de lançamento para meados de 2025.
Para acessar o Capítulo 1, CLIQUE AQUI!
Para acessar o Capítulo 3, 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: 03 de Julho de 2022.
Comentários