Test Types & Methods

Conception pour la testabilité des cartes

La testabilité se décide au routage : points de test, accès aux rails, boundary scan et fonctions firmware qui rendent une carte peu coûteuse à tester.

JJulien Buteau
intermediate12 min de lecture14 mars 2026

La conception pour la testabilité regroupe les décisions prises au routage qui déterminent le coût de test d'une carte pour tout le reste de sa vie. La plupart ne coûtent rien à la conception et sont impossibles à rajouter ensuite.

Une décision qui se prend au routage

Une carte qui arrive en production sans accès de test laisse trois options, toutes mauvaises : construire un montage coûteux qui sonde des endroits malcommodes, renoncer à la couverture et expédier le risque, ou refaire le PCB. La courbe de coût est raide et à sens unique : les revues DFT se tiennent donc avant la libération du routage, pas après l'échec des premiers prototypes sur l'établi.

Points de test

PratiqueRecommandation
DiamètrePad de 0,9 à 1,0 mm, 0,6 mm au minimum pour les sondes à pas fin
Espacement2,54 mm de préférence, 1,27 mm au minimum entre points voisins
Dégagement au bordAu moins 3 mm du bord de carte pour l'outillage du montage
FaceTous du même côté si possible ; un montage double face double à peu près le coût
FinitionFinition brasable, sans vernis épargne
MarquageSérigraphier le nom du net ; le technicien d'établi vous en saura gré
Trous d'outillageDeux trous non métallisés, en diagonale, pour l'alignement du montage

Ce qu'il faut sortir en point de test :

  • Chaque rail d'alimentation, côté charge après tout filtrage
  • La masse, plusieurs fois, près des rails dont elle assure le retour
  • Les broches de reset, de mode de démarrage et de strap
  • Les lignes de bus I2C/SPI qu'un montage peut avoir à piloter ou observer
  • Le quartz ou la sortie d'horloge, si un contrôle de fréquence est prévu
  • Tout net que le plan de test prévoit de mesurer

La dernière ligne est la vraie règle. La DFT fonctionne quand le plan de test existe avant la libération du routage, même à l'état de brouillon.

Accès aux rails d'alimentation

Les rails sont les points de test les plus utiles, parce que presque tous les modes de défaillance s'y manifestent en premier. Sortez chaque rail séparément plutôt que de compter sur un point unique en aval de tous, afin qu'une mesure puisse localiser le défaut.

Prévoyez un moyen d'isoler les rails de leurs charges, par exemple une résistance zéro ohm ou un cavalier à braser, pour distinguer un régulateur en court-circuit d'une charge en court-circuit. Sinon, une carte qui échoue avec un rail effondré reste une impasse de diagnostic.

Accès de programmation et de debug

InterfaceCe qu'il faut exposer
SWD/JTAGHorloge, données, reset, masse et référence de tension cible
Console UARTTX, RX, masse, à un débit documenté
Mode de démarrageUn strap ou un point de test capable de forcer le bootloader
ResetUn point de test que le montage peut piloter, pas seulement un bouton

La programmation en fin de ligne est la norme : le montage doit donc flasher le firmware, régler le mode de démarrage et remettre la cible à zéro sans intervention humaine. Si le strap de démarrage n'est qu'un cavalier physique, quelqu'un déplace des cavaliers sur chaque carte.

Boundary scan

Pour les conceptions BGA denses où le sondage physique ne passe pas, le boundary scan IEEE 1149.1 teste les interconnexions à travers le composant lui-même.

ExigenceRemarque
TCK, TMS, TDI, TDO, TRSTÀ sortir sur des points de test ou un connecteur
Ordre de la chaîneLe documenter ; l'outillage en a besoin
Composants hors chaîneCouper la chaîne ; noter ce qui n'est pas couvert
Résistances de tirageConformes à la norme, pour que la chaîne soit déterministe à la mise sous tension

Voir le test JTAG par boundary scan.

Le firmware fait partie de la DFT

La fonction de testabilité la plus sous-exploitée est un firmware qui coopère avec le test.

FonctionIntérêt en test de production
Commande d'autotestSollicite des périphériques hors de portée du montage
Requête de versionConfirme que la bonne image est installée
Relecture brute de l'ADCVérifie le front-end analogique sans stimulus externe
Lecture/écriture GPIOPermet des tests en boucle sans matériel supplémentaire
Écriture d'étalonnageEnregistre les coefficients calculés par le test
Injection de défautVérifie délibérément les circuits de protection

Une commande selftest qui renvoie une sortie structurée transforme toute une catégorie de matériel de montage coûteux en une simple requête série. Elle coûte une journée de travail firmware et économise du coût de montage sur chaque station.

Concevez la sortie pour qu'elle soit exploitable par une machine dès le départ :

plugs/dut.py
import jsonclass Dut:    """Serial console on the board under test."""    def selftest(self) -> dict:        """Firmware returns JSON, so the test does not parse prose."""        raw = self._query("selftest --json")        return json.loads(raw)    def _query(self, cmd: str) -> str:        return '{"adc_counts": 2048, "gpio_ok": true, "temp_c": 41.2}'
phases/selftest.py
def selftest(measurements, dut):    result = dut.selftest()    measurements.adc_counts = result["adc_counts"]    measurements.gpio_ok = result["gpio_ok"]    measurements.die_temperature = result["temp_c"]
procedure.yaml
19 lines
main:  - name: Selftest    python: phases.selftest    measurements:      - name: ADC Counts        validators:          - operator: ">="            expected_value: 2000          - operator: "<="            expected_value: 2096      - name: GPIO Ok        validators:          - operator: "=="            expected_value: true      - name: Die Temperature        unit: "°C"        validators:          - operator: "<="            expected_value: 85

La sortie structurée compte plus qu'il n'y paraît. Un autotest firmware qui écrit de la prose oblige chaque script de test à l'analyser, et chaque reformulation du firmware casse la production.

Considérations sur le montage

PratiquePourquoi
Éloigner les composants hauts des zones de sondageLes sondes ont besoin de dégagement
Éviter les points de test sous les connecteurs ou les blindagesInaccessibles une fois la carte assemblée
Prévoir une référence de plan de masse près des sondes rapidesSinon, c'est le montage que l'on mesure
Ajouter un court-circuit d'étalonnage du montageLe test peut mesurer sa propre résistance de contact
Normaliser la position des trous d'outillage entre produitsUne même base de montage sert plusieurs cartes

Le court-circuit d'étalonnage mérite d'être souligné. Un court-circuit connu entre deux broches permet au test de mesurer directement la résistance de contact : l'usure du montage se détecte alors comme une dérive, et non comme de mystérieux défauts intermittents sur de bonnes cartes.

Panneaux et cartes multiples

Si les cartes sont testées en panneau, décidez tôt si le montage teste toutes les positions à la fois. Tester quatre cartes en parallèle demande quatre jeux de sondes et quatre chaînes d'instruments, ou une matrice de commutation. Les deux influent sur le routage, et les rajouter après coup coûte cher.

La revue DFT

Avant la libération du routage, confrontez le plan de test au routage :

  1. Chaque mesure du plan dispose d'un point de test accessible.
  2. Chaque rail peut être mesuré, et idéalement isolé.
  3. La programmation et le reset sont pilotables par le montage.
  4. Le mode de démarrage peut être forcé sans intervention humaine.
  5. Les points de test sont sur une seule face, correctement espacés, à l'écart du bord.
  6. Les trous d'outillage existent et sont documentés.
  7. Le firmware expose les fonctions dont dépend le plan.
  8. Les zones denses disposent du boundary scan, ou les manques de couverture sont documentés et acceptés.

Une heure de cette revue vaut couramment plus qu'une semaine d'ingénierie de montage plus tard.

Si vous utilisez déjà OpenHTF

selftest.py
21 lines
import openhtf as htffrom openhtf.util import unitsfrom tofupilot.openhtf import upload@htf.measures(    htf.Measurement("adc_counts").in_range(2000, 2096),    htf.Measurement("gpio_ok").equals(True),    htf.Measurement("die_temperature")    .in_range(maximum=85)    .with_units(units.DEGREE_CELSIUS),)def phase_selftest(test):    test.measurements.adc_counts = 2048    test.measurements.gpio_ok = True    test.measurements.die_temperature = 41.2test = htf.Test(phase_selftest, part_number="PCBA-100")test.add_output_callbacks(upload())test.execute(test_start=lambda: input("Scan serial: "))

Installez avec pip install "tofupilot[openhtf]", ou lancez-le avec tofupilot run.

Erreurs courantes

ErreurConséquenceCorrectif
Points de test ajoutés après le routageMontage malcommode, ou refonte du PCBRevue DFT avant la libération du routage
Points de test sur les deux facesCoût de montage à peu près doubléRegrouper sur une seule face
Pads de test couverts de vernis épargneLes sondes ne peuvent pas établir le contactSpécifier une finition brasable
Strap de démarrage en simple cavalier physiqueIntervention manuelle sur chaque carteLe rendre pilotable par le montage
Autotest firmware écrivant de la proseChaque reformulation casse la productionSortie structurée, JSON
Pas de court-circuit d'étalonnageL'usure du montage ressemble à une défaillance produitEn ajouter un et suivre la résistance de contact
Pas de trous d'outillageAlignement à la main, contact irrégulierDeux trous non métallisés, en diagonale

Plus de guides

Mettez ce guide en pratique