agentee

Simulatie

Logica-simulatie

Een gebeurtenisgestuurde simulatie van de digitale onderdelen van een schema: 74 serie modellen, primitieven, stimulus, assertions, setup en hold, VCD uitgang.

Een gebeurtenisgestuurde simulatie van de digitale onderdelen van een schema, rechtstreeks uit de netlist; een layout is niet nodig. agentee new sim NAME --kind logic (MCP new_item met kind = "sim" en sim_kind = "logic") schrijft een startbestand met een klok, een reset en een geklokte assertie die je naar je nets kunt hernoemen; --kind fdtd, de standaard, start in plaats daarvan een FDTD-simulatie. agentee sim NAME (MCP run_sim) schrijft NAME.result.json en een VCD-golfform NAME.vcd naast de specificatie; de viewer tekent een trace per geregistreerd net tegen de tijd.

In het golfformvenster zoomt het muiswiel (of knijpen, of ctrl en het wiel) rond de aanwijzer, een sleepbeweging of een zijwaartse scroll verschuift het beeld, een dubbelklik past de hele run aan, en een klik zet de tijdcursor, vastgezet op een rand van de rij eronder binnen enkele pixels. + en - zoomen rond de cursor, de pijltjestoetsen verschuiven, F of Home past aan, Escape verwijdert de cursor, en N en P springen de cursor naar de volgende en vorige marker. Als er meer rijen zijn dan passen, scrollen het wiel over de namen, een sleepbeweging of klik op de balk aan de rechterkant, en Page Up en Page Down de rijen (top=N in --show start bij rij N). De kolom naast de namen leest elke rij af op de cursor (op de aanwijzer zonder cursor, anders op de rechterkant van het venster), en de hover-tip geeft de tijd vanaf de cursor. Nets genaamd X[0] tot X[n], of X0 tot Xn (ook X0_N tot Xn_N), worden samengevoegd tot één busrij in hex weergegeven, MSB eerst, met een nibble van x voor elke onbekende bit en z voor een zwevende; hetzelfde geldt voor een record-item { name, nets }. Klik op een busnaam om de bits te openen. De VCD bevat dezelfde bussen als vectoren in plaats van hun bits: Q0 tot Q3 als $var wire 4 # Q [3:0] $end, Y0_N tot Y7_N als Y_N [7:0] en een record-bus van n nets als NAME [n-1:0], MSB eerst. Markers bovenaan tonen elke mislukte assertie (rood, op het moment dat deze werd gecontroleerd), timing overtreding (amber) en contentie (vioolt), met een punt op de rijen van de betrokken nets; hover erover voor de melding, klik erop om de cursor daar te zetten. Een run houdt zijn eerste 10000 markers, en de kop meldt 'capped' als dat aantal is bereikt. agentee render NAME --show from=300ns,to=900ns,cursor=550ns,open=Q[3:0] tekent hetzelfde venster 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--"]

Een klok is laag tot phase, dan hoog voor duty van elke period; zonder phase begint hij hoog op 0. Een stimulus stuurt zijn net als een sterke driver; op een voedingnet vervangt hij de rail. Een at-controle leest het net zodra alles op dat moment is gestabiliseerd; een sequentie leest de nets net voor elke schone rand (0 naar 1, of 1 naar 0) van de klok, zodat een geregistreerde output wordt gezien zoals hij was toen de rand kwam. Nets worden genoemd zoals in het schema, en een net die via een 0 ohm-koppeling aan een andere is verbonden, reageert op beide namen.

Het netlist wordt als volgt omgezet in cellen:

  • Netten met style = "power" en voedingssymbolen (een symbool met power = true) zijn constante bronnen: een naam met GND, of beginnend met VSS, VEE of 0V, is 0, elke andere is 1 (PWR_FLAG wordt overgeslagen).
  • Een weerstand (R) van 0 ohm, een jumper (JP, SJ, pinnen 1 en 2) en een nettie (NT) voegen hun netten samen tot één. Elke andere weerstand tussen een rail en een net is een pull-up of pull-down, een zwakke driver van het niveau van de rail; tussen twee signaalnetten voegt hij ze samen; tussen twee rails wordt hij weggelaten.
  • Condensatoren, spoelen, beads, filters, diodes, LEDs, testpunten, gaten, fiducials en kristallen (C, L, FB, FL, D, LED, TP, H, MH, FID, Y, X) worden weggelaten.
  • Onderdelen waarvan de waarde (of anders het symboolnaam) een 74-serienummer bevat, krijgen het ingebouwde model op pinnummer: 74HC00, SN74LVC1G08DBVR en CD74HCT04E komen allemaal overeen. De bibliotheek dekt 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 en 595, de enkele poorten 1G00, 1G02, 1G04, 1G06, 1G07, 1G08, 1G14, 1G17, 1G32, 1G34, 1G74, 1G79, 1G80, 1G86, 1G125, 1G126 en 1G157, en de dubbele poorten 2G00, 2G02, 2G04, 2G08, 2G14, 2G17, 2G32, 2G34, 2G74, 2G86, 2G125 en 2G126. Een eenheid van een meervoudig symbool die niet is geplaatst, wordt weggelaten; een geplaatste pin zonder net leest als zwevend (z).
  • De 14 (en 1G14, 2G14) Schmitt-trigger zijn inverters; de sim heeft geen langzame analoge flanke waarop de hysterese kan werken. De 573 is acht dlatch en de 574 acht dff, elk met de gedeelde OE (pin 1, actief laag) die de outputs zwevend maakt. De 245 is acht xcvr: met OE (pin 19) laag stuurt hij B aan vanuit A terwijl DIR (pin 1) hoog is, en A vanuit B terwijl die laag is. De 01, 03 (quad NAND), 05, 06, 1G06 (inverters) en 07, 1G07 (buffers) zijn open drain: ze trekken laag of laten los (z), en een pull-up-weerstand maakt de 1. Elke 01 heeft de 7402-pinaanleg (outputs op 1, 4, 10, 13, inputs daarna), volgens TI SDLS026 (SN7401, SN74LS01) en Renesas REJ03D0532 (HD74HC01); de 03 heeft de 7400-aanleg, volgens TI SCLS077 (SN74HC03).
  • Een poort waarvan de outputpinnen in het symbool allemaal open_collector zijn, is ook open drain.
  • Onderdelen waarvan de waarde of het symbool een primitiefnaam is (AND, NAND3, OR, NOR, XOR, XNOR, NOT, INV, BUF, TRIBUF, DFF, JKFF, SRLATCH, DLATCH, MUX2) koppelen hun pinnen per naam: D, CLK (ook C, CP, CK), S / SET / PRE, R / RST / CLR, EN, OE, Q, ~{Q}; de output van een poort is zijn output-pin (of Y, Q, OUT) en elke andere signaalpin is een input. Een streepje boven (~{R}), een achterliggend # of _N, of een omgekeerde pinvorm maakt de pin actief laag.
  • Elk ander onderdeel is een fout met die naam, tenzij het in ignore staat of een [[parts]]-model heeft.

Familietiming, van de familietekens na 74 (propagatietijd, setup, hold, en de recovery en removal van een asynchrone set of reset):

FamilieVertragingSetupHoldRecoveryRemoval
HC, HCT10 ns15 ns3 ns8 ns0
AHC, AHCT, VHC, VHCT6 ns5 ns1 ns3.5 ns0
AC, ACT6 ns4 ns1 ns2.4 ns0
LVC4 ns3 ns1 ns2 ns0
ALVC, LVT, ALVT, AUC, AVC4 ns2 ns1 ns2 ns0
AUP, LV, LVX6 ns3 ns1 ns3 ns1 ns
LS en gewone 7415 ns20 ns5 ns25 ns3 ns
overige10 ns10 ns2 ns10 ns2 ns

Recovery en removal zijn datasheet-minima over -40 tot 85 C bij 4.5 V (5 V-families) of 3.3 V (LVC), het grootste van TI en Nexperia als beide er één vermelden:

  • HC, HCT: 8 ns trec van nSD, nRD naar nCP, Nexperia 74HC_HCT74 rev 9 (TI SN74HC74 SCLS094F geeft 6 ns, TI CD74HC74 SCHS124E 8 ns, daar trem genoemd).
  • AHC, AHCT: 3.5 ns trec van nRD naar nCP voor de 74AHCT74 (3.0 ns voor de 74AHC74), Nexperia 74AHC_AHCT74 rev 11 (TI SN74AHC74 SCLS255N geeft 3 ns).
  • AC, ACT: 2.4 ns trec bij 5 V, TI CD74AC74 SCHS231E en CD74ACT74 SCHS321A (TI SN74AC74 SCAS521H geeft 0).
  • LVC: 2 ns setup van PRE of CLR inactief vóór CLK, TI SN74LVC74A SCAS287W (Nexperia 74LVC74A geeft 1.0 ns).
  • LS: 25 ns setup van CLR inactief en 3 ns hold op elke input, TI SN74LS161A SDLS060 (de SN74LS74A in SDLS119 vermeldt geen van beide).

Geen van de CMOS-bladen hierboven (noch TI SN74HC161 SCLS297D of Nexperia 74LVC161, waarvan de hold alleen de synchrone inputs dekt) vermeldt een removal-tijd, dus die is daar 0. De AUP, LV, LVX en andere rijen nemen hun setup en hold.

Primitieven per naam en generieke symbolen nemen 1 ns en geen setup of hold.

Een aangepast onderdeel krijgt een model inline, gematcht op ref of op value (elk onderdeel met die waarde). Meerdere entries voor één onderdeel voegen elk een cel toe (één per poort van een quad, bijvoorbeeld). Een entry met alleen timing behoudt het ingebouwde model en verandert de timing ervan.

[[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 x

Primitieve pinkeys (inputs, dan outputs); voeg _N toe aan een key voor een actief-laag pin of een omgekeerde output, en laat een optionele input weg om hem inactief te houden:

PrimitiefInputsOutputs
and, or, xor, nand, nor, xnorelke key behalve YY
not, buféén keyY
elke poort met _od (nand_od, not_od, buf_od)als de poortY, open drain: 0 of z
triA, OEY (z als OE laag is)
dffD, CLK, optioneel S, R, OEQ, QN (z als OE laag is)
jkJ, K, CLK, optioneel S, RQ, QN
srS, RQ, QN
dlatchD, EN, optioneel R, OEQ, QN (z als OE laag is)
xcvrA, B, DIR, optioneel OEA, B: dezelfde pinnen, aangedreven van de andere kant door DIR
mux2I0, I1, S, optioneel ENY
dec138A0, A1, A2, E1, E2, E3Y0 tot Y7
counter161, counter163optioneel R, CLK, optioneel D0 tot D3, CEP, LOAD, CETQ0 tot Q3, TC
shift164A, optioneel B, CLK, optioneel RQ0 tot Q7
shift595D, CLK, LATCH, optioneel R, OEQ0 tot Q7, QS

Flip-flops klokken op de stijgende flank (gebruik CLK_N voor de dalende); S en R zijn asynchroon en als beide actief zijn, wordt Q = QN = 1, zoals op een 74HC74. De 161 reset direct, de 163 op de volgende flank. Een 595 verschuift op CLK, kopieert naar zijn uitgangen op LATCH (de waarde van vóór een verschuiving op hetzelfde moment) en laat ze zweven terwijl OE laag is.

De engine houdt vier niveaus bij: 0, 1, x (onbekend) en z (zwevend). Elk net lost zijn drivers op: sterke drivers (uitgangen, rails, stimuli) die overeenkomen stellen het niveau, 0 tegen 1 geeft x en een gemelde contentie, en pull-weerstanden tellen alleen als er geen sterke driver actief is. Een z-ingang leest als x. Gates gaan alleen naar x als de onbekende input ertoe doet (0 naar een AND is 0), en een flip-flop die wordt geklokt door een onzekere flank (0 naar x, of x naar 1) gaat naar x, tenzij hij zijn waarde zou behouden. Elke uitgang heeft zijn eigen vertraging (transport, dus pulsen korter dan de vertraging gaan erdoor); events lopen in tijdsvolgorde, en veranderingen met nul vertraging stabiliseren in delta-cycles op hetzelfde moment. Een lus met nul vertraging die na 1000 delta-cycles nog steeds verandert, stopt de run en meldt de nets, en hetzelfde gebeurt bij een run die 50 miljoen events overschrijdt.

Flip-flops, tellers en shift registers controleren setup en hold op hun geklokte ingangen tegen de timing van het model: een data-ingang die minder dan setup vóór een stijgende klokflank veranderde, of minder dan hold erna, is een overtreding (niet gecontroleerd terwijl een asynchrone reset of set actief is). Een D-latch controleert zijn D op dezelfde manier tegen de sluitende (dalende) flank van EN. Een asynchrone reset of set die minder dan recovery vóór een klokflank wordt vrijgegeven, of minder dan removal erna, is ook een overtreding, met de recovery en removal uit de familietabel. Een 595 vereist ook dat de stijgende flank van LATCH (RCLK) minstens setup na de laatste stijgende flank van CLK (SRCLK) komt; de twee klokken aan elkaar gekoppeld (hetzelfde moment) is prima en latched de waarde van vóór de verschuiving.

Bij een overtreding gaat de flip-flop, latch of register die de controle dekt naar x, zoals de Verilog-modellen dat doen met hun notifiers, tot hij weer netjes wordt geklokt, gezet of gereset. Stel on_violation = "keep" in op de simulatie om de overtreding te rapporteren en de bemonsterde waarde te behouden in plaats daarvan.

Lezingen: geslaagde en mislukte assertions, contentions, timingovertredingen, cells en events. De controle lijst elke mislukte assertion, contention, timingovertreding of gestopte run op als een fout op de simulatie, zolang het resultaat actueel is. Het resultaat wordt verouderd als de spec of het netlist van het schema verandert. examples/logic bevat twee: counter, een 74HC161 die telt naar een 74HC138, en i2c, een open-drain bus waar een controller (twee 74LVC1G07) en een doel (een 74LVC1G06 die SDA laag trekt voor zijn ACK) 4,7k pull-ups delen, en een 74HC595 geklokt door SCL de byte vangt, gecontroleerd op START, de bits, de ACK, de byte (een record-bus) en STOP.

docs/format.md · Markdown voor agents