agentee

Symulacja

Symulacja logiczna

Symulacja zdarzeniowa części cyfrowych schematu: modele serii 74, prymitywy, stymulacja, asercje, setup i hold, wyjście VCD.

Symulacja sterowana zdarzeniami części cyfrowych schematu, bezpośrednio z jego listy sieci; nie jest potrzebny projekt PCB. agentee new sim NAME --kind logic (MCP new_item z kind = "sim" i sim_kind = "logic") zapisuje szablon z zegarem, resetem i asercją zegarową do przemianowania na Twoje sieci; --kind fdtd, domyślnie, uruchamia symulację FDTD. agentee sim NAME (MCP run_sim) zapisuje NAME.result.json i przebieg VCD NAME.vcd obok specyfikacji; podgląd rysuje przebieg dla każdej zarejestrowanej sieci w funkcji czasu.

W widoku przebiegu kółko myszy (lub szczypanie, lub ctrl i kółko) przybliża wokół wskaźnika, przeciąganie lub przewijanie w bok przesuwa widok, podwójne kliknięcie dopasowuje cały przebieg, a kliknięcie ustawia kursor czasu, przyciągany do krawędzi wiersza pod nim w odległości kilku pikseli. + i - przybliżają wokół kursora, strzałki przesuwa widok, F lub Home dopasowuje, Escape usuwa kursor, a N i P przeskakują kursor do następnego i poprzedniego znacznika. Gdy wierszy jest więcej, niż się mieści, kółko nad nazwami, przeciąganie lub kliknięcie na pasku po prawej krawędzi oraz Page Up i Page Down przewijają wiersze (top=N w --show zaczyna od wiersza N). Kolumna obok nazw odczytuje każdy wiersz w pozycji kursora (w pozycji wskaźnika, jeśli nie ma kursora, inaczej na prawej krawędzi widoku), a podpowiedź po najechaniu podaje czas od kursora. Sieci nazwane X[0] do X[n], lub X0 do Xn (także X0_N do Xn_N), są składane w jeden wiersz magistrali rysowany w szesnastkowo, od MSB, z nibblem x dla każdej nieznanej bitu i z dla pływającego; tak samo wpis record { name, nets }. Kliknij nazwę magistrali, aby otworzyć jej bity. VCD przechowuje te same magistrale jako wektory zamiast bitów: Q0 do Q3 jako $var wire 4 # Q [3:0] $end, Y0_N do Y7_N jako Y_N [7:0] i magistralę record z n sieciami jako NAME [n-1:0], od MSB. Znaczniki u góry pokazują każdą nieudaną asercję (czerwony, w czasie jej sprawdzenia), naruszenie czasowe (bursztynowy) i konflikt (fioletowy), z kropką na wierszach zaangażowanych sieci; najedź, aby zobaczyć komunikat, kliknij, aby ustawić kursor. Przebieg zachowuje pierwsze 10000 znaczników, a nagłówek mówi o ograniczeniu, gdy osiągnął ten limit. agentee render NAME --show from=300ns,to=900ns,cursor=550ns,open=Q[3:0] rysuje ten sam widok bez interfejsu.

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--"]

Zegar jest niski do phase, a potem wysoki przez duty każdego period; bez fazy zaczyna od stanu wysokiego w 0. Stymulacja steruje swoją siecią jako silny sterownik; na sieci zasilania zastępuje szynę. Sprawdzenie at odczytuje sieć, gdy wszystko w danym czasie się ustabilizuje; sekwencja odczytuje sieci tuż przed każdą czystą krawędzią zegara (z 0 do 1 lub z 1 do 0), więc wyjście rejestrowane jest widziane tak, jak było w momencie nadejścia krawędzi. Sieci mają nazwy jak na schemacie, a sieć połączona z inną przez link 0-ohmowy odpowiada na którąkolwiek nazwę.

Lista sieci staje się komórkami w następujący sposób:

  • Sieci z style = "power" i symbole zasilania (symbol z power = true) to stałe źródła: nazwa zawierająca GND, albo zaczynająca się od VSS, VEE lub 0V, to 0, każda inna to 1 (PWR_FLAG jest pomijane).
  • Rezystor (R) 0-ohmowy, zwora (JP, SJ, piny 1 i 2) i połączenie sieci (NT) scalają swoje sieci w jedną. Każdy inny rezystor między szyną a siecią to podciąganie lub opuszczanie, słaby sterownik poziomu szyny; między dwiema sieciami sygnałowymi scala je; między dwiema szynami jest pomijany.
  • Kondensatory, cewki, perły, filtry, diody, diody LED, punkty testowe, otwory, punkty referencyjne i kryształy (C, L, FB, FL, D, LED, TP, H, MH, FID, Y, X) są pomijane.
  • Części, których wartość (albo nazwa symbolu) zawiera numer serii 74, przyjmują wbudowany model według numeru pinu: 74HC00, SN74LVC1G08DBVR i CD74HCT04E wszystkie pasują. Biblioteka obejmuje 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 i 595, bramki pojedyncze 1G00, 1G02, 1G04, 1G06, 1G07, 1G08, 1G14, 1G17, 1G32, 1G34, 1G74, 1G79, 1G80, 1G86, 1G125, 1G126 i 1G157 oraz bramki podwójne 2G00, 2G02, 2G04, 2G08, 2G14, 2G17, 2G32, 2G34, 2G74, 2G86, 2G125 i 2G126. Jednostka symbolu wielojednostkowego, która nie jest umieszczona, jest pomijana; umieszczony pin bez sieci jest odczytywany jako pływający (z).
  • Triggery Schmitta 14 (i 1G14, 2G14) to inwertery; symulacja nie ma wolnej krawędzi analogowej, na której mógłby działać histereza. 573 to osiem dlatch, a 574 to osiem dff, każde ze wspólnym OE (pin 1, aktywne niskie), które unosi wyjścia. 245 to osiem xcvr: gdy OE (pin 19) jest niskie, steruje B z A, gdy DIR (pin 1) jest wysokie, i A z B, gdy jest niskie. 01, 03 (kwadro NAND), 05, 06, 1G06 (inwertery) oraz 07, 1G07 (bufory) mają otwarty dren: ciągną do zera lub puszczają (z), a rezystor podciągający tworzy jedynkę. Każdy 01 ma układ pinów 7402 (wyjścia na 1, 4, 10, 13, wejścia po każdym), zgodnie z TI SDLS026 (SN7401, SN74LS01) i Renesas REJ03D0532 (HD74HC01); 03 ma układ 7400, zgodnie z TI SCLS077 (SN74HC03).
  • Bramka, której wszystkie piny wyjściowe są open_collector w symbolu, ma również otwarty dren.
  • Części, których wartość lub symbol to nazwa prymitywu (AND, NAND3, OR, NOR, XOR, XNOR, NOT, INV, BUF, TRIBUF, DFF, JKFF, SRLATCH, DLATCH, MUX2), mapują swoje piny według nazwy: D, CLK (także C, CP, CK), S / SET / PRE, R / RST / CLR, EN, OE, Q, ~{Q}; wyjściem bramki jest jej pin output (albo Y, Q, OUT), a każdy inny pin sygnałowy to wejście. Kreska nad nazwą (~{R}), końcowy # lub _N, albo odwrócony kształt pinu oznacza pin aktywny niski.
  • Każdy inny element to błąd z jego nazwą, chyba że znajduje się w ignore lub ma model [[parts]].

Czasowanie rodziny, z liter rodziny po 74 (opóźnienie propagacji, setup, hold oraz recovery i removal asynchronicznego set lub reset):

RodzinaOpóźnienieSetupHoldRecoveryRemoval
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 i zwykłe 7415 ns20 ns5 ns25 ns3 ns
inne10 ns10 ns2 ns10 ns2 ns

Recovery i removal to minima z datasheetów w zakresie od -40 do 85 C przy 4.5 V (rodziny 5 V) lub 3.3 V (LVC), większa wartość z TI i Nexperia, gdy oba je podają:

  • HC, HCT: 8 ns trec z nSD, nRD do nCP, Nexperia 74HC_HCT74 rev 9 (TI SN74HC74 SCLS094F podaje 6 ns, TI CD74HC74 SCHS124E 8 ns, nazwane tam trem).
  • AHC, AHCT: 3.5 ns trec z nRD do nCP dla 74AHCT74 (3.0 ns dla 74AHC74), Nexperia 74AHC_AHCT74 rev 11 (TI SN74AHC74 SCLS255N podaje 3 ns).
  • AC, ACT: 2.4 ns trec przy 5 V, TI CD74AC74 SCHS231E i CD74ACT74 SCHS321A (TI SN74AC74 SCAS521H podaje 0).
  • LVC: 2 ns setup PRE lub CLR nieaktywnego przed CLK, TI SN74LVC74A SCAS287W (Nexperia 74LVC74A podaje 1.0 ns).
  • LS: 25 ns setup CLR nieaktywnego i 3 ns hold na dowolnym wejściu, TI SN74LS161A SDLS060 (SN74LS74A w SDLS119 nie podaje żadnego).

Żaden z powyższych arkuszy CMOS (ani TI SN74HC161 SCLS297D, ani Nexperia 74LVC161, którego hold obejmuje tylko wejścia synchroniczne) nie podaje czasu removal, więc wynosi on 0. Wiersze AUP, LV, LVX i inne przyjmują ich setup i hold.

Prymitywy według nazwy i symbole generyczne przyjmują 1 ns i nie mają setup ani hold.

Własna część otrzymuje model inline, dopasowany przez ref lub przez value (każda część z tą wartością). Kilka wpisów dla jednej części dodaje po jednej komórce (np. po jednej na bramkę kwadro). Wpis z samym czasowaniem zachowuje wbudowany model i zmienia jego czasowanie.

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

Klucze pinów prymitywów (wejścia, potem wyjścia); dodaj _N do klucza dla pinu aktywnego niskiego lub odwróconego wyjścia, a pomiń opcjonalne wejście, aby utrzymać je nieaktywnym:

PrymitywWejściaWyjścia
and, or, xor, nand, nor, xnordowolne klucze poza YY
not, bufjeden kluczY
dowolna bramka z _od (nand_od, not_od, buf_od)jak bramkaY, otwarty dren: 0 lub z
triA, OEY (z, gdy OE jest niskie)
dffD, CLK, opcjonalne S, R, OEQ, QN (z, gdy OE jest niskie)
jkJ, K, CLK, opcjonalne S, RQ, QN
srS, RQ, QN
dlatchD, EN, opcjonalne R, OEQ, QN (z, gdy OE jest niskie)
xcvrA, B, DIR, opcjonalne OEA, B: te same piny, sterowane z drugiej strony przez DIR
mux2I0, I1, S, opcjonalnie ENY
dec138A0, A1, A2, E1, E2, E3Y0 do Y7
counter161, counter163opcjonalnie R, CLK, opcjonalnie D0 do D3, CEP, LOAD, CETQ0 do Q3, TC
shift164A, opcjonalnie B, CLK, opcjonalnie RQ0 do Q7
shift595D, CLK, LATCH, opcjonalnie R, OEQ0 do Q7, QS

Triggery reagują na zbocz rosnące (klucz CLK_N dla zboczu opadającego); S i R są asynchroniczne, a gdy oba są aktywne, Q = QN = 1, jak w 74HC74. Układ 161 resetuje się natychmiast, a 163 przy następnym zboczu. Układ 595 przesuwa dane na CLK, kopiuje je na wyjścia na LATCH (wartość sprzed przesunięcia w tej samej chwili) i ustawia wyjścia w stanie wysokiej impedancji, gdy OE jest niskie.

Silnik utrzymuje cztery poziomy: 0, 1, x (nieznany) i z (pływający). Każda sieć rozwiązuje swoje sterowniki: silne sterowniki (wyjścia, szyny zasilania, stymulacje), które się zgadzają, ustawiają poziom; 0 przeciw 1 daje x i zgłaszaną kolizję, a rezystory podciągające liczą się tylko wtedy, gdy nie ma aktywnego silnego sterownika. Wejście z odczytuje się jako x. Bramki przechodzą do x tylko wtedy, gdy nieznane wejście ma znaczenie (0 na wejściu AND daje 0), a trigger zegarowany przez niepewne zbocze (0 do x, lub x do 1) przechodzi do x, chyba że zachowałby swoją wartość. Każde wyjście ma własne opóźnienie (transportowe, więc impulsy krótsze niż opóźnienie przechodzą); zdarzenia wykonują się w kolejności czasowej, a zmiany z zerowym opóźnieniem ustabilizowują się w cyklach delta w tej samej chwili. Pętla z zerowym opóźnieniem, która nadal się zmienia po 1000 cyklach delta, zatrzymuje symulację i zgłasza sieci, podobnie jak symulacja przekraczająca 50 milionów zdarzeń.

Triggery, liczniki i rejestry przesuwań sprawdzają setup i hold na swoich wejściach zegarowych względem czasu modelu: wejście danych, które zmieniło się mniej niż setup przed rosnącym zboczem zegara, lub mniej niż hold po nim, to naruszenie (nie jest sprawdzane, gdy aktywny jest asynchroniczny reset lub set). Latch D sprawdza swoje D względem zamykającego (opadającego) zbocza EN w ten sam sposób. Asynchroniczny reset lub set zwolniony mniej niż recovery przed zboczem zegara, lub mniej niż removal po nim, to również naruszenie, z recovery i removal z tabeli rodziny. Układ 595 wymaga również, aby rosnące zbocze LATCH (RCLK) następowało co najmniej setup po ostatnim rosnącym zboczu CLK (SRCLK); połączenie obu zegarów (ta sama chwila) jest poprawne i zapisuje wartość sprzed przesunięcia.

W przypadku naruszenia trigger, latch lub rejestr, który obejmuje sprawdzenie, przechodzi do x, tak jak modele Verilog z ich notifiers, aż do momentu, gdy zostanie ponownie zegarowany, ustawiony lub zresetowany bezbłędnie. Ustaw on_violation = "keep" w symulacji, aby zgłosić naruszenie i zachować próbkowaną wartość zamiast tego.

Odczyty: asercje (przeszłe i nieprzeszłe), konflikty, naruszenia czasu, komórki i zdarzenia. Sprawdzanie wypisuje każdą nieprzeszłą asercję, konflikt, naruszenie czasu lub zatrzymane uruchomienie jako błąd symulacji, dopóki wynik jest aktualny. Wynik przestaje być aktualny, gdy zmieni się specyfikacja lub netlist schematu. examples/logic zawiera dwa przykłady: counter, licznik 74HC161 podłączony do 74HC138, oraz i2c, magistrala open-drain, w której kontroler (dwa 74LVC1G07) i cel (74LVC1G06 pociągający SDA do masy w celu ACK) współdzielą rezystory podciągające 4,7k, a 74HC595 zegarowany przez SCL przechwytuje bajt, sprawdzany pod kątem START, bitów, ACK, bajtu (magistrali record) i STOP.

docs/format.md · Markdown dla agentów