2014-09-25 1513 views
4

有没有办法在VCS/UVM中获取系统时间?我正在寻找类似于Perl的localtime(time)的东西。是否可以打印每个uvm_info的系统时间?在VCS中获取系统时间

回答

3

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

initial 
begin 
    $system("date"); 
end 

IEEE 1800 LRM:

$system使得C函数系统()的调用。 C函数 执行传递给它的参数,就像从终端执行参数 一样。可以调用$system作为任务或 函数。当作为一个函数被调用时,它返回值为 的调用system()的数据类型为int。如果调用$system而没有 字符串参数,则将使用NULL 字符串调用C函数system()。

另外,参见here

+0

有没有办法提取命令的输出? – Jean 2014-09-27 21:50:03

+0

$系统在退出时直接返回系统调用的返回值,但这个值只有一到两个字节,通常是0或错误代码。在模拟器中提取时间的常用技巧是将其写入文件中,如我在答案中发布的链接中所述。 – Ari 2014-09-29 17:40:15

+0

在UVM中可以转储每个阶段花费的挂钟时间吗? – Jean 2014-09-29 18:11:52

3

取决于您使用的VCS版本。最新版本应支持$system,如IEEE Std 1800-2012 § 20.18.1中所定义。假设你在一个基于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(见IEEE Std 1800-2012 § 35)。在C中创建一个函数,并使用SystemVerilog文件在VCS中进行编译。在SystemVerilog中,添加import以允许访问您的C函数。假设你的方法名称为my_localtime和和返回的时间是一个字符串,进口应该是这样的:

import "DPI" function string my_localtime(); 
+2

'localtime()'是C库的一个函数,它返回'struct tm *'不是一个字符串。为'localtime'命名自己的函数,否则,由于共享库顺序依赖关系,模拟器可能会调用错误的函数。 – jclin 2014-09-26 03:25:11

+0

是否有一个内置的DPI函数来获取时间,以便我不必编写一个? – Jean 2014-10-24 17:04:43

+0

@Greg:linux'date'命令输出如下:'Mon Aug 7 14:00:34 PDT 2017'。当你调用'$ fscanf'时,你使用'%s'作为格式,所以它会匹配一个字符串(这是一个非空白字符序列,按照LRM)。由于第四个字符是空格,因此'localtime'字符串将只包含输出的前3个字符(即星期几)。 – AndresM 2017-08-07 21:12:03

0

在C文件wallclock.c:

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

在SV文件:

import "DPI-C" function string wallclock(); 

module try; 

    //int unsigned t; 
    string t; 

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