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

相关推荐
Timbo2号22 分钟前
OpenAI API调用实战:跨境支付验证的技术解决方案
人工智能·github
Hamm1 小时前
咦,你的Git仓库贡献者里怎么有这么多大佬???
前端·git·github
uhakadotcom3 小时前
ClickHouse入门:快速掌握高性能数据分析
后端·面试·github
uhakadotcom3 小时前
Pydantic Extra Types:扩展数据类型的强大工具
后端·面试·github
uhakadotcom3 小时前
Spring Fu:让Spring Boot启动提速40%的黑科技
后端·面试·github
uhakadotcom3 小时前
Tianshou:一个强大的 PyTorch 强化学习库
后端·面试·github
小华同学ai4 小时前
7.9K star!跨平台开发从未如此简单,这个开源框架让APP开发效率飙升!
前端·后端·github
梓羽玩Python4 小时前
太酷了!刚刚开源的网页自动化神器,OpenAI Operator瞬间不香了!
github
AmazingKO6 小时前
【够用就好008】开新坑自学esb32烧录进军物联网和嵌入式
人工智能·python·物联网·chatgpt·github·方方上土·aigc创意人竹相左边
uhakadotcom7 小时前
Supabase数据库性能优化全攻略:从慢查询到闪电响应的实战技巧
后端·面试·github