Cocotb学习之路(1)— Cocotb 的安装与仿真

一、前言

Cocotb 作为基于 Python 的 Verilog/VHDL 仿真库,能让我们用 Python 灵活编写测试用例,搭配 Verilator 仿真引擎和 GTKWave 波形查看工具,构成一套轻量高效的仿真环境。

我们要使用的工具如下:

  • Python:Cocotb 的运行基础,推荐 3.10 及以上版本
  • Cocotb:核心仿真库,用于连接 Python测试代码与硬件描述语言
  • Verilator:开源 Verilog 仿真引擎,负责解析 Verilog 代码并执行仿真
  • GTKWave:波形查看工具,用于可视化仿真结果,调试硬件逻辑

参考文章:基于 Python 的 Cocotb 仿真环境配置

二、工具安装

1、Python 环境配置

首先确保系统安装了 Python 及相关工具,推荐 Python 3.10+

sudo apt update
sudo apt install python3 python3-pip python3-venv -y

2. 安装 Cocotb 及依赖库

升级 pip 和 wheel(确保安装兼容性)

pip3 install --upgrade pip wheel

安装 Cocotb 及相关依赖

pip3 install cocotb cocotb-bus pytest

3. Verilator 安装

Verilator 提供两种安装方式,按需选择即可:

方式 1:apt 快速安装(推荐新手)

适合不需要最新版本的场景,安装简单无需编译:

sudo apt install verilator -y
# 验证安装成功
verilator --version
方式 2:源码安装(需要最新版本时)

如果 apt 安装的版本过低(如需要 5.0 以上版本),可通过源码编译:

# 1. 安装编译依赖
sudo apt install git perl python3 make autoconf g++ flex bison libfl2 libfl-dev zlibc zlib1g zlib1g-dev -y

# 2. 克隆源码并切换版本(以 v5.036 为例,可替换为最新版本)
git clone https://github.com/verilator/verilator.git
cd verilator
git checkout v5.036

# 3. 编译安装
autoconf
./configure
make -j$(nproc)  # 多线程编译,加快速度
sudo make install

# 4. 处理版本冲突(若系统已有旧版本)
# 编辑 ~/.bashrc,将 /usr/local/bin 加入 PATH 前端
echo 'export PATH=/usr/local/bin:$PATH' >> ~/.bashrc
source ~/.bashrc

4. GTKWave 安装(波形查看工具)

GTKWave 是开源免费的波形查看工具,支持 .vcd 和 .fst 格式文件:

sudo apt install gtkwave -y

# 常用启动命令(后续仿真后使用)
gtkwave logs/dump.vcd &

三、创建工程

新建设计文件 dff.sv 如下所示:

`timescale 1us/1ns

module dff (
    input logic         clk,
    input logic  [3:0]  din,
    output logic [3:0]  qout
);

    always @(posedge clk) begin
        qout <= din;
    end

endmodule

编写测试文件如下所示:

import random
import cocotb
from cocotb.clock import Clock
from cocotb.triggers import FallingEdge
import logging

@cocotb.test()
async def test_dff_simple(dut):
    """ The test input din can be correctly passed to the output qout """
     # Create a logger for this testbench
    logger = logging.getLogger("my_testbench")
    logger.setLevel(logging.DEBUG)
    logger.debug("This is a debug message")
    logger.info("This is an info message")
    clock = Clock(dut.clk, 10, units="us")
    cocotb.start_soon(clock.start())

    for i in range(10):
        val = random.randint(0, 7)
        dut.din.value = val
        await FallingEdge(dut.clk)
        logger.info(f"Cycle {i}: din = {dut.din.value}, qout = {dut.qout.value}")
        assert dut.q.value == val, f"In {i} cycle,output(qout) is {dut.q.value},expect is {val}"

编写运行makefile文件如下所示:

export PYTHONPATH := $(PWD)/testbench:$(PYTHONPATH)

export LANG := en_US.UTF-8
export LC_ALL := en_US.UTF-8
export PYTHONIOENCODING := utf-8

TOPLEVEL_LANG = verilog

VERILOG_SOURCES = $(PWD)/dff.sv
TOPLEVEL = dff

MODULE = test

SIM ?= verilator

LOG_DIR ?= logs

SIM_LABEL := $(if $(strip $(SIM)),$(strip $(SIM)),default_sim)

export VERILATOR_TRACE=1

run: $(LOG_DIR)
	$(MAKE) --no-print-directory sim

clean::
	@echo "[cocotb] The simulation generated files are being cleaned up"
	@rm -rf $(LOG_DIR) sim_build results.xml
	@rm -f *.log transcript modelsim.ini dump.vcd
	@rm -rf __pycache__

include $(shell cocotb-config --makefiles)/Makefile.sim

.PHONY: run clean

$(LOG_DIR):
	@mkdir -p $@

四、仿真运行

使用make命令运行如下所示:
在这里插入图片描述

五、查看波形

执行如下命令打开波形

gtkwave dump.vcd

打开波形后如下所示
在这里插入图片描述

Logo

火山引擎开发者社区是火山引擎打造的AI技术生态平台,聚焦Agent与大模型开发,提供豆包系列模型(图像/视频/视觉)、智能分析与会话工具,并配套评测集、动手实验室及行业案例库。社区通过技术沙龙、挑战赛等活动促进开发者成长,新用户可领50万Tokens权益,助力构建智能应用。

更多推荐