You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Verilog/SystemVerilog环境下实现C侧与SV侧日志统一输出

DPI-C日志统一输出解决方案

问题根因

C标准库printf直接写入操作系统层面的stdout文件描述符,而EDA工具的日志捕获逻辑仅接管自身SV运行时的输出流,未hook系统级stdout的写入操作,因此printf输出的内容只会在终端显示,不会进入EDA工具生成的日志文件。
此前尝试修改stdout指向的操作会覆盖整个进程的输出目标,自然会连带SV侧的日志一起被重定向,不符合仅统一输出流、不额外修改日志目标的需求。

最优解决方案

直接使用VPI标准提供的vpi_printf函数替换C代码中的printf即可,这是成本最低、兼容性最好的方案:

  • 符合IEEE 1800标准要求,所有支持DPI的主流EDA工具(VCS、Xcelium、Questa等)均原生支持,无额外依赖
  • 与SV侧$display等打印函数共用同一输出流,输出内容会同时出现在终端和EDA工具的日志文件中,完美实现所有日志汇总到同一输出流
  • 入参格式与printf完全兼容,仅需要替换函数名,不需要调整打印参数逻辑,替换成本几乎为0
  • 不需要额外编写SV侧导出函数,也不需要修改进程stdout配置,实现逻辑简洁

代码替换示例

修改前C代码:

#include <stdio.h>

int c_model_calc(int input_val) {
    printf("C model received input: %d\n", input_val);
    // 业务逻辑
    return input_val * 2;
}

修改后C代码:

#include <vpi_user.h>

int c_model_calc(int input_val) {
    vpi_printf("C model received input: %d\n", input_val);
    // 业务逻辑
    return input_val * 2;
}

内容的提问来源于stack exchange,提问作者Alexandr Bolotnikov

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.04 18:57:01