数字IC验证中,使用Python搭建简易的参考模型(Reference Model)来比对DUT输出,有哪些高效的库和框架推荐?

开放6 回答 92 浏览

在做一个中小规模的数字模块验证,暂时还不想上UVM那么重的框架。想用Python写一个参考模型,在测试平台中自动比对DUT的输出。请问除了用列表和循环这种最基础的方式,有没有一些好用的Python库(比如cocotb?但好像更偏向于协同仿真)、数据比对方法或者轻量级框架可以推荐?如何组织代码才能让这个参考模型易于维护和复用?

分享:
  • Verilog小白2024

    我最近也在用Python做验证模型,感觉最直接好用的就是numpy和pandas。

    如果你要处理的数据是数组或者矩阵形式的,比如图像处理模块、DSP模块的输出,用numpy做向量化比对速度会快很多。不用自己写循环,一行代码就能搞定整个数组的对比,还能直接算出误差范围。

    pandas适合处理表格化的数据,比如通信协议的解包后的数据包,你可以把DUT输出和参考模型输出都转成DataFrame,然后用pandas的compare功能或者直接相减,能清晰看到哪些位置不匹配。

    代码组织上,建议把参考模型封装成一个类,输入输出接口定义清楚。比对逻辑单独写一个函数,这样以后换不同的比对精度或者规则都很方便。

  • Verilog练习生

    cocotb其实可以用的,虽然它主要用来和仿真器协同,但它的协程机制很适合处理时序相关的比对。

    比如你的DUT输出是流式的,带有时钟周期,用cocotb写一个scoreboard(记分板)来收集DUT的输出,同时用Python写的参考模型也按节拍生成数据,在cocotb的testbench里做实时比对。这样比等仿真结束再统一比对更接近真实验证场景。

    另外可以看看PyUVM,它是UVM的Python实现,比SystemVerilog的UVM轻量。如果你以后可能过渡到更正式的验证方法学,现在用PyUVM搭个简单环境,学习曲线平缓些。

    避免把参考模型和测试激励硬编码在一起,用配置文件驱动模型参数是个好习惯。

  • FPGA入门生

    从维护性角度,我推荐用Python的unittest或pytest框架来组织你的测试和比对。

    把参考模型当作一个独立的模块,每个测试用例里实例化它,调用它的predict方法得到预期输出。比对部分可以做成一个通用的checker函数,用assert语句判断是否匹配,这样测试失败时框架会给出清晰报告。

    对于数据比对,如果只是简单标量,直接==或numpy.allclose就行。复杂数据结构可以用Python的deepdiff库,它能递归比较字典、列表等,并给出具体差异详情,调试时非常省心。

    注意模型和DUT的接口时序可能要对齐,比如DUT有延迟,参考模型输出可能要shift一下再比。建议把这种对齐逻辑抽象出来,不要散落在各处。

  • 电路仿真新手

    我最近也在用Python做参考模型,感觉最实用的还是numpy和pandas。如果你处理的是一些数据流或者数组类的输出,numpy的数组操作和比较效率比纯Python循环高太多了。比如你可以把DUT输出和参考模型输出都转成numpy array,然后用np.array_equal或者np.allclose(带误差比较)来比对,一行代码搞定。pandas适合处理表格化的数据,比如带时间戳的序列。代码组织上,建议把参考模型封装成一个类,输入输出接口定义清楚,比对逻辑单独写一个函数或者方法。这样以后模块升级,改起来也方便。

    注意别在比对函数里写太多打印,数据量大时会影响速度。可以加一个verbose开关控制日志。

  • 电子技术萌新

    cocotb其实可以用的,虽然它主要用来和仿真器协同,但它的异步协程机制用来组织测试场景很方便。你可以用纯Python写参考模型,用cocotb的协程去等待DUT信号,然后调用模型计算预期值,再比对。库方面,除了楼上说的,对于复杂数据结构,可以用Python自带的difflib做差异对比,输出更友好。另外,建议一定要把参考模型和测试平台解耦。模型只负责算法逻辑,输入从文件或者测试平台喂进去,输出到一个标准格式(比如字典或dataclass),然后由专门的比对器去处理。这样模型可以单独测试,复用性也好。

    一个小坑:注意仿真时间单位和Python时间模型的同步,避免因为时间不同步导致比对失败。

  • 芯片设计预备役

    轻量级的话,可以看看VUnit的Python接口(虽然VUnit本身是VHDL/SystemVerilog的),它支持用Python做验证。或者自己搭一个简单的框架:用logging管理日志,用unittest或pytest组织测试用例,参考模型就用普通Python类实现。比对方法上,对于非数字信号(比如状态机输出),可以用字典映射预期值,然后用assert直接比。关键是要把测试向量和模型参数化,比如用JSON或YAML文件配置,这样改测试不用动代码。

    维护性方面,一定要写文档说明模型的算法假设和接口。另外,建议加一个随机测试生成和自检循环,用模型自己验证自己的一致性(比如用对称操作),能提前发现模型自己的bug。别让参考模型变得和DUT一样复杂,那就本末倒置了。

登录后可在本页底部提交回答

提问者

FPGA萌新上路查看主页

描述场景与已尝试方案,更容易获得有效解答

浏览「其他」

相关问题

同分类问答

提问建议

  • 标题写清核心疑问,避免「求助」「请问」等空泛用语
  • 正文补充环境、版本、报错信息或截图
  • 先搜索本站是否已有相近问题,减少重复提问
  • 若与课程相关,请标明课时或章节便于讲师定位

技术问答

问完之后的闭环

  • 关联课程精学高频问题往往对应章节,建议回到课程补基础。
  • 产出与互助解决过程可写成笔记,帮助后续同学。

探索全站