Simulazione
Simulazione logica
Una simulazione a eventi delle parti digitali di uno schema: modelli della serie 74, primitive, stimoli, asserzioni, setup e hold, output VCD.
Una simulazione a eventi delle parti digitali di uno schema, direttamente dal suo netlist; non serve un layout. agentee new sim NAME --kind logic (MCP new_item con kind = "sim" e sim_kind = "logic") scrive un esempio con un clock, un reset e un'asserzione con clock da rinominare ai tuoi net; --kind fdtd, il predefinito, avvia invece una simulazione FDTD. agentee sim NAME (MCP run_sim) scrive NAME.result.json e un'onda VCD NAME.vcd accanto alla specifica; il visualizzatore disegna una traccia per ogni net registrato rispetto al tempo.
Nella vista delle onde, la rotella del mouse (o il pizzico, o ctrl e la rotella) fa lo zoom attorno al puntatore, un trascinamento o uno scorrimento laterale sposta la vista, un doppio clic adatta l'intera esecuzione e un clic imposta il cursore del tempo, agganciato a un bordo della riga sotto di esso entro pochi pixel. + e - fanno lo zoom attorno al cursore, le frecce spostano la vista, F o Home adatta, Escape rimuove il cursore e N e P spostano il cursore al marcatore successivo e precedente. Con più righe di quante ne cabbano, la rotella sopra i nomi, un trascinamento o un clic sulla barra al bordo destro e Page Up e Page Down scorrono le righe (top=N in --show parte dalla riga N). La colonna accanto ai nomi legge ogni riga al cursore (al puntatore senza cursore, altrimenti al bordo destro della vista) e il suggerimento al passaggio del mouse indica il tempo dal cursore. I net denominati X[0] a X[n], o X0 a Xn (anche X0_N a Xn_N), si raggruppano in una riga di bus disegnata in esadecimale, MSB per primo, con un nibble di x per ogni bit sconosciuto e z per uno flottante; lo stesso vale per un'entry record { name, nets }. Clicca su un nome di bus per aprire i suoi bit. Il VCD contiene gli stessi bus come vettori al posto dei bit: Q0 a Q3 come $var wire 4 # Q [3:0] $end, Y0_N a Y7_N come Y_N [7:0] e un bus record di n net come NAME [n-1:0], MSB per primo. I marcatori in alto mostrano ogni asserzione fallita (rosso, al tempo in cui è stata verificata), violazione di timing (ambra) e conflitto (viola), con un punto sulle righe dei net coinvolti; passa il mouse sopra per il messaggio, clicca per posizionare il cursore lì. Un'esecuzione mantiene i primi 10000 marcatori, e l'intestazione indica che è al limite quando li ha raggiunti. agentee render NAME --show from=300ns,to=900ns,cursor=550ns,open=Q[3:0] disegna la stessa vista in modalità headless.
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--"]Un clock è basso fino a phase, poi alto per duty di ogni period; senza phase inizia alto a 0. Un stimulus guida il suo net come un driver forte; su un net di alimentazione sostituisce il rail. Una verifica at legge il net quando tutto a quel tempo si è stabilizzato; una sequenza legge i net poco prima di ogni transizione pulita (da 0 a 1, o da 1 a 0) del clock, così un output registrato viene letto come era quando la transizione è avvenuta. I net hanno i nomi dello schema, e un net collegato a un altro tramite un collegamento da 0 ohm risponde a entrambi i nomi.
La netlist diventa celle nel seguente modo:
- I net con
style = "power"e i simboli di alimentazione (un simbolo conpower = true) sono sorgenti costanti: un nome conGND, o che inizia conVSS,VEEo0V, è 0, qualsiasi altro è 1 (PWR_FLAGviene ignorato). - Un resistore (
R) da 0 ohm, un jumper (JP,SJ, pin 1 e 2) e un net tie (NT) uniscono i loro net in uno solo. Qualsiasi altro resistore tra un rail e un net è un pull-up o pull-down, un driver debole del livello del rail; tra due net di segnale li unisce; tra due rail viene escluso. - Condensatori, induttori, perle, filtri, diodi, LED, punti di test, fori, fiduciali e cristalli (
C,L,FB,FL,D,LED,TP,H,MH,FID,Y,X) vengono esclusi. - I componenti il cui valore (o altrimenti nome del simbolo) contiene un numero della serie 74 usano il modello integrato per numero di pin:
74HC00,SN74LVC1G08DBVReCD74HCT04Ecorrispondono tutti. La libreria copre 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 e 595, le porte singole 1G00, 1G02, 1G04, 1G06, 1G07, 1G08, 1G14, 1G17, 1G32, 1G34, 1G74, 1G79, 1G80, 1G86, 1G125, 1G126 e 1G157, e le porte doppie 2G00, 2G02, 2G04, 2G08, 2G14, 2G17, 2G32, 2G34, 2G74, 2G86, 2G125 e 2G126. Un'unità di un simbolo multi-unità non posizionata viene esclusa; un pin posizionato senza net viene letto come flottante (z). - I trigger di Schmitt 14 (e 1G14, 2G14) sono invertitori; la simulazione non ha un bordo analogico lento su cui l'isteresi possa agire. Il 573 è otto
dlatche il 574 ottodff, ciascuno con ilOEcondiviso (pin 1, attivo a basso) che rende gli output flottanti. Il 245 è ottoxcvr: conOE(pin 19) basso guida B da A mentreDIR(pin 1) è alto e A da B mentre è basso. I 01, 03 (quad NAND), 05, 06, 1G06 (invertitori) e 07, 1G07 (buffer) sono open drain: tirano a basso o lasciano andare (z), e un resistore pull-up fa il 1. Ogni 01 ha il pinout del 7402 (output su 1, 4, 10, 13, input dopo ciascuno), secondo TI SDLS026 (SN7401, SN74LS01) e Renesas REJ03D0532 (HD74HC01); il 03 ha quello del 7400, secondo TI SCLS077 (SN74HC03). - Una porta i cui pin di output sono tutti
open_collectornel suo simbolo è anche open drain. - I componenti il cui valore o simbolo è un nome di primitiva (
AND,NAND3,OR,NOR,XOR,XNOR,NOT,INV,BUF,TRIBUF,DFF,JKFF,SRLATCH,DLATCH,MUX2) mappano i pin per nome:D,CLK(ancheC,CP,CK),S/SET/PRE,R/RST/CLR,EN,OE,Q,~{Q}; l'output di una porta è il suo pinoutput(oY,Q,OUT) e ogni altro pin di segnale è un input. Un overbar (~{R}), un#finale o_N, o una forma di pin invertita rendono il pin attivo a basso. - Qualsiasi altro componente è un errore che lo nomina, a meno che non sia in
ignoreo non abbia un modello[[parts]].
Tempi della famiglia, dalle lettere della famiglia dopo 74 (ritardo di propagazione, setup, hold, e recovery e removal di un set o reset asincrono):
| Famiglia | Ritardo | Setup | Hold | Recovery | Removal |
|---|---|---|---|---|---|
| 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 e 74 semplice | 15 ns | 20 ns | 5 ns | 25 ns | 3 ns |
| altri | 10 ns | 10 ns | 2 ns | 10 ns | 2 ns |
Recovery e removal sono i minimi del datasheet da -40 a 85 C a 4.5 V (famiglie a 5 V) o 3.3 V (LVC), il maggiore tra TI e Nexperia dove entrambi ne indicano uno:
- HC, HCT: 8 ns trec di
nSD,nRDanCP, Nexperia 74HC_HCT74 rev 9 (TI SN74HC74 SCLS094F indica 6 ns, TI CD74HC74 SCHS124E 8 ns, lì chiamato trem). - AHC, AHCT: 3.5 ns trec di
nRDanCPper il 74AHCT74 (3.0 ns per il 74AHC74), Nexperia 74AHC_AHCT74 rev 11 (TI SN74AHC74 SCLS255N indica 3 ns). - AC, ACT: 2.4 ns trec a 5 V, TI CD74AC74 SCHS231E e CD74ACT74 SCHS321A (TI SN74AC74 SCAS521H indica 0).
- LVC: 2 ns setup di
PREoCLRinattivo prima diCLK, TI SN74LVC74A SCAS287W (Nexperia 74LVC74A indica 1.0 ns). - LS: 25 ns setup di
CLRinattivo e 3 ns hold a qualsiasi input, TI SN74LS161A SDLS060 (il SN74LS74A in SDLS119 non indica nessuno dei due).
Nessuno dei fogli CMOS sopra (né TI SN74HC161 SCLS297D o Nexperia 74LVC161, il cui hold copre solo gli input sincroni) indica un tempo di removal, quindi è 0 lì. Le righe AUP, LV, LVX e altre prendono il loro setup e hold.
Le primitive per nome e i simboli generici prendono 1 ns e nessun setup o hold.
Un componente personalizzato ottiene un modello inline, abbinato per ref o per value (ogni componente con quel valore). Più voci per un componente aggiungono una cella ciascuna (una per porta di un quad, ad esempio). Una voce con solo tempi mantiene il modello integrato e ne cambia i tempi.
[[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 xChiavi dei pin delle primitive (input, poi output); aggiungi _N a una chiave per un pin attivo a basso o un output invertito, e ometti un input opzionale per tenerlo inattivo:
| Primitiva | Input | Output |
|---|---|---|
and, or, xor, nand, nor, xnor | chiavi qualsiasi tranne Y | Y |
not, buf | una chiave | Y |
qualsiasi porta con _od (nand_od, not_od, buf_od) | come la porta | Y, open drain: 0 o z |
tri | A, OE | Y (z quando OE è basso) |
dff | D, CLK, opzionali S, R, OE | Q, QN (z quando OE è basso) |
jk | J, K, CLK, opzionali S, R | Q, QN |
sr | S, R | Q, QN |
dlatch | D, EN, opzionali R, OE | Q, QN (z quando OE è basso) |
xcvr | A, B, DIR, opzionale OE | A, B: gli stessi pin, pilotati dall'altro lato da DIR |
mux2 | I0, I1, S, EN opzionale | Y |
dec138 | A0, A1, A2, E1, E2, E3 | Y0 a Y7 |
counter161, counter163 | R opzionale, CLK, D0 a D3 opzionali, CEP, LOAD, CET | Q0 a Q3, TC |
shift164 | A, B opzionale, CLK, R opzionale | Q0 a Q7 |
shift595 | D, CLK, LATCH, R opzionale, OE | Q0 a Q7, QS |
I flip-flop si clockano sul fronte saliente (chiave CLK_N per quello discendente); S e R sono asincroni e se entrambi sono attivi danno Q = QN = 1, come su un 74HC74. Il 161 si resetta immediatamente, il 163 al fronte successivo. Un 595 sposta su CLK, copia sui suoi output su LATCH (il valore di prima dello spostamento nello stesso istante) e li lascia in stato di alta impedenza mentre OE è basso.
Il motore mantiene quattro livelli: 0, 1, x (sconosciuto) e z (fluttuante). Ogni net risolve i suoi driver: i driver forti (output, rail, stimoli) che concordano impostano il livello, 0 contro 1 dà x e una contention segnalata, e i resistori di pull contano solo quando non c'è un driver forte attivo. Un input z viene letto come x. Le porte passano a x solo quando l'input sconosciuto conta (0 in un AND è 0), e un flip-flop clockato da un fronte incerto (da 0 a x, o da x a 1) passa a x a meno che non mantenga il suo valore. Ogni output ha il suo ritardo (di trasporto, quindi gli impulsi più corti del ritardo passano); gli eventi si eseguono in ordine temporale, e i cambiamenti a ritardo zero si stabilizzano in cicli delta nello stesso istante. Un loop a ritardo zero che continua a cambiare dopo 1000 cicli delta ferma l'esecuzione e segnala i net, e lo fa anche un'esecuzione oltre 50 milioni di eventi.
Flip-flop, contatori e registri a scorrimento verificano setup e hold sui loro input clockati rispetto al timing del modello: un input dati che è cambiato meno di setup prima di un fronte saliente di clock, o meno di hold dopo, è una violazione (non verificato mentre un reset o set asincrono è attivo). Un latch D verifica il suo D rispetto al fronte di chiusura (discendente) di EN nello stesso modo. Un reset o set asincrono rilasciato meno di recovery prima di un fronte di clock, o meno di removal dopo, è anch'esso una violazione, con i valori di recovery e removal della tabella della famiglia. Un 595 richiede anche che il suo fronte saliente di LATCH (RCLK) sia almeno setup dopo l'ultimo fronte saliente di CLK (SRCLK); i due clock collegati insieme (nello stesso istante) va bene e latcha il valore di prima dello spostamento.
In caso di violazione, il flip-flop, latch o registro coperto dalla verifica passa a x, come fanno i modelli Verilog con i loro notifiers, finché non viene clockato, settato o resettato di nuovo in modo pulito. Imposta on_violation = "keep" sulla simulazione per segnalare la violazione e mantenere il valore campionato.
Letture: asserzioni superate e fallite, contese, violazioni di timing, celle ed eventi. La verifica elenca ogni asserzione fallita, contesa, violazione di timing o esecuzione interrotta come errore sulla simulazione, finché il risultato è attuale. Il risultato diventa obsoleto quando la specifica o il netlist dello schema cambiano. examples/logic ne contiene due: counter, un 74HC161 che conta in un 74HC138, e i2c, un bus open-drain dove un controller (due 74LVC1G07) e un target (un 74LVC1G06 che porta SDA a basso per il suo ACK) condividono pull-up da 4,7k, e un 74HC595 clockato da SCL cattura il byte, verificato per START, i bit, l'ACK, il byte (un bus record) e STOP.