用Python给Verilog设计自仿(二):用D触发器解锁自动化验证的「第一个波形」

1前言

对于许多FPGA/IC工程师而言,设计实现游刃有余,验证仿真却常成短板------传统验证方法面临两难困局:学习UVM需投入大量时间成本,而纯Verilog自仿又会陷入重复造轮子的低效循环。以通信协议仿真为例,仅报文解析就需要重写整套解析逻辑,相当于用Verilog再实现一次协议栈,耗时费力。

此时,Python的生态优势便锋芒尽显。其丰富的字符串处理库可直接解析报文,配合Cocotb框架,仅需少量Python代码即可构建高效测试平台,将验证工作量压缩70%以上。Cocotb的独特价值正在于此:用Python解放验证生产力,让工程师专注于设计创新而非重复劳动。

2MakeFile

为构建高度集成的自动化验证环境,我在Cocotb原生Makefile基础上深度定制,打通了Cocotb仿真控制→VCS编译仿真(包括Vivado IP)→Verdi波形调试的端到端流水线。通过统一的任务入口(make all/make all),开发者可一键完成从RTL编译、测试用例执行到覆盖率报告生成的完整流程。下方开源的Makefile模板已封装多工具协同的核心配置,若采用类似仿真架构,可直接克隆适配至实际项目。

如果想参考本文全套代码,可通过附录A获取。

2D触发器测试代码实现

在完成顶层模块后,我们可以再封装一层 tb_top.sv。虽然使用 cocotb 时,Python 文件即为我们的 testbench,但额外添加 tb_top.sv 可以引入更多辅助信息,如用于生成 FSDB 波形的 dump 代码,甚至可以插入计数器等调试信息,方便定位问题。

arduino 复制代码
// This file is public domain, it can be freely copied without restrictions.
// SPDX-License-Identifier: CC0-1.0
// `timescale 1us/1us
module dff (
    input logic clk, d, rst_n,
    output logic q
);
always @(posedge clk or negedge rst_n) begin
    if(!rst_n)
        q <= 0;
    else
        q <= d;
end
logic [31:0] cnt;
always @(posedge clk or negedge rst_n)begin
    if(!rst_n)
        cnt <= 'd0;
    else
        cnt <= cnt + 1'b1;
end
endmodule
ruby 复制代码
//tb_top.sv
`timescale 1ns/1ns
module tb_top;
logic clk, d, rst_n;
logic q;
dff u_dff(
    .clk    ( clk   ),
    .d      ( d     ),
    .rst_n  ( rst_n ),
    .q      ( q     )
);
initial begin
    $fsdbDumpfile("tb_top.fsdb");
    $fsdbDumpvars(0, tb_top,"+all");
end
endmodule

3Cocotb

我们定义了一些通用工具函数(轮子),如时钟生成函数、复位函数等,这些可以在其他测试中直接复用。

通过 @cocotb.test() 装饰器,我们定义了一个测试用例。

使用 cocotb.start() 启动了一个时钟协程,从而持续产生时钟信号。

初始化输入端口,访问 Verilog 信号的方法是 dut.信号.value,其中 dut 对应 tb_top,value 是 cocotb 中用于设置或获取信号值的参数。

嵌入复位函数,等待复位完成后,即可开始对 D 触发器进行测试。

测试中使用 assert 语句检查 D 触发器的输出是否符合预期,若不符合,测试用例会终止仿真并在终端输出错误信息。

4开始仿真

输入make/make all即可,仿真完成后,可通过make verdi打开波形

或者输入make allv,仿真完成自动打开verdi波形

可以看到case顺利通过

5写在最后

写在这里,我有一个大胆的想法,当前AI在硬件描述语言(如Verilog)生成上仍显稚嫩,但其在Python代码创作领域已展现出惊人潜力------若将大模型与Cocotb框架深度结合,让工程师用自然语言描述测试场景(如"对AXI总线发起100次随机读写"),由AI如DeepSeek等大语言模型自动生成Python测试脚本、断言规则甚至覆盖率收集逻辑,或许能颠覆传统验证模式:开发者无需逐行编写激励代码,转而聚焦于验证策略制定与边界条件定义,使验证周期大幅压缩,这既是AI+EDA的技术奇点,更是破解芯片验证"时间墙"的革命性路径。对此你怎么想呢?

本文为原创Cocotb技术专栏,欢迎工程师伙伴们留言讨论或交流,共同学习。若想第一时间获取更新,可点击下方「关注」或订阅Cocotb专题。

往期回顾

deepseek本地部署最简教程

用Python给Verilog设计自仿(一):Cocotb环境初探

DeepSeek本地部署最简教程------零成本搭建AI代码编辑器

FPGA实现DeepSeek加速卡可行性探讨

以太网------网络包解析器设计概述(2)(Packet Parsers)

附录A

关注公众号后后台回复「cocotb」,即可获得全套参考代码

本文由本账号所属公众号提供,欢迎关注微信公众号 AdirtCoreFpga ,获取第一时间更新

相关推荐
草梅友仁7 小时前
草梅 Auth 1.1.0 发布与最新动态 | 2025 年第 30 周草梅周报
开源·github·ai编程
mortimer8 小时前
安装NVIDIA Parakeet时,我遇到的两个Pip“小插曲”
python·github
心之语歌11 小时前
Spring AI MCP 客户端
人工智能·spring·github
yeshan33313 小时前
使用 Claude Code 的自定义 Sub Agent 完善博文写作体验
ai·github·agent·claudecode
程序视点14 小时前
望言OCR 2025终极评测:免费版VS专业版全方位对比(含免费下载)
前端·后端·github
玩个冰球15 小时前
Stata 18下载安装教程(非常详细),看完这一篇就够了(附安装包)
github
Xi_Xu15 小时前
Xget:下一代开源资源获取加速引擎,让你的文件下载、储存库克隆和镜像拉取快如闪电
开源·github
用户40993225021217 小时前
FastAPI的查询白名单和安全沙箱机制如何确保你的API坚不可摧?
前端·后端·github
计算机毕设定制辅导-无忧学长20 小时前
InfluxDB Flux 查询协议实战应用(二)
github
黄团团1 天前
SpringBoot连接Sftp服务器实现文件上传/下载(亲测可用)
服务器·spring boot·github