agentee

仿真

逻辑仿真

直接从原理图网表仿真数字部分:74 系列模型、激励、断言、建立和保持时间检查,以及 VCD 输出。

逻辑仿真直接从原理图的网表运行数字部分。不需要 PCB 布局,因此适合在设计早期使用:在放置任何东西之前,检查计数器是否计数、解码器是否解码以及开漏总线是否确认。

开始一个

agentee new sim counter --kind logic

起始模板有一个时钟、一个复位和一个带时钟的断言,可重命名为你的网络。逻辑示例 包含两个完成的模板。这是 counter,一个 74HC161 将 10 MHz 时钟计数到 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

运行会在规范旁边写入结果和 VCD 波形,任何波形查看器都可以打开。

计数器仿真的波形

激励

  • clock 在 phase 之前为低,然后在每个 period 的 duty 时间内为高。
  • steps 是按时间顺序排列的 [time, level] 对,电平为 0、1、"x" 和 "z"。
  • constant 将网络保持在一个电平。

激励作为强驱动器驱动其网络;在电源网络上,它替换电源轨。

断言

  • at 在该时间的所有事情稳定后读取一次网络或总线。
  • sequence 在时钟的每个干净边沿之前读取网络,因此寄存器输出在边沿到来时被视为其当时的值。from 跳过它之前的边沿。
  • 总线值是一个数字或一个由 0、1、x、z 和 -(任意)组成的字符串,最高位在前。

检查将每个失败的断言、竞争或时序违规作为仿真上的错误列出,只要结果是当前的。

什么变成单元

  • 电源网络和电源符号是恒定源:GND、VSS、VEE 和 0V 名称为 0,其他任何名称为 1。
  • 0 欧姆电阻、跳线和网络连接将它们的网络合并。从电源轨到网络的电阻是上拉或下拉,一个弱驱动器。
  • 电容、电感、二极管、发光二极管、测试点、晶振等元件不在其中。
  • 数值或符号名称中包含 74 系列编号的元件会按引脚编号匹配内置模型:74HC00、SN74LVC1G08DBVR 和 CD74HCT04E 都能匹配。库涵盖常用门电路、触发器、锁存器、缓冲器、138 译码器、161 和 163 计数器、164 和 595 移位寄存器,以及单门和双门 LVC 器件。开漏器件会拉低电平或释放总线。
  • 数值或符号为原语名称(NAND、DFF、MUX2 等)的元件会按名称映射引脚。
  • 其他任何元件都会报错并指明名称,除非它在 ignore 中,或者拥有 [[parts]] 模型。

系列字母决定时序:HC 为 10 ns 延迟和 15 ns 建立时间,LVC 为 4 ns 和 3 ns,LS 为 15 ns 和 20 ns,恢复时间和移除时间取自 TI 和 Nexperia 的数据手册。逻辑参考 包含完整表格及其来源。

自定义模型

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

元件可以映射引脚的原语、通过 primitive = "74HC244" 借用的库引脚图,或真值表(第一行匹配即生效)。

时序违规

触发器、计数器和移位寄存器会检查时钟输入的建立时间和保持时间,以及异步复位输入的恢复时间和移除时间。发生违规时,单元变为 x,与 Verilog 模型一致,直到再次干净地时钟或复位。on_violation = "keep" 会报告违规并保留采样值。

引擎保持四个电平:0、1、x 和 z。相互冲突的强驱动会产生 x 和竞争;上拉仅在无强驱动时生效。只有当未知输入有影响时,门电路才会变为 x,因此 AND 门的 0 输入仍为 0。

在接口中

逻辑仿真可以作为接口的测量项,此时若仿真存在失败,检查也会失败:

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

改进此指南 · 面向智能体的 Markdown