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
| Pratique | Recommandation |
|---|---|
| Diamètre | Pad de 0,9 à 1,0 mm, 0,6 mm au minimum pour les sondes à pas fin |
| Espacement | 2,54 mm de préférence, 1,27 mm au minimum entre points voisins |
| Dégagement au bord | Au moins 3 mm du bord de carte pour l'outillage du montage |
| Face | Tous du même côté si possible ; un montage double face double à peu près le coût |
| Finition | Finition brasable, sans vernis épargne |
| Marquage | Sérigraphier le nom du net ; le technicien d'établi vous en saura gré |
| Trous d'outillage | Deux 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
| Interface | Ce qu'il faut exposer |
|---|---|
| SWD/JTAG | Horloge, données, reset, masse et référence de tension cible |
| Console UART | TX, RX, masse, à un débit documenté |
| Mode de démarrage | Un strap ou un point de test capable de forcer le bootloader |
| Reset | Un 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.
| Exigence | Remarque |
|---|---|
| TCK, TMS, TDI, TDO, TRST | À sortir sur des points de test ou un connecteur |
| Ordre de la chaîne | Le documenter ; l'outillage en a besoin |
| Composants hors chaîne | Couper la chaîne ; noter ce qui n'est pas couvert |
| Résistances de tirage | Conformes à 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.
| Fonction | Intérêt en test de production |
|---|---|
| Commande d'autotest | Sollicite des périphériques hors de portée du montage |
| Requête de version | Confirme que la bonne image est installée |
| Relecture brute de l'ADC | Vérifie le front-end analogique sans stimulus externe |
| Lecture/écriture GPIO | Permet des tests en boucle sans matériel supplémentaire |
| Écriture d'étalonnage | Enregistre les coefficients calculés par le test |
| Injection de défaut | Vé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 :
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}'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.yaml19 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: 85La 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
| Pratique | Pourquoi |
|---|---|
| Éloigner les composants hauts des zones de sondage | Les sondes ont besoin de dégagement |
| Éviter les points de test sous les connecteurs ou les blindages | Inaccessibles une fois la carte assemblée |
| Prévoir une référence de plan de masse près des sondes rapides | Sinon, c'est le montage que l'on mesure |
| Ajouter un court-circuit d'étalonnage du montage | Le test peut mesurer sa propre résistance de contact |
| Normaliser la position des trous d'outillage entre produits | Une 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 :
- Chaque mesure du plan dispose d'un point de test accessible.
- Chaque rail peut être mesuré, et idéalement isolé.
- La programmation et le reset sont pilotables par le montage.
- Le mode de démarrage peut être forcé sans intervention humaine.
- Les points de test sont sur une seule face, correctement espacés, à l'écart du bord.
- Les trous d'outillage existent et sont documentés.
- Le firmware expose les fonctions dont dépend le plan.
- 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.py21 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
| Erreur | Conséquence | Correctif |
|---|---|---|
| Points de test ajoutés après le routage | Montage malcommode, ou refonte du PCB | Revue DFT avant la libération du routage |
| Points de test sur les deux faces | Coût de montage à peu près doublé | Regrouper sur une seule face |
| Pads de test couverts de vernis épargne | Les sondes ne peuvent pas établir le contact | Spécifier une finition brasable |
| Strap de démarrage en simple cavalier physique | Intervention manuelle sur chaque carte | Le rendre pilotable par le montage |
| Autotest firmware écrivant de la prose | Chaque reformulation casse la production | Sortie structurée, JSON |
| Pas de court-circuit d'étalonnage | L'usure du montage ressemble à une défaillance produit | En ajouter un et suivre la résistance de contact |
| Pas de trous d'outillage | Alignement à la main, contact irrégulier | Deux trous non métallisés, en diagonale |
