UVM中DPI用法简介

1 篇文章 0 订阅
为了方便与C、C++等语言的交互,uvm中引入了DPI接口,自定义的函数需要写函数主体,然后再import后声明和使用,验证环境中便可以像调用system verilog中的函数一样使用这些函数。
而且,对于C语言中内置的函数,不需要写函数主体,直接声明使用.
1.自定义的函数主体;需要注意的是导入不同c函数需要加入对应的.h文件例如svdpi.h、string.h
   #include <svdpi.h>
  void mul_test(
           svBitVecVal *out_data,
   const    svBitVecVal *in_data)
{
       *out_data = *in_data*2;
}
2.import声明
在import的时候需要函数的主体转化为system verilog可以识别的函数,如数据的类型:double ->real,svBitVecVal->bit;在转换的时候,要确保数据类型的一致性,否则,可能会导致函数结果与预期不一致;
  import "DPI-C" function void mul_test(
      output bit [7:0] out_data,
     input  bit [7:0] in_data
 );
   import "DPI-C" function real sin(input real in_data);

3.调用使用
initial begin
   tan_data = 0.5;
   o_tan_data = sin(tan_data);
  $display("tan_data is %0f,o_tan_data is%0f",tan_data,o_tan_data);
  in_data = $urandom_range(8'h5,8'hff);
  mul_test(out_data,in_data);
  $display("in_data is 0x%0h,out_data is 0x%0h",in_data,out_data);
4.执行效果
   tan_data is 0.500000,o_tan_data is 0.479426
   in_data is 0x49,out_data is 0x92
   5.C与system verilog数据类型的对应关系
   SystemVerilog                         C(输入)                         C(输出) 
 byte                                    char                            char*     
short int                             short int                        short int*              
  int                                      int                                int* 
longint                             long long int                    long int* 
 real                                  double                            double*
string                              const char*                       char**
string[N]                         const char**                     char**
  bit                            svBit/unsigned char       svBit*/unsigned char  
logic/reg                     svLogic/unsigned char   svLogic*/unsigned char*  
bit[N:0]                      const svBitVecVal*              svBitVecVal*   
reg[N:0]                      const svLogicVecVal*          svLogicVecVal*   
open array[]             const svOpenArrayHandle    svOpenArrayHandle
 chandle                              const void*                    void*
 6.封装
 在定义时可以将定义函数实体时,可以将其存放到.c文件当中集中管理;用import导入时存放到.svh文件集中管理;在编译的时候调用此文件即可.

在这里插入图片描述
在这里插入图片描述

  • 8
    点赞
  • 39
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
下面是一个简单的UVM DPI接口的使用实例,以调用外部C函数为例: 1. 外部C函数的实现: ``` // dpi_function.h #ifndef DPI_FUNCTION_H #define DPI_FUNCTION_H #ifdef __cplusplus extern "C" { #endif int add(int a, int b); #ifdef __cplusplus } #endif #endif // DPI_FUNCTION_H ``` ``` // dpi_function.c #include "dpi_function.h" int add(int a, int b) { return a + b; } ``` 2. 在UVM环境创建UVM DPI组件: ``` // dpi_component.sv class dpi_component extends uvm_component; `uvm_component_utils(dpi_component) extern function int add(int a, int b); int result; function new(string name, uvm_component parent); super.new(name, parent); endfunction virtual function void build_phase(uvm_phase phase); super.build_phase(phase); endfunction virtual function void run_phase(uvm_phase phase); super.run_phase(phase); result = add(1, 2); $display("Result is %d", result); endfunction endclass ``` 3. 在UVM Testbench实例化UVM DPI组件: ``` // testbench.sv module testbench; dpi_component dpi_comp; initial begin uvm_config_db#(virtual dpi_component)::set(null, "*", "dpi_comp", dpi_comp); run_test(); end endmodule ``` 4. 编译并运行: ``` # 编译外部C代码 $ gcc -c dpi_function.c $ ld -shared dpi_function.o -o dpi_function.so # 编译UVM环境 $ vlog dpi_component.sv $ vlog testbench.sv $ vsim -c -do "run -all" testbench ``` 在运行时,UVM DPI组件将会调用外部C函数add,并将结果显示在屏幕上。需要注意的是,在编译时需要使用相同的编译器和编译选项,以保证DPI接口能够正确连接和调用外部函数。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值