news 2026/4/18 10:56:46

cocotb 配合 iverilog 搭建 Verilog 仿真工程

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
cocotb 配合 iverilog 搭建 Verilog 仿真工程

参考

cocotb文档

iverilog 配合 Makefile 搭建 Verilog 仿真工程

ModelSim 配合 Makefile 搭建 Verilog 仿真工程

目录结构

tree /f D:. ├─rtl │ adder.v │ └─sim │ Makefile │ test_adder.py

文件

rtl/adder.v

module adder ( input wire clk, input wire rst, input wire [7:0] a, input wire [7:0] b, output reg [8:0] sum ); always @(posedge clk) begin if (rst) sum <= 9'd0; else sum <= a + b; end endmodule

sim/Makefile

TOPLEVEL_LANG=verilog SIM=icarus TOPLEVEL=adder MODULE=test_adder WAVES=1VERILOG_SOURCES=../rtl/adder.v include$(shell cocotb-config--makefiles)/Makefile.sim .PHONY: wave wave: gtkwave sim_build/adder.fst

sim/test_adder.py

importcocotbfromcocotb.clockimportClockfromcocotb.triggersimportRisingEdge,Timer,ReadOnly,Firstfromcocotb.utilsimportget_sim_time@cocotb.test()asyncdeftest_adder(dut):# =========================================================# 时钟# =========================================================cocotb.start_soon(Clock(dut.clk,10,unit="ns").start())# =========================================================# 信号监视器(输入/输出变化即打印)# =========================================================asyncdefwatch():last=NonewhileTrue:# 等待任一信号变化awaitFirst(dut.rst.value_change,dut.a.value_change,dut.b.value_change,dut.sum.value_change,)# 等下个上升沿awaitRisingEdge(dut.clk)# 进入 ReadOnly,保证值稳定awaitReadOnly()now=(int(dut.rst.value),int(dut.a.value),int(dut.b.value),int(dut.sum.value),)ifnow!=last:t=int(get_sim_time("ns"))# cocotb 2.x 是 float,必须转 intdut._log.info(f"[{t:6d}ns] "f"rst={now[0]}"f"a={now[1]:3d}"f"b={now[2]:3d}"f"sum={now[3]:3d}")last=now cocotb.start_soon(watch())# =========================================================# 复位# =========================================================dut.rst.value=1dut.a.value=0dut.b.value=0# 等20nsawaitTimer(20,"ns")awaitRisingEdge(dut.clk)dut.rst.value=0# =========================================================# 测试向量# =========================================================tests=[(1,2),(10,20),(100,23),(255,1),]fora,bintests:dut.a.value=a dut.b.value=b# a/b 在这一拍被采样awaitRisingEdge(dut.clk)# sum 在下一拍稳定awaitRisingEdge(dut.clk)assertint(dut.sum.value)==a+b,\f"{a}+{b}!={int(dut.sum.value)}"# 再跑一点时间,方便看波形awaitTimer(20,"ns")

命令

安装 Python 依赖

pipinstallcocotb

编译

如果在windows里,下面的命令应在git bash

PC@ming MINGW64 /d/workspace/gitee/0/ming-verilog_prj/ming-verilog/test/proj/sim(master)$makerm-fresults.xml"D:/Program Files (x86)/Dev-Cpp/mingw32/bin/make"-fMakefile results.xml make[1]: Entering directory'D:/workspace/gitee/0/ming-verilog_prj/ming-verilog/test/proj/sim'/d/soft/iverilog/bin/iverilog-osim_build/sim.vvp-sadder-g2012-fsim_build/cmds.f-scocotb_iverilog_dump../rtl/adder.v sim_build/cocotb_iverilog_dump.v D:/soft/Anaconda3/envs/platformio/Lib/site-packages/cocotb_tools/makefiles/simulators/Makefile.icarus:66: Using MODULE is deprecated, please use COCOTB_TEST_MODULES instead.rm-fresults.xmlCOCOTB_TEST_MODULES=test_adderCOCOTB_TESTCASE=COCOTB_TEST_FILTER=COCOTB_TOPLEVEL=adderTOPLEVEL_LANG=verilog\/d/soft/iverilog/bin/vvp-MD:/soft/Anaconda3/envs/platformio/Lib/site-packages/cocotb/libs-mcocotbvpi_icarus sim_build/sim.vvp-fst-.--ns INFO gpi..mbed\gpi_embed.cpp:94in_embed_init_python Using Python3.11.9 interpreter at D:/soft/Anaconda3/envs/platformio/python.exe Could notfindplatform dependent libraries<exec_prefix>-.--ns ERROR gpi..mbed\gpi_embed.cpp:155in_embed_init_python Unexpected sys.executable value(expected'D:/soft/Anaconda3/envs/platformio/python.exe', got'D:\soft\iverilog\bin\vvp.exe')-.--ns INFO gpi..\gpi\GpiCommon.cpp:79ingpi_print_registered_impl VPI registered0.00ns INFO cocotb Running on Icarus Verilog version10.1(stable)0.00ns WARNING gpi vpi_iterate returned NULLfortypevpiInstanceforobject NULL0.00ns INFO cocotb Seeding Python random module with17674921130.00ns INFO cocotb Initialized cocotb v2.0.1 from D:\soft\Anaconda3\envs\platformio\Lib\site-packages\cocotb0.00ns INFO cocotb.regression pytest not found,installit toenablebetter AssertionError messages0.00ns INFO cocotb Running tests0.00ns INFO cocotb.regression running test_adder.test_adder(1/1)FST info: dumpfile sim_build/adder.fst openedforoutput.0.00ns INFO cocotb.adder[0ns]rst=1a=0b=0sum=030.00ns INFO cocotb.adder[30ns]rst=0a=1b=2sum=350.00ns INFO cocotb.adder[50ns]rst=0a=10b=20sum=3070.00ns INFO cocotb.adder[70ns]rst=0a=100b=23sum=12390.00ns INFO cocotb.adder[90ns]rst=0a=255b=1sum=256120.00ns INFO cocotb.regression test_adder.test_adder passed120.00ns INFO cocotb.regression ************************************************************************************** ** TEST STATUS SIM TIME(ns)REAL TIME(s)RATIO(ns/s)** ************************************************************************************** ** test_adder.test_adder PASS120.000.0040012.44** ************************************************************************************** **TESTS=1PASS=1FAIL=0SKIP=0120.000.0120002.24** **************************************************************************************

看波形

$makewave gtkwave sim_build/adder.fst GTKWave Analyzer v3.3.71(w)1999-2016 BSI FSTLOAD|Processing5facs. FSTLOAD|Built5signals and0aliases. FSTLOAD|Building facility hierarchy tree. FSTLOAD|Sorting facility hierarchy tree.

清空编译

$makeclean
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/18 12:30:25

探索电梯控制系统:基于Matlab的动态系统PID控制器方案

电梯控制系统&#xff1a;控制系统方案&#xff0c;基于Matlab的动态系统PID控制器在现代建筑中&#xff0c;电梯已然成为不可或缺的垂直运输工具。一个高效、稳定的电梯控制系统对于提升用户体验和建筑运营效率至关重要。今天咱们就来聊聊基于Matlab的动态系统PID控制器在电梯…

作者头像 李华
网站建设 2026/4/18 1:40:01

网盘直链下载助手提取HeyGem模型文件提速技巧

网盘直链下载助手提取HeyGem模型文件提速技巧 在AI内容创作工具日益普及的今天&#xff0c;数字人视频生成系统正快速渗透到在线教育、虚拟主播、企业宣传等多个领域。像HeyGem这样的开源项目&#xff0c;凭借其简洁的WebUI界面和高效的批量处理能力&#xff0c;成为不少开发者…

作者头像 李华
网站建设 2026/4/18 0:05:56

HeyGem系统采用任务队列机制避免资源冲突详解

HeyGem系统任务队列机制深度解析&#xff1a;如何优雅解决AI生成中的资源冲突 在数字人视频生成领域&#xff0c;用户的需求早已从“能不能做”转向了“能不能批量、稳定、高效地做”。当一个创作者上传一段音频&#xff0c;想要驱动多个虚拟形象说出这段话时&#xff0c;他期望…

作者头像 李华
网站建设 2026/4/18 8:52:13

HeyGem数字人系统上传音频文件的操作技巧与注意事项

HeyGem数字人系统上传音频文件的操作技巧与注意事项 在AI内容创作工具日益普及的今天&#xff0c;如何让一段语音“活”起来&#xff0c;驱动一个虚拟人物精准对口型、自然表达情感&#xff0c;已经成为教育、营销和新媒体领域关注的核心问题。HeyGem数字人视频生成系统正是为解…

作者头像 李华
网站建设 2026/4/18 7:28:21

【.NET平台权限安全指南】:如何构建不可逾越的权限防火墙

第一章&#xff1a;Shell脚本的基本语法和命令Shell脚本是Linux和Unix系统中自动化任务的核心工具&#xff0c;它通过解释执行一系列命令来完成特定功能。编写Shell脚本需要掌握基本语法结构、变量使用、条件判断以及循环控制等核心概念。变量定义与使用 在Shell脚本中&#xf…

作者头像 李华
网站建设 2026/4/18 3:50:58

手把手教你用 RAG 打造专属知识库问答系统

大模型能力强大&#xff0c;却受限于静态知识库&#xff0c;还容易“一本正经地胡说八道”。RAG&#xff08;检索增强生成&#xff09;正是破局关键&#xff01;本文深入浅出讲解 RAG 的核心原理——通过实时检索外部知识库&#xff0c;为生成模型注入最新、最准的上下文信息&a…

作者头像 李华