Verilog 获取VCS中的系统时间

Verilog 获取VCS中的系统时间,verilog,system-verilog,uvm,synopsys-vcs,Verilog,System Verilog,Uvm,Synopsys Vcs,有没有办法在VCS/UVM中获得系统时间?我正在寻找类似Perl的localtime(time)。是否有方法为每次打印的uvm\u信息打印系统时间?一种方法是使用$system()运行任何系统命令,包括系统的日期命令 initial begin $system("date"); end 来自LRM: $system调用C函数system()。C函数 执行传递给它的参数,就像执行参数一样 从终点站$system可以作为任务或任务调用 功能。当作为函数调用时,它返回 对数据类型为int

有没有办法在VCS/UVM中获得系统时间?我正在寻找类似Perl的
localtime(time)
。是否有方法为每次打印的
uvm\u信息
打印系统时间?

一种方法是使用
$system()
运行任何系统命令,包括系统的日期命令

initial
 begin
    $system("date");
 end
来自LRM:

$system
调用C函数system()。C函数 执行传递给它的参数,就像执行参数一样 从终点站
$system
可以作为任务或任务调用 功能。当作为函数调用时,它返回 对数据类型为int的system()的调用。如果调用时没有 字符串参数时,将使用NULL调用C函数system() 绳子


另外,请参见。

取决于您使用的VCS版本。最新版本应支持§20.18.1中定义的
$system
。假设您在基于UNIX的环境中运行,则可以执行以下操作:

function string get_localtime();    
  int fd;
  string localtime;
  void'($system("data > localtime")); // temp file
  fd = $fopen("localtime", "r");
  void'($fscanf(fd,"%s",localtime));
  $fclose(fd);
  void'($system("rm localtime")); // delete file
  return localtime;
endfunction
如果您的版本VCS不支持
$system
,或者您的版本更符合C/C++,则使用DPI(见§35)。用C语言创建一个函数,并用SystemVerilog文件在VCS中编译它。在SystemVerilog中,添加
导入
,以允许访问C函数。假设您的方法名为my_localtime,返回时间为字符串,则导入应如下所示:

import "DPI" function string my_localtime();

在c文件wallclock.c中:

#include <time.h>
wallclock() {
   time_t t;
   t = time(NULL);
   return (ctime(&t));
   //return time(NULL);
}

localtime()
是C库的函数,返回的不是字符串。命名您自己的函数,而不是
localtime
,否则,由于共享库顺序依赖关系,模拟器可能调用错误的函数。是否有内置的DPI函数来获取时间,这样我就不必编写时间?@Greg:linux
date
命令输出类似于:
Mon Aug 7 14:00:34 PDT 2017
。调用
$fscanf
时,使用的格式是
%s
,因此它将匹配一个字符串(根据LRM,这是一个非空白字符序列)。由于第4个字符是空白,因此
localtime
字符串将仅包含输出的前3个字符(即一周中的第几天)。$system在退出时直接返回系统调用的返回值,但该值仅为一到两个字节,通常为0或错误代码。在模拟器中提取时间的常用技术是将其写入一个文件,如我在回答中发布的链接中所述。在UVM中,是否可以转储每个阶段所花费的挂钟时间?看起来您是在谈论模拟器运行每个阶段所花费的时间。如果是,答案是肯定的,在每个阶段之前和之后调用
$system
,每次将输出写入文件并读回。然后测量差异。
import "DPI-C" function string wallclock();

module try;

   //int unsigned   t;
   string t;

   initial begin
      t = wallclock();
      $write("time=%0s\n", t);
   end
endmodule