用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 ,获取第一时间更新

相关推荐
jump_jump3 小时前
为了重玩金庸群侠传,我研究了一下 Ruffle 怎么复活 Flash
游戏·rust·github
LinXunFeng15 小时前
Obsidian - 使用 Share Note 分享笔记并自部署
前端·笔记·github
DayDaydream19 小时前
7 天涨了 8000+ Star,Agent Reach 想给 AI 装上互联网眼睛
github
天衍四九2 天前
Git从0到实战(四):冲突解决与版本回退 —— 别怕,出错了也能救
github
大刚测试开发实战2 天前
如何内网穿透访问本地私有化部署的TestHub
前端·后端·github
uhakadotcom3 天前
在python 的 工程化架构中 ,什么是 薄包装器层?
后端·面试·github
Avan_菜菜3 天前
AI 能写代码了,为什么我反而开始要求它先写文档?
前端·github·ai编程
逛逛GitHub4 天前
这个爆红的 GitHub 项目让 token 直接省 60–95%。
github
iccb10134 天前
5年,一个程序员是如何把私有化在线客服系统做到第一名的
前端·后端·github
蝎子莱莱爱打怪4 天前
AI Agent 相关知识扫盲:16 个概念+11张图+38个开源项目推荐
人工智能·github·agent