1. 初识 Verilator DPI-C:打破语言壁垒的仿真利器
在芯片验证领域,混合语言仿真常面临痛点。验证复杂处理器设计时,往往需要在 Verilog 环境中调用 C 语言编写的参考模型进行数据比对,或者用 C 代码模拟外设行为。此时,Verilator 的 DPI-C 机制成为关键解决方案。
DPI-C 在 Verilog 和 C/C++ 之间架起桥梁。可以在 Verilog 代码中直接调用 C 函数,也可以在 C 代码中访问 Verilog 的信号和变量。这种双向通信能力让混合语言验证变得简单。与传统的 PLI/VPI 接口相比,DPI-C 更加轻量高效,无需复杂的回调机制,直接通过函数调用交互,大幅提升仿真速度。常见应用场景包括:处理器验证中调用 C 黄金模型比对指令结果、C 代码模拟复杂外设行为、仿真中实时监控关键信号生成调试信息等。
2. 环境搭建与基础配置
2.1 安装 Verilator
推荐从源码编译安装,以获得最新特性并确保兼容性:
# 安装依赖
sudo apt-get install git make autoconf g++ flex bison
# 克隆源码
git clone https://github.com/verilator/verilator
cd verilator
# 编译安装
autoconf
./configure
make -j$(nproc)
sudo make install
验证安装是否成功:
verilator --version
2.2 创建第一个 DPI-C 项目
从一个简单的例子开始。假设要在 Verilog 中调用一个 C 函数来计算两个数的和。
首先创建 Verilog 文件 dpi_test.v:
module dpi_test;
import "DPI-C" function int add(input int a, input int b);
initial begin
int result;
result = add(10, 20);
$display("10 + 20 = %d", result);
$finish;
end
endmodule
然后创建 C++ 激励文件 sim_main.cpp:
#include "svdpi.h"
#include "Vdpi_test__Dpi.h"
extern "C" int add(int a, int b) {
return a + b;
}
int main(int argc, ** argv) {
Vdpi_test* top = Vdpi_test;
( i = ; i < ; i++) {
top->();
}
top;
;
}

