PCIe pour les hackers : le prélude de Diffpair
PCIe, également connu sous le nom de PCI-Express, est une interface très puissante. Voyons donc ce qu'il faut pour pirater quelque chose d'aussi puissant. PCIe est un peu intimidant au début, mais il est relativement simple de commencer à créer des éléments PCIe, et l'interface est assez résistante pour la technologie de niveau amateur. Il viendra un moment où nous voudrons utiliser une puce PCIe dans nos conceptions, ou peut-être utiliser la connexion PCIe disponible sur un certain module de calcul, et il est bon de s'assurer que nous sommes prêts pour cela.
PCIe est partout maintenant. Chaque ordinateur moderne possède un tas de périphériques PCIe exécutant des fonctions cruciales, et même les iPhones utilisent PCIe en interne pour connecter le processeur aux puces flash et WiFi. Vous pouvez obtenir toutes sortes de périphériques PCIe : contrôleurs Ethernet, cartes Wi-Fi à haut débit, graphiques et tous les lecteurs NVMe bon marché qui vous fournissent volontiers des tas de stockage lorsqu'ils sont connectés via PCIe. Si vous piratez un ordinateur portable ou un ordinateur monocarte et que vous souhaitez ajouter un périphérique PCIe, vous pouvez obtenir du PCIe à partir de l'un des sockets porteurs de PCIe, ou simplement accéder à un lien PCIe existant s'il n'y a pas prise à laquelle se connecter. Cela fait deux décennies que nous avons commencé à obtenir des périphériques PCIe - maintenant, PCIe est sur sa révision 5.0, et il est clair qu'il est là pour rester.
PCIe est un bus point à point qui connecte deux périphériques ensemble - par opposition au PCI, un bus plus ancien, qui pourrait connecter une chaîne de périphériques sur votre carte mère. Un côté d'un lien PCIe est un périphérique et un autre est un hôte. Par exemple, dans un ordinateur portable, votre CPU aura plusieurs ports PCIe - certains utilisés pour connecter le GPU, certains utilisés pour connecter une carte WiFi, certains utilisés pour Ethernet et certains utilisés pour un lecteur NVMe.
Chaque lien PCIe se compose d'au moins trois paires différentielles - l'une est une horloge de 100 MHz, REFCLK, qui est (presque) toujours nécessaire pour un lien, et deux paires qui forment une voie PCIe - une pour la transmission et une autre pour la réception. Il s'agit d'un lien x - vous pouvez également avoir des liens 2x, 4x, 8x et 16x, avec respectivement quatre, huit seize et trente-deux paires différentielles, plus, encore une fois, REFCLK. Plus le lien est large, plus son débit est élevé !
Maintenant, les largeurs de lien dans PCIe sont un sujet amusant avec beaucoup d'aspects sympas – mais d'abord, il serait bon de s'assurer que nous sommes sur la même page en ce qui concerne ce que signifie "paire différentielle" dans le contexte de PCIe. Ici, sur Hackaday, nous vous avons déjà parlé des détails des paires différentielles – revisitez absolument cet article si vous voulez en savoir plus sur les paires différentielles ! Ici, je vais vous rafraîchir rapidement les bases, puis vous dire ce qu'il faut savoir lorsque vous travaillez avec des paires différentielles pour PCIe en particulier.
Pour le dire simplement, une paire différentielle est constituée de deux signaux, l'un toujours opposé à l'autre, l'un généralement appelé positif et l'autre négatif. Vous obtenez le niveau logique du bit transmis en comparant les deux signaux l'un à l'autre - au lieu de comparer le niveau logique de chaque signal individuel à la masse comme nous le faisons habituellement, ce que l'on appelle "asymétrique". Avec une paire différentielle, les signaux sont proches les uns des autres et sont même entrelacés lorsqu'il s'agit de câbles, et par conséquent, toute interférence affecte les signaux de manière égale - comme les signaux sont comparés les uns aux autres pour recevoir des informations, cela signifie que les informations reçues n'est pas affecté par le bruit superposé sur les deux signaux. Les paires différentielles font également que les champs magnétiques des deux signaux s'annulent, ce qui rend la liaison moins bruyante.
En conséquence, les paires différentielles vous permettent d'augmenter la vitesse de transmission sans créer de bruit ni devenir sensible au bruit. Par conséquent, la très grande majorité des interfaces à haut débit utilisent des paires différentielles : Ethernet, PCIe, HDMI, DisplayPort, LVDS et même USB, bien que l'USB 2 ne soit que pseudo-différentiel, l'USB 3 est vraiment différentiel. Les interfaces résilientes telles que RS485 et CAN utilisent également des paires différentielles. Il est facile pour un amateur de commencer avec des paires différentielles avec des interfaces comme CAN, et l'USB 2 ne pose également aucun problème - à de courtes distances, ceux-ci fonctionneront quoi qu'il arrive, bien qu'il s'agisse de signaux différentiels et nécessitant théoriquement un traitement spécial.
Cela dit, les paires différentielles nécessitent en fait un peu plus de soin lors du routage d'un PCB ou de leur passage par des câbles. Si vous n'y faites pas attention, vous risquez des problèmes mystérieux ou des interfaces carrément inopérantes. Passons en revue ces exigences.
Tout d'abord, vous voulez garder les deux signaux de la paire proches l'un de l'autre sur toute leur longueur. Plus les deux signaux sont proches, mieux l'annulation des interférences externes fonctionne et moins ils émettent de bruit - étant donné que souvent, plusieurs paires de diff fonctionnent l'une à côté de l'autre, cela contribuera également à l'intégrité du signal des autres paires. En parlant d'exécuter des diffpairs séparés les uns à côté des autres, vous voudrez les éloigner les uns des autres et d'autres choses - qu'il s'agisse de remplissages au sol sur la même couche, de signaux haute fréquence. Une bonne règle empirique est la règle 5W, qui dit que vous devez avoir au moins cinq largeurs de trace de dégagement entre le centre de trace d'un diffpair et d'autres signaux. Vous n'avez pas toujours autant d'espace, mais il est bon de s'y tenir autant que possible.
Vous voudrez également vous assurer qu'il y a un chemin de terre ininterrompu juste sous ces signaux, à côté de toute la paire - avoir un remplissage au sol est idéal. Bien que les deux signaux soient comparés l'un à l'autre par le récepteur, chaque signal se comporte toujours comme un signal asymétrique en ce qui concerne le courant de retour. De plus, un peu de blindage supplémentaire ne fait certainement pas de mal. Si vous mettez PCIe sur un connecteur personnalisé, assurez-vous qu'il y a au moins une broche GND entre chaque paire. Enfin, assurez-vous que les deux pistes d'une paire ont la même longueur. Si votre paire change d'angle, l'une de ses deux pistes devient très légèrement plus courte, et votre outil de diffpair de l'éditeur de PCB devrait vous permettre d'ajouter un "wiggle" à cette piste pour vous assurer que les deux longueurs de piste sont égales.
Ensuite, il y a la question dont on parle peu - l'adaptation d'impédance. Si vous obtenez une paire différentielle du point A au point B, vous voudrez vous assurer que vous obtenez la bonne impédance, et les bases sont plus simples que vous ne le pensez. L'impédance est comme la résistance, mais pour les signaux qui changent. Chaque partie du chemin de déplacement de la paire différentielle a sa propre impédance : le récepteur et l'émetteur à l'intérieur des circuits intégrés utilisés, les broches du circuit intégré, les pistes de circuit imprimé et tous les connecteurs ou câbles intermédiaires si vous placez la paire différentielle à travers ceux-ci. À tout moment où l'impédance du signal change, une partie du signal est réfléchie à partir du point de non-concordance, et si le changement d'impédance est suffisamment important, cela se traduira par votre signal lors de sa réception.
Maintenant, cela signifie que vous devez vous assurer que l'impédance de votre liaison PCIe est bonne sur tout son chemin - ce qui, en pratique, signifie choisir des connecteurs appropriés et régler les largeurs et les espacements de vos pistes de PCB. Le matériel PCIe est principalement conçu avec une impédance de 85 Ω. Des choses comme les récepteurs, les émetteurs et les connecteurs destinés au PCIe sont hors de votre contrôle, et pour que l'impédance de l'ensemble du chemin soit raisonnablement uniforme, vous devez ajuster les pièces sous votre contrôle à la même valeur. Pour commencer, si vous devez utiliser des connecteurs pour votre liaison PCIe, choisissez ceux qui n'ont pas trop de décalage d'impédance. Un bon pari consiste à utiliser des connecteurs haut débit ou des connecteurs conçus avec des signaux de type PCIe à l'esprit - PCIe pleine taille, M.2, mPCIe, USB3, USB-C et de nombreuses familles de connecteurs haut débit de divers fabricants.
Passons maintenant au réglage de l'impédance des pistes PCB de votre diffpair. L'impédance différentielle des paires dépend en réalité de nombreuses variables, mais si vous êtes un hacker débutant, il existe des calculatrices simplifiées qui vous permettront d'y parvenir le plus souvent - celle-ci est ma préférée. Faites défiler jusqu'à "Edge-Coupled Surface Microstrip", laissez la hauteur de la piste à 35 pour le routage des diffpairs sur des couches de cuivre de 1 oz, laissez la constante diélectrique à 4,3 à moins que votre usine de PCB ne vous donne une valeur différente. Ensuite, réglez la hauteur d'isolation sur la distance de vos diffpairs - pour l'obtenir, accédez aux informations du fabricant de votre PCB et recherchez les informations d'empilement de PCB. Dites, vos diffpairs sont sur la couche supérieure et le sol est sur la couche juste en dessous d'eux. Pour cela, recherchez l'épaisseur de "préimprégné" entre la couche de cuivre supérieure et la couche en dessous - cette valeur sera votre hauteur d'isolation. Ensuite, jouez avec les largeurs et les espacements des pistes, en visant une impédance différentielle de 85 ohms. La spécification vous donne même une plage de 70 à 100 ohms !
Exercice pratique - regardons l'empilement à 4 couches d'OSHPark. Sa constante diélectrique (dk) est de 3,6, et notre largeur et espacement de trace minimum sont tous deux de 5 mil, soit 0,127 mm, ou 127 μm pour les besoins de la calculatrice ; l'épaisseur du préimprégné est de 202 µm. Frappez la constante diélectrique et les épaisseurs de préimprégné dans la calculatrice, puis jouez avec les valeurs.
Vous constaterez que l'augmentation de la largeur de la piste diminue l'impédance, tout comme la réduction de l'espacement des pistes - réglez celle-ci au minimum possible. Comme vous le verrez, si vous choisissez de vous en tenir à 85 ohms, vous pouvez opter pour des paires 0,3/0,127 (largeur/espacement) et obtenir 84,8 ohms – bien plus que suffisamment proches. si vous ne pouvez pas vous permettre des pistes aussi larges, utilisez 0,2/0,127 pour arriver à 106 Ω – un peu en dehors de la plage recommandée, mais si vous le devez, ça va aussi !
Dernière chose - gardez votre routage propre. Ne mettez pas les paires différentielles à travers des vias vers différentes couches si vous le pouvez - chaque paire de vias ajoute une inductance au signal, ce qui peut interférer avec les signaux à haute vitesse. Habituellement, les points de fin et de début de votre liaison PCIe se trouvent tous les deux sur la couche supérieure - conservez-le ainsi autant que vous le pouvez. Si vous devez changer de couche, ajoutez quelques vias connectés à la terre près des diffpairs. En outre, éloignez autant que possible les autres signaux à haute vitesse et à changement rapide ou bruyants des paires différentielles. Si vous avez des connexions haute puissance, à paires différentielles et asymétriques dans vos projets, disposez d'abord les paires différentielles.
Donc, cinq choses importantes - acheminez les diffpairs avec des signaux proches les uns des autres, gardez la terre sous eux, utilisez des connecteurs appropriés, ajustez la largeur et l'espacement des pistes différentielles pour l'impédance PCIe et gardez votre routage propre. Ce sont les bases - c'est ce que vous êtes censé faire si vous voulez que vos paires différentielles vous servent bien.
Maintenant, si vous avez déjà bricolé avec PCIe, vous êtes peut-être tombé sur des connaissances interdites : en pratique, vous n'avez pas vraiment à faire tout ce qui précède.
Vous avez peut-être entendu dire que PCIe fonctionne sur une chaîne humide - la première référence connue à cela se trouve dans une présentation de 2016 sur le piratage de la console au 33C3. C'est la façon hacker-bravado de parler de PCIe - vous pouvez vous tromper en respectant bon nombre des directives susmentionnées lors de la connexion de périphériques PCIe ensemble, et cela continuera. Et, sans surprise, il y a un gros grain de vérité - PCIe fonctionnera toujours dans des conditions sous-optimales, et il y en a un exemple après exemple dans le monde des hackers et des consommateurs ! L'exemple le plus répandu d'abus PCIe est peut-être le passage d'une liaison PCIe 1x à l'aide d'un câblage USB3, ce que font les risers PCIe "mineurs" - ce qui signifie que vous pouvez simplement vous rendre dans votre magasin d'accessoires informatiques et acheter un produit qui n'est possible que grâce à certains abus PCIe.
Quelque chose d'autre que vous avez peut-être vu et oublié comme un mauvais rêve, c'est que [TobleMiner] fait passer une liaison PCIe x8, tremble, prototype des fils - dans le but de tester une idée d'adaptateur pour les cartes réseau haut débit bon marché des serveurs HP , non compatible avec les emplacements PCIe classiques, tant au niveau du brochage que mécaniquement. Cette configuration de prototypage lui a permis de concevoir une version appropriée de l'adaptateur, que nous avons couverte plus tard ici sur Hackaday ! Vous pouvez mettre un lien PCIe via un FPC pour une connexion carte à carte rapide et sale, les extensions eGPU ont également utilisé des câbles HDMI pour cela, et vous pouvez probablement le faire fonctionner avec un fil magnétique. Voici une expérience de Linus Tech Tips où ils ont continué à empiler des extendeurs PCIe et ont atteint une chaîne de cinq mètres de long avant que la connexion ne commence à devenir instable.
PCIe est un peu plus tolérant que de nombreuses autres interfaces, par exemple USB3. Il existe des mécanismes de formation de liaison - lorsqu'une connexion PCIe est établie, le récepteur et l'émetteur jouent avec leurs paramètres internes, les ajustant jusqu'à ce qu'ils atteignent la vitesse la plus rapide possible tout en maintenant un faible taux d'erreur, en utilisant ensuite ces paramètres pour toute la connexion. Il existe également des retransmissions pour les paquets qui n'ont pas été reçus. PCIe a une stabilité exceptionnelle dans la pratique.
Il est clair que la formation de liaison PCIe a des parties uniques - par exemple, pour vous aider à améliorer votre mise en page, PCIe vous permet également d'inverser n'importe quelle paire différentielle, à l'exception de REFCLK, en échangeant les signaux négatifs et positifs, et cela sera détecté et parfaitement compensée lors de la formation de lien. D'autres technologies telles que USB3, HDMI ou DisplayPort ne prennent pas en charge de telles fonctionnalités de qualité de vie. D'autres interfaces exigent souvent que plusieurs voies aient la même longueur, ce qui garantit que les données d'un ensemble de paires n'arrivent pas plus rapidement que sur l'autre. PCIe, cependant, convient également aux inadéquations entre paires, en les détectant et en les compensant également lors de la formation de liaison. Ces deux éléments ne sont pas censés être des fonctionnalités de résilience, mais plutôt des fonctionnalités de facilité de mise en page destinées à vous aider à concevoir des PCB plus rapidement et mieux, mais cela aide certainement qu'ils soient là.
Cette résilience aide-t-elle les pirates ? Oui, absolument - ces deux fonctionnalités de facilité de mise en page sont utilisées dans pratiquement toutes les conceptions PCIe professionnelles, et si vous êtes dans des conditions moins stériles, vous pouvez pousser PCIe plus loin à vos risques et périls. D'un autre côté, ne vous contentez pas de contourner toutes les règles parce que vous avez vu quelqu'un le faire - faites un effort de bonne foi pour suivre ces cinq directives, même si vous êtes limité à un PCB à deux couches et que vous n'obtiendrez peut-être jamais le valeur d'impédance parfaite. Le respect de ces règles vous apprendra non seulement une discipline différente pour les projets ultérieurs, mais rendra vos signaux PCIe d'autant plus résistants et sans erreur, et vos périphériques PCIe plus heureux. Il peut être agréable de rejeter tout ou partie de ces directives, car parfois cela peut fonctionner, mais la demi-heure supplémentaire de calcul de l'impédance appropriée sur votre carte vous aidera à vous assurer que votre PCB n'a pas besoin d'une deuxième révision et reste fidèle à vos intérêts tout au long de sa vie.
Alors, voici une ligne directrice : traitez vos paires différentielles PCIe avec respect. Si vous utilisez un PCB à deux couches et que vous faites un prototype à bas prix et que vous voulez un délai d'exécution rapide, n'abandonnez pas simplement l'impédance car les traces devraient être beaucoup trop larges pour atteindre 85 ohms - ouvrez la calculatrice et voyez à quel point vous pouvez réduire l'impédance de toute façon. La réduction de la hauteur d'isolation réduit l'impédance, alors envisagez d'opter pour un PCB de 0,8 mm si les aspects mécaniques de votre projet vous le permettent. Déplacez vos composants si cela aide vos pistes PCIe à suivre un meilleur chemin, avec moins de bruit en cours de route. Peut-être que la formation de liens fera tomber un lien imparfait d'une génération ou deux, mais c'est mieux que de ne pas atteindre du tout un lien stable. Faites de votre mieux en suivant ces directives avec ce qui vous est donné, et les paires différentielles respecteront vos intentions en retour.
Par exemple, si vous utilisez KiCad, voici une démonstration simple sur la façon d'obtenir une liaison PCIe 1x d'un point à un autre, en acheminant des paires différentielles tout en prenant soin de l'impédance, des dégagements et de l'assemblage.
Maintenant, vous voyez ce qu'il faut pour acheminer des paires différentielles PCIe sur une carte, et ces directives s'appliqueront à toutes sortes d'autres interfaces basées sur des paires différentielles. La prochaine fois, je vous en dirai plus sur la signification des signaux PCIe, les largeurs de liaison et le débit - les bases, ainsi que toutes les agréables surprises que PCIe peut vous offrir. Et, si vous cherchez à approfondir ce qui fait fonctionner PCIe, consultez notre article précédent - c'est exactement ce que vous cherchez si vous cherchez à créer vos propres périphériques PCIe avec des FPGA !