agentee

Simular

Simulação lógica

Simular as partes digitais de um esquema diretamente a partir do seu netlist: modelos da série 74, estímulo, asserções, verificações de setup e hold, e uma saída VCD.

Uma simulação lógica executa as partes digitais de um esquema diretamente a partir da sua lista de redes. Não é necessário layout, por isso encaixa-se cedo num projeto: verifique que um contador conta, um decodificador decodifica e um barramento open-drain reconhece, antes de qualquer coisa ser posicionada.

Iniciar uma

agentee new sim counter --kind logic

O inicializador tem um relógio, um reset e uma asserção sincronizada para renomear para as suas redes. O exemplo de lógica contém dois finalizados. Este é o counter, um 74HC161 a contar um relógio de 10 MHz para um 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

A execução escreve um resultado e uma forma de onda VCD ao lado da especificação, que qualquer visualizador de formas de onda abre.

Formas de onda da simulação do contador

Estímulo

  • Um clock está baixo até phase, depois alto durante duty de cada period.
  • steps são pares [time, level] em ordem temporal, com níveis 0, 1, "x" e "z".
  • constant mantém uma rede num nível.

Um estímulo conduz a sua rede como um condutor forte; numa rede de alimentação, substitui o trilho.

Asserções

  • at lê uma rede ou um barramento uma vez que tudo nesse tempo se estabilizou.
  • Uma sequence lê as redes pouco antes de cada flanco limpo de um relógio, por isso uma saída registada é vista como estava quando o flanco chegou. O from salta os flancos anteriores a ele.
  • Um valor de barramento é um número ou uma string de 0, 1, x, z e - para qualquer, MSB primeiro.

A verificação lista cada asserção falhada, conflito ou violação de temporização como um erro na simulação, enquanto o resultado está atualizado.

O que se torna uma célula

  • Redes de alimentação e símbolos de alimentação são fontes constantes: nomes GND, VSS, VEE e 0V são 0, qualquer outro é 1.
  • Resistores de 0 ohm, jumpers e ligações de rede unem as suas redes. Um resistor de um trilho para uma rede é um pull-up ou pull-down, um condutor fraco.
  • Condensadores, indutores, diodos, LEDs, pontos de teste, cristais e semelhantes ficam de fora.
  • Peças cujo valor ou nome de símbolo contém um número da série 74 recebem um modelo incorporado por número de pin: 74HC00, SN74LVC1G08DBVR e CD74HCT04E correspondem todos. A biblioteca cobre as portas comuns, flip-flops, latches, buffers, o decodificador 138, os contadores 161 e 163, os registos de deslocamento 164 e 595 e as peças LVC de porta única e dupla. As peças com saída em dreno aberto puxam para baixo ou libertam.
  • Uma peça cujo valor ou símbolo é um nome primitivo (NAND, DFF, MUX2, ...) mapeia os seus pins por nome.
  • Qualquer outra peça é um erro que a nomeia, a menos que esteja em ignore ou tenha um modelo [[parts]].

As letras da família definem o timing: HC tem atraso de 10 ns e setup de 15 ns, LVC 4 ns e 3 ns, LS 15 ns e 20 ns, com recovery e removal extraídos de folhas de dados da TI e da Nexperia. A referência de lógica tem a tabela completa e as suas fontes.

Modelos próprios

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

Uma peça recebe uma primitiva com os seus pins mapeados, um pinout de biblioteca emprestado com primitive = "74HC244", ou uma tabela de verdade cuja primeira linha correspondente vence.

Violações de timing

Flip-flops, contadores e registos de deslocamento verificam setup e hold nas suas entradas relógio, e recovery e removal nos seus resets assíncronos. Numa violação, a célula passa para x, como fazem os modelos Verilog, até ser relógio ou reset limpo novamente. on_violation = "keep" reporta a violação e mantém o valor amostrado em vez disso.

O motor mantém quatro níveis, 0, 1, x e z. Impulsionadores fortes que discordam dão x e uma contenção; puxadas contam apenas quando nenhum impulsionador forte está ativo. Uma porta passa para x apenas quando a entrada desconhecida importa, por isso 0 numa AND continua a ser 0.

Numa interface

Uma simulação de lógica pode ser uma medição de uma interface, que então falha a verificação enquanto a simulação tem uma falha:

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

Melhorar este guia · Markdown para agentes