Simulation
Simulation logique
Une simulation pilotée par événements des parties numériques d'un schéma : modèles série 74, primitives, stimulation, assertions, setup et hold, sortie VCD.
Une simulation à événements des parties numériques d'un schéma, directement depuis sa liste de connexions ; aucun routage n'est nécessaire. agentee new sim NAME --kind logic (MCP new_item avec kind = "sim" et sim_kind = "logic") écrit un modèle de départ avec une horloge, une remise à zéro et une assertion horlogée à renommer pour vos nets ; --kind fdtd, la valeur par défaut, démarre une exécution FDTD à la place. agentee sim NAME (MCP run_sim) écrit NAME.result.json et une forme d'onde VCD NAME.vcd à côté de la spécification ; le visualiseur trace une courbe par net enregistré en fonction du temps.
Dans la vue des formes d'onde, la molette de la souris (ou le pincement, ou ctrl et la molette) zoome autour du pointeur, un glissement ou un défilement latéral déplace la vue, un double clic ajuste toute l'exécution, et un clic place le curseur temporel, aligné sur un bord de la ligne sous le pointeur dans un rayon de quelques pixels. + et - zooment autour du curseur, les touches fléchées déplacent la vue, F ou Home ajuste, Escape retire le curseur, et N et P font avancer le curseur vers le marqueur suivant ou précédent. Lorsque les lignes ne tiennent pas toutes, la molette au-dessus des noms, un glissement ou un clic sur la barre au bord droit, et Page Up et Page Down font défiler les lignes (top=N dans --show commence à la ligne N). La colonne à côté des noms lit toutes les lignes au niveau du curseur (au niveau du pointeur sans curseur, sinon au bord droit de la vue), et l'infobulle au survol indique le temps depuis le curseur. Les nets nommés X[0] à X[n], ou X0 à Xn (ainsi que X0_N à Xn_N), sont regroupés dans une ligne de bus affichée en hexadécimal, bit de poids fort en premier, avec un x pour tout bit inconnu et un z pour un bit flottant ; il en va de même pour une entrée record { name, nets }. Cliquez sur le nom d'un bus pour ouvrir ses bits. Le VCD conserve les mêmes bus comme vecteurs à la place de leurs bits : Q0 à Q3 comme $var wire 4 # Q [3:0] $end, Y0_N à Y7_N comme Y_N [7:0] et un bus record de n nets comme NAME [n-1:0], bit de poids fort en premier. Les marqueurs en haut indiquent chaque assertion échouée (rouge, au moment de la vérification), violation de temporisation (ambre) et conflit (violet), avec un point sur les lignes des nets concernés ; survolez-en un pour son message, cliquez pour y placer le curseur. Une exécution conserve ses 10000 premiers marqueurs, et l'en-tête indique « plafonné » lorsqu'elle a atteint ce nombre. agentee render NAME --show from=300ns,to=900ns,cursor=550ns,open=Q[3:0] trace la même vue sans interface.
name = "counter"
kind = "logic"
schematic = "counter" # default: the only top-level schematic
duration = "2us"
ignore = ["J1", "J2"] # parts with no logic model to leave out
record = ["CLK", "Q3", "Q2", "Q1", "Q0"] # default every net but the rails
# record = ["CLK", { name = "COUNT", nets = ["Q3", "Q2", "Q1", "Q0"] }] # a bus, MSB first
# on_violation = "keep" # default "x": a timing violation makes the flip-flop x
[[stimulus]]
net = "CLK"
clock = { period = "100ns", duty = 0.5, phase = "50ns" }
[[stimulus]]
net = "RST_N"
steps = [["0ns", 0], ["120ns", 1]] # [time, level] in time order; levels 0, 1, "x", "z"
[[stimulus]]
net = "MODE"
constant = 1
[[expect]] # a level at a time
net = "TC"
at = "1600ns"
value = 1
[[expect]] # a bus, MSB first: a number or a string of 0 1 x z and - (any)
nets = ["Y7_N", "Y6_N", "Y5_N", "Y4_N", "Y3_N", "Y2_N", "Y1_N", "Y0_N"]
at = "600ns"
value = "11011111"
[[expect]] # a sequence sampled on clock edges
nets = ["Q3", "Q2", "Q1", "Q0"]
clock = "CLK"
edge = "rising" # or "falling"
from = "0ns" # edges before this are skipped
sequence = [0, 0, 1, 2, 3, "01--"]Une horloge est basse jusqu'à phase, puis haute pendant duty de chaque period ; sans phase, elle démarre haute à 0. Une stimulation pilote son net comme un pilote fort ; sur un net d'alimentation, elle remplace le rail. Une vérification at lit le net une fois que tout s'est stabilisé à ce moment ; une séquence lit les nets juste avant chaque front net (de 0 à 1, ou de 1 à 0) de l'horloge, de sorte qu'une sortie enregistrée est vue telle qu'elle était au moment du front. Les nets sont nommés comme dans le schéma, et un net relié à un autre par un lien de 0 ohm répond aux deux noms.
La liste de nets devient des cellules comme suit :
- Les nets avec
style = "power"et les symboles d'alimentation (un symbole avecpower = true) sont des sources constantes : un nom contenantGND, ou commençant parVSS,VEEou0V, vaut 0, tout autre vaut 1 (PWR_FLAGest ignoré). - Une résistance (
R) de 0 ohm, un pont (JP,SJ, broches 1 et 2) et une liaison de nets (NT) fusionnent leurs nets en un seul. Toute autre résistance entre un rail et un net est une résistance de tirage vers le haut ou vers le bas, un pilote faible du niveau du rail ; entre deux nets de signal, elle les fusionne ; entre deux rails, elle est ignorée. - Les condensateurs, inductances, perles, filtres, diodes, LED, points de test, trous, fiduciaux et cristaux (
C,L,FB,FL,D,LED,TP,H,MH,FID,Y,X) sont ignorés. - Les composants dont la valeur (ou le nom du symbole) contient un numéro de série 74 utilisent le modèle intégré par numéro de broche :
74HC00,SN74LVC1G08DBVRetCD74HCT04Ecorrespondent tous. La bibliothèque couvre 00, 01, 02, 03, 04, 05, 06, 07, 08, 10, 11, 14, 20, 21, 27, 32, 74, 86, 125, 126, 132, 138, 157, 161, 163, 164, 244, 245, 573, 574 et 595, les portes simples 1G00, 1G02, 1G04, 1G06, 1G07, 1G08, 1G14, 1G17, 1G32, 1G34, 1G74, 1G79, 1G80, 1G86, 1G125, 1G126 et 1G157, et les portes doubles 2G00, 2G02, 2G04, 2G08, 2G14, 2G17, 2G32, 2G34, 2G74, 2G86, 2G125 et 2G126. Une unité d'un symbole multi-unités qui n'est pas placée est ignorée ; une broche placée sans net est lue comme flottante (z). - Les déclencheurs de Schmitt 14 (et 1G14, 2G14) sont des inverseurs ; la simulation n'a pas de front analogique lent sur lequel l'hystérésis pourrait agir. Le 573 est huit
dlatchet le 574 huitdff, chacun avec leOEpartagé (broche 1, actif bas) qui met les sorties en flottant. Le 245 est huitxcvr: avecOE(broche 19) bas, il pilote B depuis A tant queDIR(broche 1) est haut, et A depuis B tant qu'il est bas. Le 01, 03 (quad NAND), 05, 06, 1G06 (inverseurs) et 07, 1G07 (tampons) sont à collecteur ouvert : ils tirent vers le bas ou laissent passer (z), et une résistance de tirage vers le haut fait le 1. Tout 01 a le brochage 7402 (sorties sur 1, 4, 10, 13, entrées après chacune), selon TI SDLS026 (SN7401, SN74LS01) et Renesas REJ03D0532 (HD74HC01) ; le 03 a le brochage 7400, selon TI SCLS077 (SN74HC03). - Une porte dont les broches de sortie sont toutes
open_collectordans son symbole est aussi à collecteur ouvert. - Les composants dont la valeur ou le symbole est un nom de primitive (
AND,NAND3,OR,NOR,XOR,XNOR,NOT,INV,BUF,TRIBUF,DFF,JKFF,SRLATCH,DLATCH,MUX2) associent leurs broches par nom :D,CLK(aussiC,CP,CK),S/SET/PRE,R/RST/CLR,EN,OE,Q,~{Q}; la sortie d'une porte est sa brocheoutput(ouY,Q,OUT) et toute autre broche de signal est une entrée. Un trait supérieur (~{R}), un#final ou_N, ou une forme de broche inversée rend la broche active bas. - Tout autre composant est une erreur qui le nomme, sauf s'il est dans
ignoreou s'il a un modèle[[parts]].
Chronologie par famille, à partir des lettres de famille après 74 (délai de propagation, temps de setup, temps de hold, et temps de récupération et de retrait d'une mise à l'état ou d'une remise à zéro asynchrones) :
| Famille | Délai | Setup | Hold | Récupération | Retrait |
|---|---|---|---|---|---|
| HC, HCT | 10 ns | 15 ns | 3 ns | 8 ns | 0 |
| AHC, AHCT, VHC, VHCT | 6 ns | 5 ns | 1 ns | 3,5 ns | 0 |
| AC, ACT | 6 ns | 4 ns | 1 ns | 2,4 ns | 0 |
| LVC | 4 ns | 3 ns | 1 ns | 2 ns | 0 |
| ALVC, LVT, ALVT, AUC, AVC | 4 ns | 2 ns | 1 ns | 2 ns | 0 |
| AUP, LV, LVX | 6 ns | 3 ns | 1 ns | 3 ns | 1 ns |
| LS et 74 simple | 15 ns | 20 ns | 5 ns | 25 ns | 3 ns |
| autres | 10 ns | 10 ns | 2 ns | 10 ns | 2 ns |
La récupération et le retrait sont les minimums de la fiche technique entre -40 et 85 C à 4,5 V (familles 5 V) ou 3,3 V (LVC), le plus grand entre TI et Nexperia si les deux en listent un :
- HC, HCT : 8 ns trec de
nSD,nRDànCP, Nexperia 74HC_HCT74 rev 9 (TI SN74HC74 SCLS094F donne 6 ns, TI CD74HC74 SCHS124E 8 ns, nommé trem là-bas). - AHC, AHCT : 3,5 ns trec de
nRDànCPpour le 74AHCT74 (3,0 ns pour le 74AHC74), Nexperia 74AHC_AHCT74 rev 11 (TI SN74AHC74 SCLS255N donne 3 ns). - AC, ACT : 2,4 ns trec à 5 V, TI CD74AC74 SCHS231E et CD74ACT74 SCHS321A (TI SN74AC74 SCAS521H donne 0).
- LVC : 2 ns setup de
PREouCLRinactif avantCLK, TI SN74LVC74A SCAS287W (Nexperia 74LVC74A donne 1,0 ns). - LS : 25 ns setup de
CLRinactif et 3 ns hold sur toute entrée, TI SN74LS161A SDLS060 (le SN74LS74A dans SDLS119 ne liste ni l'un ni l'autre).
Aucune des fiches CMOS ci-dessus (ni TI SN74HC161 SCLS297D ou Nexperia 74LVC161, dont le hold ne couvre que les entrées synchrones) ne liste un temps de retrait, il est donc 0 là-bas. Les lignes AUP, LV, LVX et autres prennent leur setup et leur hold.
Les primitives par nom et les symboles génériques prennent 1 ns et aucun setup ou hold.
Un composant personnalisé reçoit un modèle en ligne, associé par ref ou par value (tous les composants avec cette valeur). Plusieurs entrées pour un composant ajoutent une cellule chacune (une par porte d'un quad, par exemple). Une entrée avec uniquement de la chronologie garde le modèle intégré et modifie sa chronologie.
[[parts]]
ref = "U7"
primitive = "nand" # a primitive; pins map its pin keys to the part's pins
pins = { A = "1", B = "2", Y = "3" }
delay = "3ns" # every output; setup, hold, recovery and removal as well
delays = { Y = "5ns" } # or per output key
[[parts]]
value = "MYBUF8"
primitive = "74HC244" # borrow a library pinout
[[parts]]
ref = "U9"
inputs = ["1", "2", "3"] # pins by number or unique name
outputs = ["4"]
truth = ["000 1", "1-- 0", "01- z"] # first matching row wins; no match (or an x input) gives xClés de broches des primitives (entrées, puis sorties) ; ajoutez _N à une clé pour une broche active bas ou une sortie inversée, et omettez une entrée optionnelle pour la laisser inactive :
| Primitive | Entrées | Sorties |
|---|---|---|
and, or, xor, nand, nor, xnor | toutes les clés sauf Y | Y |
not, buf | une clé | Y |
toute porte avec _od (nand_od, not_od, buf_od) | comme la porte | Y, collecteur ouvert : 0 ou z |
tri | A, OE | Y (z quand OE est bas) |
dff | D, CLK, optionnel S, R, OE | Q, QN (z quand OE est bas) |
jk | J, K, CLK, optionnel S, R | Q, QN |
sr | S, R | Q, QN |
dlatch | D, EN, optionnel R, OE | Q, QN (z quand OE est bas) |
xcvr | A, B, DIR, optionnel OE | A, B : les mêmes broches, pilotées de l'autre côté par DIR |
mux2 | I0, I1, S, EN facultatif | Y |
dec138 | A0, A1, A2, E1, E2, E3 | Y0 à Y7 |
counter161, counter163 | R facultatif, CLK, D0 à D3 facultatifs, CEP, LOAD, CET | Q0 à Q3, TC |
shift164 | A, B facultatif, CLK, R facultatif | Q0 à Q7 |
shift595 | D, CLK, LATCH, R facultatif, OE | Q0 à Q7, QS |
Les bascules se déclenchent sur le front montant (clé CLK_N pour le front descendant) ; S et R sont asynchrones et si les deux sont actifs, Q = QN = 1, comme sur une 74HC74. La 161 réinitialise immédiatement, la 163 au front suivant. Une 595 décale sur CLK, copie vers ses sorties sur LATCH (la valeur d'avant le décalage au même instant) et les laisse en haute impédance tant que OE est bas.
Le moteur gère quatre niveaux : 0, 1, x (inconnu) et z (flottant). Chaque net résout ses pilotes : les pilotes forts (sorties, rails, stimuli) qui s'accordent fixent le niveau, un 0 contre un 1 donne x et une contention signalée, et les résistances de tirage ne comptent que si aucun pilote fort n'est actif. Une entrée z se lit comme x. Les portes ne passent à x que si l'entrée inconnue est déterminante (un 0 dans une ET donne 0), et une bascule horlogée par un front incertain (0 vers x, ou x vers 1) passe à x, sauf si elle conserve sa valeur. Chaque sortie a son propre délai (transport, donc les impulsions plus courtes que le délai passent) ; les événements s'exécutent dans l'ordre du temps, et les changements à délai nul se stabilisent en cycles delta au même instant. Une boucle à délai nul qui change encore après 1000 cycles delta arrête l'exécution et signale les nets, de même qu'une exécution dépassant 50 millions d'événements.
Les bascules, compteurs et registres à décalage vérifient les temps de setup et de hold sur leurs entrées horlogées par rapport aux caractéristiques temporelles du modèle : une entrée de données qui a changé moins de setup avant un front montant de l'horloge, ou moins de hold après, est une violation (non vérifiée tant qu'une réinitialisation ou une mise à 1 asynchrone est active). Un verrou D vérifie son D par rapport au front descendant (fermeture) de EN de la même manière. Une réinitialisation ou une mise à 1 asynchrone relâchée moins de recovery avant un front d'horloge, ou moins de removal après, est aussi une violation, avec les valeurs de recovery et removal de la table de la famille. Une 595 exige aussi que son front montant de LATCH (RCLK) arrive au moins setup après le dernier front montant de CLK (SRCLK) ; les deux horloges reliées ensemble (au même instant) sont correctes et verrouillent la valeur d'avant le décalage.
En cas de violation, la bascule, le verrou ou le registre couvert par la vérification passe à x, comme le font les modèles Verilog avec leurs notifiers, jusqu'à ce qu'il soit horlogé, mis à 1 ou réinitialisé proprement à nouveau. Définissez on_violation = "keep" sur la simulation pour signaler la violation et conserver la valeur échantillonnée à la place.
Mesures : assertions passées et échouées, contentions, violations temporelles, cellules et événements. La vérification liste chaque assertion échouée, contention, violation temporelle ou exécution arrêtée comme une erreur sur la simulation, tant que le résultat est à jour. Le résultat devient obsolète lorsque la spécification ou la liste de nets du schéma change. examples/logic en contient deux : counter, une 74HC161 comptant vers une 74HC138, et i2c, un bus à collecteur ouvert où un contrôleur (deux 74LVC1G07) et une cible (une 74LVC1G06 tirant SDA bas pour son ACK) partagent des résistances de tirage de 4,7 k, et une 74HC595 horlogée par SCL capture l'octet, vérifié pour START, les bits, l'ACK, l'octet (un bus record) et STOP.