FPGA线上课程平台|最全栈的FPGA学习平台|FPGA工程师认证培训
登录
首页-所有问题-其他-正文

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

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

FPGA萌新上路

这家伙真懒,几个字都不愿写!
71801.20K
分享:
现在是大一,该如何规划利用大学的几年时间学习FPGA?上一篇
作为自动化/机械等非电类专业学生,想转行做‘FPGA开发’,该从何学起?需要先补模电数电吗?下一篇
回答列表总数:6
  • 芯片设计预备役

    芯片设计预备役

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

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

    11小时前
  • 电子技术萌新

    电子技术萌新

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

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

    11小时前
  • 电路仿真新手

    电路仿真新手

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

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

    11小时前
  • FPGA入门生

    FPGA入门生

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

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

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

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

    11小时前
  • Verilog练习生

    Verilog练习生

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

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

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

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

    11小时前
  • Verilog小白2024

    Verilog小白2024

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

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

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

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

    11小时前
我要回答answer.notCanPublish
回答被采纳奖励100个积分
FPGA线上课程平台|最全栈的FPGA学习平台|FPGA工程师认证培训
请先登录