Simulação
Simulação lógica
Uma simulação orientada a eventos das partes digitais de um esquema: modelos da série 74, primitivas, estímulo, asserções, setup e hold, saída VCD.
Uma simulação orientada a eventos das partes digitais de um esquema, diretamente da sua lista de redes; não é preciso layout. O agentee new sim NAME --kind logic (MCP new_item com kind = "sim" e sim_kind = "logic") escreve um exemplo com um relógio, um reset e uma asserção com relógio para renomear para as suas redes; o --kind fdtd, o padrão, inicia uma execução FDTD em vez disso. O agentee sim NAME (MCP run_sim) escreve NAME.result.json e uma forma de onda VCD NAME.vcd ao lado da especificação; o visualizador desenha um traço por rede registada em função do tempo.
Na vista de forma de onda, a roda do rato (ou o gesto de pinça, ou ctrl e a roda) faz zoom em torno do ponteiro, um arrasto ou uma rolagem lateral desloca, um duplo clique ajusta a execução inteira, e um clique define o cursor de tempo, fixado a uma borda da linha debaixo dele a poucos píxeis. + e - fazem zoom em torno do cursor, as setas deslocam, F ou Home ajusta, Escape remove o cursor, e N e P saltam o cursor para o marcador seguinte e anterior. Com mais linhas do que cabem, a roda sobre os nomes, um arrasto ou clique na barra na borda direita, e Page Up e Page Down deslocam as linhas (top=N em --show começa na linha N). A coluna ao lado dos nomes lê todas as linhas no cursor (no ponteiro sem cursor, senão na borda direita da vista), e a dica ao passar o rato dá o tempo a partir do cursor. Redes nomeadas X[0] a X[n], ou X0 a Xn (também X0_N a Xn_N), juntam-se numa linha de barramento desenhada em hexadecimal, MSB primeiro, com um nibble de x para qualquer bit desconhecido e z para um flutuante; o mesmo acontece com uma entrada record { name, nets }. Clicar no nome de um barramento abre os seus bits. O VCD guarda os mesmos barramentos como vetores em vez dos seus bits: Q0 a Q3 como $var wire 4 # Q [3:0] $end, Y0_N a Y7_N como Y_N [7:0] e um barramento record de n redes como NAME [n-1:0], MSB primeiro. Marcadores ao longo do topo mostram cada asserção falhada (vermelho, no tempo em que foi verificada), violação de temporização (âmbar) e contenção (violeta), com um ponto nas linhas das redes envolvidas; passar o rato mostra a sua mensagem, clicar coloca o cursor ali. Uma execução mantém os seus primeiros 10000 marcadores, e o cabeçalho diz limitado quando atingiu esse número. O agentee render NAME --show from=300ns,to=900ns,cursor=550ns,open=Q[3:0] desenha a mesma vista sem interface.
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--"]Um relógio está baixo até phase, depois fica alto durante duty de cada period; sem phase, começa alto em 0. Um estímulo conduz a sua rede como um condutor forte; numa rede de alimentação, substitui o trilho. Uma verificação at lê a rede depois de tudo nesse tempo se ter estabilizado; uma sequência lê as redes logo antes de cada flanco limpo (de 0 para 1, ou de 1 para 0) do relógio, de modo que uma saída registada é vista como estava quando o flanco chegou. As redes são nomeadas como no esquema, e uma rede ligada a outra através de uma ligação de 0 ohm responde a qualquer um dos nomes.
A lista de redes torna-se células da seguinte forma:
- Redes com
style = "power"e símbolos de alimentação (um símbolo compower = true) são fontes constantes: um nome comGND, ou que começa porVSS,VEEou0V, é 0, qualquer outro é 1 (PWR_FLAGé ignorado). - Um resistor (
R) de 0 ohm, uma ponte (JP,SJ, pinos 1 e 2) e uma ligação de redes (NT) juntam as suas redes numa só. Qualquer outro resistor entre um trilho e uma rede é um pull-up ou pull-down, um condutor fraco do nível do trilho; entre duas redes de sinal, junta-as; entre dois trilhos, é omitido. - Condensadores, indutores, contas, filtros, diodos, LEDs, pontos de teste, furos, fiduciais e cristais (
C,L,FB,FL,D,LED,TP,H,MH,FID,Y,X) são omitidos. - Peças cujo valor (ou, caso contrário, nome do símbolo) contém um número da série 74 usam o modelo embutido por número de pino:
74HC00,SN74LVC1G08DBVReCD74HCT04Ecorrespondem todos. A biblioteca cobre 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, as portas simples 1G00, 1G02, 1G04, 1G06, 1G07, 1G08, 1G14, 1G17, 1G32, 1G34, 1G74, 1G79, 1G80, 1G86, 1G125, 1G126 e 1G157, e as portas duplas 2G00, 2G02, 2G04, 2G08, 2G14, 2G17, 2G32, 2G34, 2G74, 2G86, 2G125 e 2G126. Uma unidade de um símbolo multiunidade que não está colocada é omitida; um pino colocado sem rede lê como flutuante (z). - Os disparadores Schmitt 14 (e 1G14, 2G14) são inversores; a simulação não tem flanco analógico lento para a histerese atuar. O 573 é oito
dlatche o 574 oitodff, cada um com oOEpartilhado (pino 1, ativo baixo) a flutuar as saídas. O 245 é oitoxcvr: comOE(pino 19) baixo, conduz B a partir de A enquantoDIR(pino 1) está alto e A a partir de B enquanto está baixo. O 01, 03 (quad NAND), 05, 06, 1G06 (inversores) e 07, 1G07 (bufferes) são de dreno aberto: puxam para baixo ou largam (z), e um resistor pull-up faz o 1. Todo o 01 tem o pinout do 7402 (saídas em 1, 4, 10, 13, entradas a seguir a cada uma), segundo TI SDLS026 (SN7401, SN74LS01) e Renesas REJ03D0532 (HD74HC01); o 03 tem o do 7400, segundo TI SCLS077 (SN74HC03). - Uma porta cujos pinos de saída são todos
open_collectorno seu símbolo é também de dreno aberto. - Peças cujo valor ou símbolo é um nome de primitiva (
AND,NAND3,OR,NOR,XOR,XNOR,NOT,INV,BUF,TRIBUF,DFF,JKFF,SRLATCH,DLATCH,MUX2) mapeiam os seus pinos por nome:D,CLK(tambémC,CP,CK),S/SET/PRE,R/RST/CLR,EN,OE,Q,~{Q}; a saída de uma porta é o seu pinooutput(ouY,Q,OUT) e todos os outros pinos de sinal são entradas. Uma barra superior (~{R}), um#final ou_N, ou uma forma de pino invertida torna o pino ativo baixo. - Qualquer outra peça é um erro que a nomeia, a menos que esteja em
ignoreou tenha um modelo[[parts]].
Tempo de família, a partir das letras de família após 74 (atraso de propagação, setup, hold, e recuperação e remoção de um set ou reset assíncrono):
| Família | Atraso | Setup | Hold | Recuperação | Remoção |
|---|---|---|---|---|---|
| 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 simples | 15 ns | 20 ns | 5 ns | 25 ns | 3 ns |
| outros | 10 ns | 10 ns | 2 ns | 10 ns | 2 ns |
Recuperação e remoção são mínimos de folha de dados entre -40 e 85 C a 4.5 V (famílias de 5 V) ou 3.3 V (LVC), o maior entre TI e Nexperia quando ambas listam um:
- HC, HCT: 8 ns trec de
nSD,nRDparanCP, Nexperia 74HC_HCT74 rev 9 (TI SN74HC74 SCLS094F dá 6 ns, TI CD74HC74 SCHS124E 8 ns, chamado trem lá). - AHC, AHCT: 3.5 ns trec de
nRDparanCPpara o 74AHCT74 (3.0 ns para o 74AHC74), Nexperia 74AHC_AHCT74 rev 11 (TI SN74AHC74 SCLS255N dá 3 ns). - AC, ACT: 2.4 ns trec a 5 V, TI CD74AC74 SCHS231E e CD74ACT74 SCHS321A (TI SN74AC74 SCAS521H dá 0).
- LVC: 2 ns setup de
PREouCLRinativo antes deCLK, TI SN74LVC74A SCAS287W (Nexperia 74LVC74A dá 1.0 ns). - LS: 25 ns setup de
CLRinativo e 3 ns hold em qualquer entrada, TI SN74LS161A SDLS060 (o SN74LS74A em SDLS119 lista nenhum dos dois).
Nenhuma das folhas de dados CMOS acima (nem TI SN74HC161 SCLS297D ou Nexperia 74LVC161, cujo hold cobre apenas as entradas síncronas) lista um tempo de remoção, pelo que é 0 lá. As linhas AUP, LV, LVX e outras tomam o seu setup e hold.
Primitivas por nome e símbolos genéricos tomam 1 ns e sem setup ou hold.
Uma peça personalizada recebe um modelo inline, correspondido por ref ou por value (todas as peças com esse valor). Várias entradas para uma peça adicionam uma célula cada (uma por porta de um quad, por exemplo). Uma entrada com apenas tempo mantém o modelo embutido e altera o seu tempo.
[[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 xChaves de pinos de primitiva (entradas, depois saídas); acrescentar _N a uma chave para um pino ativo baixo ou uma saída invertida, e omitir uma entrada opcional para a manter inativa:
| Primitiva | Entradas | Saídas |
|---|---|---|
and, or, xor, nand, nor, xnor | qualquer chave exceto Y | Y |
not, buf | uma chave | Y |
qualquer porta com _od (nand_od, not_od, buf_od) | como a porta | Y, dreno aberto: 0 ou z |
tri | A, OE | Y (z quando OE está baixo) |
dff | D, CLK, opcional S, R, OE | Q, QN (z quando OE está baixo) |
jk | J, K, CLK, opcional S, R | Q, QN |
sr | S, R | Q, QN |
dlatch | D, EN, opcional R, OE | Q, QN (z quando OE está baixo) |
xcvr | A, B, DIR, opcional OE | A, B: os mesmos pinos, conduzidos a partir do outro lado por DIR |
mux2 | I0, I1, S, opcional EN | Y |
dec138 | A0, A1, A2, E1, E2, E3 | Y0 a Y7 |
counter161, counter163 | opcional R, CLK, opcional D0 a D3, CEP, LOAD, CET | Q0 a Q3, TC |
shift164 | A, opcional B, CLK, opcional R | Q0 a Q7 |
shift595 | D, CLK, LATCH, opcional R, OE | Q0 a Q7, QS |
Os flip-flops são relógios na borda de subida (a chave CLK_N para a de descida); S e R são assíncronos e, se ambos estiverem ativos, resultam em Q = QN = 1, tal como num 74HC74. O 161 reinicia de imediato, o 163 na próxima borda. Um 595 desloca em CLK, copia para as suas saídas em LATCH (o valor de antes de uma deslocação no mesmo instante) e deixa-as flutuantes enquanto OE está baixo.
O motor mantém quatro níveis: 0, 1, x (desconhecido) e z (flutuante). Cada rede resolve os seus condutores: condutores fortes (saídas, trilhos, estímulos) que concordam definem o nível; 0 contra 1 dá x e uma contensão reportada; e os resistores de arrasto só contam quando não há condutor forte ativo. Uma entrada z lê-se como x. As portas só passam para x quando a entrada desconhecida é relevante (0 numa AND é 0), e um flip-flop relógio por uma borda incerta (0 para x, ou x para 1) passa para x, a menos que mantenha o seu valor. Cada saída tem o seu próprio atraso (de transporte, por isso pulsos mais curtos que o atraso passam); os eventos correm em ordem temporal, e as mudanças com atraso zero assentam em ciclos delta no mesmo instante. Um laço de atraso zero que ainda estiver a mudar após 1000 ciclos delta para a execução e reporta as redes, tal como uma execução que ultrapasse 50 milhões de eventos.
Flip-flops, contadores e registos de deslocação verificam setup e hold nas suas entradas relógio em relação à temporização do modelo: uma entrada de dados que mudou menos de setup antes de uma borda de subida do relógio, ou menos de hold depois dela, é uma violação (não verificado enquanto um reset ou set assíncrono está ativo). Um latch D verifica o seu D em relação à borda de fecho (descida) de EN da mesma forma. Um reset ou set assíncrono libertado menos de recovery antes de uma borda de relógio, ou menos de removal depois dela, também é uma violação, com a recuperação e remoção da tabela da família. Um 595 também exige que a sua borda de subida de LATCH (RCLK) esteja pelo menos setup depois da última borda de subida de CLK (SRCLK); os dois relógios ligados juntos (no mesmo instante) está bem e retém o valor de antes da deslocação.
Numa violação, o flip-flop, latch ou rego coberto pela verificação passa para x, tal como os modelos Verilog fazem com os seus notificadores, até ser relógio, set ou reset limpo novamente. Defina on_violation = "keep" na simulação para reportar a violação e manter o valor amostrado em vez disso.
Leituras: asserções passadas e falhadas, contenções, violações de temporização, células e eventos. A verificação lista cada asserção falhada, contensão, violação de temporização ou execução parada como um erro na simulação, enquanto o resultado está atual. O resultado fica desatualizado quando a especificação ou a lista de redes do esquema muda. examples/logic contém dois: counter, um 74HC161 a contar para um 74HC138, e i2c, um barramento open-drain onde um controlador (dois 74LVC1G07) e um alvo (um 74LVC1G06 a puxar SDA para baixo para o seu ACK) partilham arrastos de 4,7k, e um 74HC595 relógio por SCL captura o byte, verificado para START, os bits, o ACK, o byte (um barramento record) e STOP.