agentee

Simulazione

Simulazione logica

Simula le parti digitali di uno schema direttamente dal suo netlist: modelli serie 74, stimoli, asserzioni, controlli di setup e hold, e un output VCD.

Una simulazione logica esegue le parti digitali di uno schema direttamente dal suo netlist. Non serve un layout, quindi si adatta all'inizio di un progetto: verifica che un contatore conti, un decoder decodi e un bus open-drain accerti, prima che qualsiasi cosa venga posizionata.

Avviane uno

agentee new sim counter --kind logic

Il punto di partenza ha un clock, un reset e un'asserzione clockata da rinominare con i tuoi net. L'esempio di logica contiene due completati. Questo è counter, un 74HC161 che conta un clock da 10 MHz in un 74HC138:

name = "counter"
kind = "logic"
schematic = "counter"
duration = "2us"
ignore = ["J1", "J2"]
record = ["CLK", "RST_N", "Q3", "Q2", "Q1", "Q0", "TC"]

[[stimulus]]
net = "CLK"
clock = { period = "100ns", duty = 0.5, phase = "50ns" }

[[stimulus]]
net = "RST_N"
steps = [["0ns", 0], ["120ns", 1]]

[[expect]]
nets = ["Q3", "Q2", "Q1", "Q0"]
clock = "CLK"
edge = "rising"
sequence = [0, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 0, 1, 2]

[[expect]]
nets = ["Y7_N", "Y6_N", "Y5_N", "Y4_N", "Y3_N", "Y2_N", "Y1_N", "Y0_N"]
at = "600ns"
value = "11011111"

[[expect]]
net = "TC"
at = "1600ns"
value = 1
agentee sim counter
agentee show sim:counter
agentee render sim:counter -o counter.png
assertions passed   6 of 6
assertions failed   0
contention          0   strong drivers disagreeing
timing violations   0   setup, hold, recovery, removal
cells               5   18 nets
events              130 to 2us

L'esecuzione scrive un risultato e un'onda VCD accanto alla specifica, che qualsiasi visualizzatore di onde apre.

Onde della simulazione del contatore

Stimolo

  • Un clock è basso fino a phase, poi alto per duty di ogni period.
  • steps sono coppie [time, level] in ordine temporale, con livelli 0, 1, "x" e "z".
  • constant tiene un net a un livello fisso.

Uno stimolo guida il suo net come un driver forte; su un net di alimentazione sostituisce il rail.

Asserzioni

  • at legge un net o un bus una volta che tutto a quel tempo si è assestato.
  • Una sequence legge i net poco prima di ogni bordo pulito di un clock, così un output registrato viene visto come era quando il bordo è arrivato. from salta i bordi precedenti.
  • Un valore di bus è un numero o una stringa di 0, 1, x, z e - per qualsiasi, MSB per primo.

La verifica elenca ogni asserzione fallita, contesa o violazione di timing come errore sulla simulazione, finché il risultato è attuale.

Cosa diventa una cella

  • I net di alimentazione e i simboli di alimentazione sono sorgenti costanti: i nomi GND, VSS, VEE e 0V sono 0, qualsiasi altro è 1.
  • Resistori da 0 ohm, jumper e net tie uniscono i loro net. Un resistore da un rail a un net è un pull-up o pull-down, un driver debole.
  • Condensatori, induttori, diodi, LED, punti di test, cristalli e simili sono esclusi.
  • I componenti il cui valore o nome del simbolo contiene un numero della serie 74 ottengono un modello integrato per numero di pin: 74HC00, SN74LVC1G08DBVR e CD74HCT04E corrispondono tutti. La libreria copre le porte comuni, i flip-flop, i latch, i buffer, il decoder 138, i contatori 161 e 163, i registri a scorrimento 164 e 595 e i componenti LVC a porta singola e doppia. I componenti a drain aperto tirano verso il basso o lasciano il segnale libero.
  • Un componente il cui valore o simbolo è un nome primitivo (NAND, DFF, MUX2, ...) mappa i suoi pin per nome.
  • Qualsiasi altro componente è un errore che lo nomina, a meno che non sia in ignore o non abbia un modello [[parts]].

Le lettere della famiglia impostano i tempi: HC ha un ritardo di 10 ns e un setup di 15 ns, LVC 4 ns e 3 ns, LS 15 ns e 20 ns, con recovery e removal presi dai datasheet di TI e Nexperia. Il riferimento logico contiene la tabella completa e le sue fonti.

Modelli tuoi

[[parts]]
ref = "U7"
primitive = "nand"
pins = { A = "1", B = "2", Y = "3" }
delay = "3ns"

[[parts]]
ref = "U9"
inputs = ["1", "2", "3"]
outputs = ["4"]
truth = ["000 1", "1-- 0", "01- z"]

Un componente ottiene una primitiva con i pin mappati, un pinout di libreria preso in prestito con primitive = "74HC244", o una tabella di verità in cui la prima riga corrispondente vince.

Violazioni temporali

Flip-flop, contatori e registri a scorrimento verificano setup e hold sui loro ingressi con clock, e recovery e removal sui loro reset asincroni. In caso di violazione la cella passa a x, come fanno i modelli Verilog, finché non viene clockata o resettata di nuovo in modo pulito. on_violation = "keep" segnala la violazione e mantiene il valore campionato invece.

Il motore mantiene quattro livelli: 0, 1, x e z. I driver forti in disaccordo producono x e una contesa; i pull contano solo quando nessun driver forte è attivo. Una porta passa a x solo quando l'ingresso sconosciuto conta, quindi 0 in un AND è ancora 0.

In un'interfaccia

Una simulazione logica può essere una misura di un'interfaccia, che poi fa fallire la verifica mentre la simulazione ha un errore:

[[interfaces.measure]]
sim = "i2c-bus"

Migliora questa guida · Markdown per agenti