agentee

Моделирование

Логическое моделирование

Событийная симуляция цифровых частей схемы: модели серии 74, примитивы, стимулы, ассерции, setup и hold, вывод в VCD.

Событийная симуляция цифровых частей схемы, непосредственно из её списка соединений; топология платы не требуется. agentee new sim NAME --kind logic (MCP new_item с kind = "sim" и sim_kind = "logic") создаёт стартовый файл с тактовым сигналом, сбросом и тактируемым утверждением, которое нужно переименовать в ваши цепи; --kind fdtd, значение по умолчанию, запускает FDTD-расчёт. agentee sim NAME (MCP run_sim) записывает NAME.result.json и VCD-диаграмму NAME.vcd рядом со спецификацией; просмотрщик рисует трассу для каждой записанной цепи по времени.

В виде диаграммы колесо мыши (или щипок, или ctrl и колесо) масштабирует вокруг указателя, перетаскивание или боковая прокрутка смещают вид, двойной щелчок вписывает весь прогон, а щелчок устанавливает курсор времени, привязанный к краю строки под ним в пределах нескольких пикселей. + и - масштабируют вокруг курсора, стрелки смещают, F или Home вписывают, Escape снимает курсор, а N и P перемещают курсор к следующему и предыдущему маркеру. Если строк больше, чем помещается, колесо над именами, перетаскивание или щелчок на полосе у правого края, а также Page Up и Page Down прокручивают строки (top=N в --show начинает со строки N). Колонка рядом с именами читает все строки на курсоре (на указателе без курсора, иначе на правом крае вида), а подсказка при наведении показывает время от курсора. Цепи с именами X[0] до X[n], или X0 до Xn (также X0_N до Xn_N), сворачиваются в одну строку шины, отображаемую в шестнадцатеричном виде, старший бит первым, с нибблом x для неизвестного бита и z для плавающего; то же самое для записи record { name, nets }. Щёлкните имя шины, чтобы открыть её биты. VCD хранит те же шины как векторы вместо их битов: Q0 до Q3 как $var wire 4 # Q [3:0] $end, Y0_N до Y7_N как Y_N [7:0] и шина record из n цепей как NAME [n-1:0], старший бит первым. Маркеры вдоль верха показывают каждое неудачное утверждение (красный, в момент проверки), нарушение тайминга (янтарный) и конфликт (фиолетовый), с точкой на строках задействованных цепей; наведите на один, чтобы увидеть сообщение, щёлкните, чтобы поставить курсор туда. Прогон сохраняет первые 10000 маркеров, и заголовок указывает на ограничение, если достигнут предел. agentee render NAME --show from=300ns,to=900ns,cursor=550ns,open=Q[3:0] рисует тот же вид без интерфейса.

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

Часовой сигнал низкий до phase, затем высокий в течение duty каждого period; без phase он начинается с высокого уровня в момент 0. Стимул управляет своей цепью как сильный драйвер; на цепи питания он заменяет шину. Проверка at читает цепь, когда всё к этому моменту уже стабилизировалось; последовательность читает цепи сразу перед каждым чистым фронтом (0 в 1 или 1 в 0) часового сигнала, поэтому регистровый выход виден таким, каким он был в момент фронта. Цепи называются так, как в схеме, и цепь, соединённая с другой через резистор 0 Ом, отвечает на оба имени.

Схема преобразуется в ячейки следующим образом:

  • Цепи с style = "power" и символы питания (символ с power = true) являются постоянными источниками: имя с GND, или начинающееся с VSS, VEE или 0V, равно 0, любое другое равно 1 (PWR_FLAG пропускается).
  • Резистор (R) 0 Ом, перемычка (JP, SJ, выводы 1 и 2) и перемычка цепей (NT) объединяют свои цепи в одну. Любой другой резистор между шиной и цепью является подтяжкой вверх или вниз, слабым драйвером уровня шины; между двумя сигнальными цепями он объединяет их; между двумя шинами он исключается.
  • Конденсаторы, индуктивности, ферритовые бусины, фильтры, диоды, светодиоды, контрольные точки, отверстия, реперные точки и кварцевые резонаторы (C, L, FB, FL, D, LED, TP, H, MH, FID, Y, X) исключаются.
  • Компоненты, значение (или имя символа) которых содержит номер серии 74, используют встроенную модель по номеру вывода: 74HC00, SN74LVC1G08DBVR и CD74HCT04E все совпадают. Библиотека покрывает 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 и 595, одиночные вентили 1G00, 1G02, 1G04, 1G06, 1G07, 1G08, 1G14, 1G17, 1G32, 1G34, 1G74, 1G79, 1G80, 1G86, 1G125, 1G126 и 1G157, и двойные вентили 2G00, 2G02, 2G04, 2G08, 2G14, 2G17, 2G32, 2G34, 2G74, 2G86, 2G125 и 2G126. Единица многоединичного символа, которая не размещена, исключается; размещённый вывод без цепи считывается как плавающий (z).
  • Триггеры Шмитта 14 (и 1G14, 2G14) являются инверторами; в симуляции нет медленного аналогового фронта, на который мог бы действовать гистерезис. 573 состоит из восьми dlatch, а 574 из восьми dff, каждый с общим OE (вывод 1, активный низкий), который переводит выходы в плавающее состояние. 245 состоит из восьми xcvr: при низком OE (вывод 19) он управляет B из A, пока DIR (вывод 1) высокий, и A из B, пока он низкий. 01, 03 (квадратный И-НЕ), 05, 06, 1G06 (инверторы) и 07, 1G07 (буферы) имеют открытый сток: они тянут вниз или отпускают (z), а резистор подтяжки создаёт 1. Каждый 01 имеет распиновку 7402 (выходы на 1, 4, 10, 13, входы после каждого), согласно TI SDLS026 (SN7401, SN74LS01) и Renesas REJ03D0532 (HD74HC01); 03 имеет распиновку 7400, согласно TI SCLS077 (SN74HC03).
  • Вентиль, все выходные выводы которого в его символе помечены как open_collector, также имеет открытый сток.
  • Компоненты, значение или символ которых является именем примитива (AND, NAND3, OR, NOR, XOR, XNOR, NOT, INV, BUF, TRIBUF, DFF, JKFF, SRLATCH, DLATCH, MUX2), сопоставляют свои выводы по имени: D, CLK (также C, CP, CK), S / SET / PRE, R / RST / CLR, EN, OE, Q, ~{Q}; выход вентиля является его выводом output (или Y, Q, OUT), а каждый другой сигнальный вывод является входом. Перечёркивание (~{R}), завершающий # или _N, или инвертированная форма вывода делают вывод активным низким.
  • Любой другой компонент вызывает ошибку с указанием его имени, если он не указан в ignore и не имеет модели [[parts]].

Временные характеристики семейства, по буквам семейства после 74 (задержка распространения, установочное время, удерживающее время, а также восстановление и удаление асинхронного сброса или установки):

СемействоЗадержкаУстановочное времяУдерживающее времяВосстановлениеУдаление
HC, HCT10 нс15 нс3 нс8 нс0
AHC, AHCT, VHC, VHCT6 нс5 нс1 нс3,5 нс0
AC, ACT6 нс4 нс1 нс2,4 нс0
LVC4 нс3 нс1 нс2 нс0
ALVC, LVT, ALVT, AUC, AVC4 нс2 нс1 нс2 нс0
AUP, LV, LVX6 нс3 нс1 нс3 нс1 нс
LS и обычный 7415 нс20 нс5 нс25 нс3 нс
остальные10 нс10 нс2 нс10 нс2 нс

Восстановление и удаление являются минимальными значениями из даташитов в диапазоне от -40 до 85 °C при 4,5 В (семейства 5 В) или 3,3 В (LVC), большее из значений TI и Nexperia, если оба указывают:

  • HC, HCT: 8 нс trec от nSD, nRD до nCP, Nexperia 74HC_HCT74 rev 9 (TI SN74HC74 SCLS094F указывает 6 нс, TI CD74HC74 SCHS124E 8 нс, там называется trem).
  • AHC, AHCT: 3,5 нс trec от nRD до nCP для 74AHCT74 (3,0 нс для 74AHC74), Nexperia 74AHC_AHCT74 rev 11 (TI SN74AHC74 SCLS255N указывает 3 нс).
  • AC, ACT: 2,4 нс trec при 5 В, TI CD74AC74 SCHS231E и CD74ACT74 SCHS321A (TI SN74AC74 SCAS521H указывает 0).
  • LVC: 2 нс установочного времени неактивного PRE или CLR перед CLK, TI SN74LVC74A SCAS287W (Nexperia 74LVC74A указывает 1,0 нс).
  • LS: 25 нс установочного времени неактивного CLR и 3 нс удерживающего времени на любом входе, TI SN74LS161A SDLS060 (SN74LS74A в SDLS119 не указывает ни то, ни другое).

Ни один из CMOS даташитов выше (а также TI SN74HC161 SCLS297D или Nexperia 74LVC161, у которых удерживающее время покрывает только синхронные входы) не указывает время удаления, поэтому оно равно 0. Строки AUP, LV, LVX и другие берут свои установочное и удерживающее время.

Примитивы по имени и универсальные символы берут 1 нс и не имеют установочного или удерживающего времени.

Пользовательский компонент получает модель inline, сопоставленную по ref или по value (все компоненты с этим значением). Несколько записей для одного компонента добавляют по ячейке (одну на каждый вентиль квадрата, например). Запись только с временными характеристиками сохраняет встроенную модель и изменяет её временные характеристики.

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

Ключи выводов примитивов (входы, затем выходы); добавьте _N к ключу для активного низкого вывода или инвертированного выхода, и опустите необязательный вход, чтобы держать его неактивным:

ПримитивВходыВыходы
and, or, xor, nand, nor, xnorлюбые ключи, кроме YY
not, bufодин ключY
любой вентиль с _od (nand_od, not_od, buf_od)как у вентиляY, открытый сток: 0 или z
triA, OEY (z, когда OE низкий)
dffD, CLK, необязательные S, R, OEQ, QN (z, когда OE низкий)
jkJ, K, CLK, необязательные S, RQ, QN
srS, RQ, QN
dlatchD, EN, необязательные R, OEQ, QN (z, когда OE низкий)
xcvrA, B, DIR, необязательный OEA, B: те же выводы, управляемые с другой стороны сигналом DIR
mux2I0, I1, S, необязательный ENY
dec138A0, A1, A2, E1, E2, E3Y0 до Y7
counter161, counter163необязательный R, CLK, необязательные D0 до D3, CEP, LOAD, CETQ0 до Q3, TC
shift164A, необязательный B, CLK, необязательный RQ0 до Q7
shift595D, CLK, LATCH, необязательный R, OEQ0 до Q7, QS

Триггеры срабатывают на фронте (ключ CLK_N для спада); S и R асинхронны, и при активации обоих Q = QN = 1, как в 74HC74. 161 сбрасывается сразу, 163 на следующем фронте. 595 сдвигает данные по CLK, копирует их на выходы по LATCH (значение до сдвига в тот же момент) и переводит их в высокоимпедансное состояние, пока OE низкий.

Движок поддерживает четыре уровня: 0, 1, x (неопределенный) и z (висячий). Каждая цепь разрешает конфликты между источниками: сильные источники (выходы, шины питания, стимулы), которые согласованы, задают уровень; 0 против 1 дает x и фиксирует конфликт; резисторы подтяжки учитываются только при отсутствии сильного источника. Вход z считывается как x. Логические вентили переходят в x только тогда, когда неопределенный вход влияет на результат (0 на входе И дает 0). Триггер, управляемый неопределенным фронтом (переход 0 в x или x в 1), переходит в x, если не сохраняет свое значение. У каждого выхода своя задержка (транспортная, поэтому импульсы короче задержки проходят). События выполняются в хронологическом порядке, а изменения с нулевой задержкой стабилизируются в дельта-циклах в тот же момент. Петля с нулевой задержкой, которая все еще меняется после 1000 дельта-циклов, останавливает выполнение и сообщает о цепях; то же происходит при превышении 50 миллионов событий.

Триггеры, счетчики и сдвиговые регистры проверяют setup и hold на своих тактированных входах по временным характеристикам модели: вход данных, изменившийся менее чем за setup до фронта тактового сигнала или менее чем за hold после него, является нарушением (не проверяется, пока активен асинхронный сброс или установка). D-лач проверяет свой вход D по спадающему фронту EN аналогичным образом. Асинхронный сброс или установка, снятые менее чем за recovery до фронта тактового сигнала или менее чем за removal после него, также являются нарушением, с использованием recovery и removal из таблицы семейства. 595 также требует, чтобы фронт LATCH (RCLK) наступал не менее чем через setup после последнего фронта CLK (SRCLK); если два тактовых сигнала связаны вместе (в тот же момент), это нормально, и фиксируется значение до сдвига.

При нарушении триггер, лач или регистр, охватываемый проверкой, переходит в x, как это делают модели Verilog со своими уведомлениями, пока не будет снова тактирован, установлен или сброшен без нарушений. Установите on_violation = "keep" в симуляции, чтобы сообщать о нарушении и сохранять выборенное значение.

Показания: пройденные и проваленные ассерты, конфликты, временные нарушения, ячейки и события. Проверка перечисляет каждый проваленный ассерт, конфликт, временное нарушение или остановленное выполнение как ошибку в симуляции, пока результат актуален. Результат устаревает при изменении спецификации или списка цепей схемы. В examples/logic два примера: counter, где 74HC161 считает в 74HC138, и i2c, шина с открытым коллектором, где контроллер (два 74LVC1G07) и устройство (74LVC1G06, подтягивающее SDA вниз для ACK) разделяют подтяжки 4.7k, а 74HC595, тактируемый SCL, захватывает байт, проверяя START, биты, ACK, байт (шина record) и STOP.

docs/format.md · Markdown для агентов