文件:
src/dpi/uvm_dpi.svh
类: 
 
  SystemVerilog DPI,全称SystemVerilog直接编程接口 (英语:SystemVerilog Direct Programming Interface)是SystemVerilog与其他外来编程语言的接口。能够使用的语言包括C语言、C++、SystemC等。直接编程接口由两个层次构成:SystemVerilog层和外来语言层。两个层次相互分离。对于SystemVerilog方面,另一边使用的编程语言是透明的,但它并不关注这一点。SystemVerilog和外来语言的编译器各自并不需要分析另一种语言的代码。由于不触及SystemVerilog层,因此支持使用不同的语言。不过,目前SystemVerilog仅为C语言定义了外来语言层。所以,每个函数DPI的文件都有*.svh和*.cc 两个文件,首先来看uvm_dpi.svh 该文件秉承了UVM风格,在该文件中实现include dpi目录下的所有文件。

uvm_dpi.svh源代码如下:

`ifndef UVM_DPI_SVH
`define UVM_DPI_SVH //
// Top-level file for DPI subroutines used by UVM.
//
// Tool-specific distribution overlays may be required.
//
// To use UVM without any tool-specific overlay, use +defin+UVM_NO_DPI
// `ifdef UVM_NO_DPI
`define UVM_HDL_NO_DPI
`define UVM_REGEX_NO_DPI
`define UVM_CMDLINE_NO_DPI
`endif `include "dpi/uvm_hdl.svh"
`include "dpi/uvm_svcmd_dpi.svh"
`include "dpi/uvm_regex.svh" `endif // UVM_DPI_SVH

uvm_dpi.cc 的源代码如下:

//
// Top-level file that includes all of the C/C++ files required
// by UVM
//
// The C code may be compiled by compiling this top file only,
// or by compiling individual files then linking them together.
// #ifdef __cplusplus
extern "C" {
#endif #include <stdlib.h>
#include "uvm_dpi.h"
#include "uvm_common.c"
#include "uvm_regex.cc"
#include "uvm_hdl.c"
#include "uvm_svcmd_dpi.c" #ifdef __cplusplus
}
#endif

uvm_dpi.cc 和uvm_dpi.svh相比多了<stdlib.h>标准库,"uvm_dpi.h"头文件和"uvm_common.c"源文件。

让我们看看uvm_dpi.h头文件(C语言的代码风格每个*.c文件配置一个*.h 文件),在该文件中声明了m_uvm_report_dpi和int_str_max()函数。这两个函数的定义在uvm_common.c中。

//
// Top level header filke that wraps all requirements which
// are common to the various C/C++ files in UVM.
// #ifndef UVM_DPI__H
#define UVM_DPI__H #include <stdlib.h>
#include "vpi_user.h"
#include "veriuser.h"
#include "svdpi.h"
#include <malloc.h>
#include <string.h>
#include <stdio.h>
#include <regex.h>
#include <limits.h> // The following consts and method call are for
// internal usage by the UVM DPI implementation,
// and are not intended for public use.
static const int M_UVM_INFO = ;
static const int M_UVM_WARNING = ;
static const int M_UVM_ERROR = ;
static const int M_UVM_FATAL = ; static const int M_UVM_NONE = ;
static const int M_UVM_LOW = ;
static const int M_UVM_MEDIUM = ;
static const int M_UVM_HIGH = ;
static const int M_UVM_FULL = ;
static const int M_UVM_DEBUG = ; void m_uvm_report_dpi(int severity,
char* id,
char* message,
int verbosity,
char* file,
int linenum); int int_str_max( int ); #endif

让我们来看看uvm_common.c 的内容,这个文件就是实现了m_uvm_report_dpi()和int_str_max()函数.

// Implementation of common methods for DPI

extern void m__uvm_report_dpi(int,const char*,const char*,int,const char*, int);

#if defined(INCA) || defined(NCSC)
const static char* uvm_package_scope_name = "uvm_pkg::";
#else
const static char* uvm_package_scope_name = "uvm_pkg";
#endif void m_uvm_report_dpi( int severity,
char* id,
char* message,
int verbosity,
char* file,
int linenum) {
svScope old_scope = svSetScope(svGetScopeFromName(uvm_package_scope_name));
m__uvm_report_dpi(severity, id, message, verbosity, file, linenum);
svSetScope(old_scope);
} int int_str_max ( int radix_bits ) {
int val = INT_MAX;
int ret = ;
while ((val = (val /radix_bits)))
ret++;
return ret;
}

参考文献:

1 PLI, DPI, DiectC, TLi-1. http://www.cnblogs.com/chenrui/archive/2012/09/18/2689956.html

2 PLI, DPI, DirectC,TLI - 2. http://www.cnblogs.com/chenrui/archive/2012/09/18/2689957.html

3 Verilog PLI已死,SystemVerilog当立. http://www.doc88.com/p-0867195577584.html

uvm_dpi——DPI在UVM中的实现(一)的更多相关文章

  1. uvm_hdl——DPI在UVM中的实现(四)

    我们可以在uvm中实现HDL的后门访问,具体包括的function有uvm_hdl_check_path,uvm_hdl_deposit, uvm_hdl_force,uvm_hdl_release, ...

  2. uvm_regex——DPI在UVM中的实现(三)

    UVM的正则表达是在uvm_regex.cc 和uvm_regex.svh 中实现的,uvm_regex.svh实现UVM的正则表达式的源代码如下: `ifndef UVM_REGEX_NO_DPI ...

  3. uvm_svcmd_dpi——DPI在UVM中的实现(二)

    UVM中有需要从cmmand line 输入参数的需求,所有uvm_svcmd_dpi.svh和uvm_svcmd_dpi.cc 文件就是实现功能. uvm_svcmd_dpi.svh的源代码如下,我 ...

  4. UVM中的class

    UVM中的类包括:基类(base)------------uvm_void/uvm_object/uvm_transaction/uvm_root/uvm_phase/uvm_port_base 报告 ...

  5. UVM中的sequence使用(一)

    UVM中Driver,transaction,sequence,sequencer之间的关系. UVM将原来在Driver中的数据定义部分,单独拿出来成为Transaction,主要完成数据的rand ...

  6. UVM中的regmodel建模(三)

    总结一下UVM中的寄存器访问实现: 后门访问通过add_hdl_path命令来添加寄存器路径,并扩展uvm_reg_backdoor基类,定义read与write函数,最后在uvm_reg_block ...

  7. UVM中的regmodel建模(一)

    UVM中的regmodel继承自VMM的RAL(Register Abstract Layer),现在可以先将寄存器模型进行XML建模,再通过Synopsys 家的工具ralgen来直接生成regmo ...

  8. UVM中factory机制的使用

    UVM中的factory机制一般用在sequence的重载,尤其是virtual sequence.当Test_case变化时,通过virtual sequence的重载,可以很容易构建新的测试. 因 ...

  9. UVM中的factory机制实现

    首先在Systemverilog中便有对于重载的最基本的支持. 1)定义task/function时,使用virtual关键字.那之后在test_case中调用时,便使用句柄指向的对象的类型而不是句柄 ...

随机推荐

  1. JS的几条规则

    总结一下,有这么几条规则需要遵守: 不要使用new Number().new Boolean().new String()创建包装对象: 用parseInt()或parseFloat()来转换任意类型 ...

  2. oracle数据库rownum讲解(转)

    https://blog.csdn.net/qq_40794266/article/details/78698321

  3. 某人视频中提到的 Spark Streaming 优化的几点事项

    某人,并未提他的名字,是因为看的视频是1年前的,视频里他吹得厉害.我看视频时,查了一下他在视频里说的要做到的东西,结果上网一查,就看到了很多人说他骗了钱后,就不管交了学费的人了.真假无从查起.但是无风 ...

  4. 《OD学spark》20160925 Spark Core

    一.引言 Spark内存计算框架 中国Spark技术峰会 十二场演讲 大数据改变世界,Spark改变大数据 大数据: 以Hadoop 2.x为主的生态系统框架(MapReduce并行计算框架) 存储数 ...

  5. ssh-ssh整合(Struts2+Sprinig+hibernate)

    在之前呢我们已经讲解过ssm以及ssm2的整合开发,今天我们进行ssh的整合,在之前已经有一篇整合ssh的文章,那是基于注解开发的,今天讲解的为基于配置文件注入方式进行开发.思路:spring管理hi ...

  6. Maven整合Eclipse进行Java项目开发

    一.Maven的配置 ①要求当前系统环境下配置了JAVA_HOME 在CMD命令行中输入:echo %JAVA_HOME% 如果能出来JDK的安装目录,说明我们配置了JAVA环境 ②将Maven的ZI ...

  7. CF10D/POJ2127 LCIS解题报告

    题目传送门(洛谷)(CF)(POJ) 前言 期末考试前的最后一篇题解,希望期末考  rp++ 奇怪,为什么在CF上能过的代码到POJ上就 听取WA声一片  (不管了) 题目思路 LCIS模版O(n²) ...

  8. Shape Number (最小表示法)

    题目链接 一个字符串,这个字符串的首尾是连在一起的,要求寻找一个位置,以该位置为起点的字符串的字典序在所有的字符串中中最小. #include <bits/stdc++.h> using ...

  9. 外键约束 foreign key

    外键约束 :保持数据一致性,完整性实现一对多关系.外键必须关联到键上面去,一般情况是,关联到另一张表的主键 (因为一个表只存一类信息.用外键来做参照,保证数据的一致性,可以减少数据冗余) ##表acr ...

  10. PHPExcel探索之旅---阶段二 设置表格样式

    1.设置表格的默认样式为水平居中.垂直居中 getDefaultStyle()函数用来设置默认样式 由活动sheet对象来调用,setVertical()函数和setHorizontal()函数分别用 ...