用Python給Verilog設(shè)計(jì)自仿(二):用D觸發(fā)器解鎖自動(dòng)化驗(yàn)證的「第一個(gè)波形」
掃描二維碼
隨時(shí)隨地手機(jī)看文章
1前言
對(duì)于許多FPGA/IC工程師而言,設(shè)計(jì)實(shí)現(xiàn)游刃有余,驗(yàn)證仿真卻常成短板——傳統(tǒng)驗(yàn)證方法面臨兩難困局:學(xué)習(xí)UVM需投入大量時(shí)間成本,而純Verilog自仿又會(huì)陷入重復(fù)造輪子的低效循環(huán)。以通信協(xié)議仿真為例,僅報(bào)文解析就需要重寫(xiě)整套解析邏輯,相當(dāng)于用Verilog再實(shí)現(xiàn)一次協(xié)議棧,耗時(shí)費(fèi)力。
此時(shí),Python的生態(tài)優(yōu)勢(shì)便鋒芒盡顯。其豐富的字符串處理庫(kù)可直接解析報(bào)文,配合Cocotb框架,僅需少量Python代碼即可構(gòu)建高效測(cè)試平臺(tái),將驗(yàn)證工作量壓縮70%以上。Cocotb的獨(dú)特價(jià)值正在于此:用Python解放驗(yàn)證生產(chǎn)力,讓工程師專注于設(shè)計(jì)創(chuàng)新而非重復(fù)勞動(dòng)。
2MakeFile
為構(gòu)建高度集成的自動(dòng)化驗(yàn)證環(huán)境,我在Cocotb原生Makefile基礎(chǔ)上深度定制,打通了Cocotb仿真控制→VCS編譯仿真(包括Vivado IP)→Verdi波形調(diào)試的端到端流水線。通過(guò)統(tǒng)一的任務(wù)入口(make all/make all),開(kāi)發(fā)者可一鍵完成從RTL編譯、測(cè)試用例執(zhí)行到覆蓋率報(bào)告生成的完整流程。下方開(kāi)源的Makefile模板已封裝多工具協(xié)同的核心配置,若采用類似仿真架構(gòu),可直接克隆適配至實(shí)際項(xiàng)目。
如果想?yún)⒖急疚娜状a,可通過(guò)附錄A獲取。
2D觸發(fā)器測(cè)試代碼實(shí)現(xiàn)
在完成頂層模塊后,我們可以再封裝一層 tb_top.sv。雖然使用 cocotb 時(shí),Python 文件即為我們的 testbench,但額外添加 tb_top.sv 可以引入更多輔助信息,如用于生成 FSDB 波形的 dump 代碼,甚至可以插入計(jì)數(shù)器等調(diào)試信息,方便定位問(wèn)題。
// This file is public domain, it can be freely copied without restrictions.// SPDX-License-Identifier: CC0-1.0// `timescale 1us/1usmodule 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;endlogic [31:0] cnt;always @(posedge clk or negedge rst_n)begin if(!rst_n) cnt <= 'd0; else cnt <= cnt + 1'b1;endendmodule
//tb_top.sv`timescale 1ns/1nsmodule 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");endendmodule
3Cocotb
我們定義了一些通用工具函數(shù)(輪子),如時(shí)鐘生成函數(shù)、復(fù)位函數(shù)等,這些可以在其他測(cè)試中直接復(fù)用。
通過(guò) @cocotb.test() 裝飾器,我們定義了一個(gè)測(cè)試用例。
使用 cocotb.start() 啟動(dòng)了一個(gè)時(shí)鐘協(xié)程,從而持續(xù)產(chǎn)生時(shí)鐘信號(hào)。
初始化輸入端口,訪問(wèn) Verilog 信號(hào)的方法是 dut.信號(hào).value,其中 dut 對(duì)應(yīng) tb_top,value 是 cocotb 中用于設(shè)置或獲取信號(hào)值的參數(shù)。
嵌入復(fù)位函數(shù),等待復(fù)位完成后,即可開(kāi)始對(duì) D 觸發(fā)器進(jìn)行測(cè)試。
測(cè)試中使用 assert 語(yǔ)句檢查 D 觸發(fā)器的輸出是否符合預(yù)期,若不符合,測(cè)試用例會(huì)終止仿真并在終端輸出錯(cuò)誤信息。
4開(kāi)始仿真
輸入make/make all即可,仿真完成后,可通過(guò)make verdi打開(kāi)波形
或者輸入make allv,仿真完成自動(dòng)打開(kāi)verdi波形
可以看到case順利通過(guò)
5寫(xiě)在最后
寫(xiě)在這里,我有一個(gè)大膽的想法,當(dāng)前AI在硬件描述語(yǔ)言(如Verilog)生成上仍顯稚嫩,但其在Python代碼創(chuàng)作領(lǐng)域已展現(xiàn)出驚人潛力——若將大模型與Cocotb框架深度結(jié)合,讓工程師用自然語(yǔ)言描述測(cè)試場(chǎng)景(如“對(duì)AXI總線發(fā)起100次隨機(jī)讀寫(xiě)”),由AI如DeepSeek等大語(yǔ)言模型自動(dòng)生成Python測(cè)試腳本、斷言規(guī)則甚至覆蓋率收集邏輯,或許能顛覆傳統(tǒng)驗(yàn)證模式:開(kāi)發(fā)者無(wú)需逐行編寫(xiě)激勵(lì)代碼,轉(zhuǎn)而聚焦于驗(yàn)證策略制定與邊界條件定義,使驗(yàn)證周期大幅壓縮,這既是AI+EDA的技術(shù)奇點(diǎn),更是破解芯片驗(yàn)證“時(shí)間墻”的革命性路徑。對(duì)此你怎么想呢?





