SeqiLog
(发音为”seh-kwi-log”)是一个用于逻辑设计和验证的 Python 库。
主要特点: SeqiLog
提供了在寄存器传输级(RTL)层面进行硬件仿真的基础构建模块:
- 支持层次化、参数化的
Module
设计元素 - 提供四值
bits
多维数组数据类型 - 使用
async/await
语法实现离散事件仿真
设计理念:
- 声明式设计:设计者只需要关注”要声明什么”组件,而不用过多考虑它们如何与任务调度算法交互
- 严格的类型检查:当参数类型不一致时,函数会抛出异常;未初始化或亚稳态的状态会始终按最保守的方式传播
- Python风格的接口:这是一次创建 Python 风格的元硬件描述语言(HDL)的尝试。目前该项目仍在开发中,API可能会不定期发生变化
使用示例: 下面的代码实现了一个D触发器(DFF),其D输入连接到Q输出的反相值。
from vcd import VCDWriter
from seqlogic import Module, Vec, run, sleep
async def drv_clock(y):
"""Positive clock w/ no phase shift, period T=2, 50% duty cycle."""
while True:
y.next = "1b1"
await sleep(1)
y.next = "1b0"
await sleep(1)
async def drv_reset(y):
"""Positive reset asserting from T=[1..2]"""
y.next = "1b0"
await sleep(1)
y.next = "1b1"
await sleep(1)
y.next = "1b0"
class Top(Module):
"""Data flip flop (DFF) Example"""
def build(self):
clk = self.logic(name="clk", dtype=Vec[1])
rst = self.logic(name="rst", dtype=Vec[1])
q = self.logic(name="q", dtype=Vec[1])
d = self.logic(name="d", dtype=Vec[1])
# d = NOT(q)
self.expr(d, ~q)
# DFF w/ async positive (active high) reset, reset to 0
self.dff_r(q, d, clk, rst, rval="1b0")
# Clock/Reset
self.drv(drv_clock(clk))
self.drv(drv_reset(rst))
# Run simulation w/ VCD dump enabled
with (
open("dff.vcd", "w") as f,
VCDWriter(f, timescale="1ns") as vcdw,
):
top = Top(name="top")
top.dump_vcd(vcdw, ".*")
run(top.elab(), ticks=20)
波形查看:
你可以使用 GTKWave 或 Surfer 查看生成的 VCD 波形文件,波形图应该如下所示:
T (ns) 0 1 2 3 4 5 6 7 8 9 ...
---------+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
clk /‾‾\__/‾‾\__/‾‾\__/‾‾\__/‾‾\__/‾‾\__/‾‾\__/‾‾\__/‾‾\__/‾‾\
rst ___/‾‾\___________________________________________________
q XXXX________/‾‾‾‾‾\_____/‾‾‾‾‾\_____/‾‾‾‾‾\_____/‾‾‾‾‾\___
d XXXX‾‾‾‾‾‾‾‾\_____/‾‾‾‾‾\_____/‾‾‾‾‾\_____/‾‾‾‾‾\_____/‾‾‾
---------+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
更多示例代码请查看项目中的ipynb
和tests
目录。
安装方法:
SeqiLog 已发布在 PyPI 上,可以通过 pip 直接安装:
$ pip install seqlogic
支持 Python 3.12 及以上版本。
开发相关: SeqiLog 的代码托管在 GitHub 上:
$ git clone https://github.com/cjdrake/seqlogic.git
运行依赖项列在requirements.txt
文件中,开发依赖项列在requirements-dev.txt
文件中。
这个库特别适合需要进行数字逻辑设计和仿真的工程师使用,尤其是那些习惯使用 Python 进行开发的人。它提供了一个现代化的接口来描述和验证数字电路,使得硬件设计过程更加直观和高效。
github 地址:https://github.com/cjdrake/seqlogic
#Python