VCS使用问题记录

1. simulation报错

Error-[DPI-DIFNF] DPI import function not found

/opt/Synopsys/VCS2014/etc/uvm/base/uvm_resource.svh, 390

  The definition of DPI import function/task 'uvm_glob_to_re' does not exist.

  Please check the stated DPI import function/task is defined, and its 

  definition is either passed in a source file at compile-time, or provided in

  a shared library specified using the LRM Annex-J options at run-time.

解决方法: 添加编译选项 -ntb_opts uvm-1.2

 

### SystemVerilog 中 DPI-C 接口的使用方法 #### 什么是 DPIDPI(Direct Programming Interface)是一种允许 SystemVerilog 和 C/C++ 之间相互调用函数的功能。通过这种机制,可以实现硬件描述语言与高级编程语言之间的交互。 --- #### 基本概念 1. **导入 C 函数到 SystemVerilog** 使用 `import "DPI-C"` 关键字可以从 C 或 C++ 文件中引入函数并将其作为 SystemVerilog 的一部分使用[^2]。 2. **导出 SystemVerilog 函数给 C** 如果希望从 C/C++ 调用 SystemVerilog 定义的函数,则需要使用 `export` 关键字声明该功能[^3]。 3. **数据类型的映射** 在两种语言之间传递参数时需要注意类型匹配问题。例如整数、浮点数可以直接对应;而字符串或其他复杂结构则需特殊处理[^4]。 --- #### 示例代码展示 ##### 1. 导入 C 函数至 SystemVerilog 并调用它 下面是一个完整的例子说明如何定义一个计算正弦值的简单 C 函數并通过 DPI 技术让其能在 SV 环境下被呼叫: ###### C Code (`compute.c`) ```c #include <math.h> real compute_sin(real angle){ return sin(angle); } ``` 编译此文件生成共享库供后续仿真器加载: ```bash gcc -shared -o libcompute.so -fPIC compute.c ``` ###### SystemVerilog Code (`test.sv`) ```verilog module test; import "DPI-C" function real compute_sin(input real angle); initial begin real angle = 1.5708; // 90 degrees in radians real result; result = compute_sin(angle); $display("The sine of %0.4f is %0.4f", angle, result); $finish; end endmodule ``` 运行 QuestaSim 或 ModelSim 进行模拟前记得设置环境变量指向刚才创建好的 `.so/.dll` 库路径[^1]: ```bash setenv LD_LIBRARY_PATH /path/to/your/library:$LD_LIBRARY_PATH vsim work.test ``` --- ##### 2. 反向操作——从 C 调用 SystemVerilog 功能 当需要由软件侧主动触发某些硬件行为测试场景时非常有用。这里给出另一个小型案例介绍反方向链接过程。 假设我们有一个名为 `sv_func` 的纯逻辑运算SV程序片段如下所示: ###### SystemVerilog Export Function Definition(`dpi_export.sv`) ```verilog function automatic int sv_adder(int a,b); return a+b ; endfunction : sv_adder // Tell the compiler this method should be visible externally via 'extern' export "DPI-C" function sv_adder; ``` 然后编写相应的宿主端应用尝试访问上述加法服务: ###### Host Application Written In C Language(`host_app.c`) ```c #include <stdio.h> #include "VpiUser.h" int (*sv_adder)(int,int)=NULL ; void setup(){ vpiHandle sys=tfOpen("/path/to/simulation/executable"); if(!sys){fprintf(stderr,"Failed opening VPI connection\n");exit(-1);} /* Locate our target exported routine */ sv_adder=(typeof(sv_adder))tfGetFunc(sys,"sv_adder"); } int main(void){ setup(); printf("%d+%d=%d\n",3,5,(*(sv_adder))(3,5)); tfClose();return EXIT_SUCCESS; } ``` 注意实际开发过程中可能还需要额外配置项目属性比如指定目标平台架构等细节. --- ### 总结 以上分别介绍了双向利用 DPI 实现跨语言协作的方法论及其典型应用场景实例分析。无论是为了增强验证效率还是构建更灵活的设计框架,掌握好这些技巧都将极大提升工作效率! ---
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值