推荐一个 Python 顺序逻辑仿真库:SeqiLog

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‾‾‾‾‾‾‾‾\_____/‾‾‾‾‾\_____/‾‾‾‾‾\_____/‾‾‾‾‾\_____/‾‾‾

---------+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+

更多示例代码请查看项目中的ipynbtests目录。

安装方法:
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