Verilog 获取VCS中的系统时间
有没有办法在VCS/UVM中获得系统时间?我正在寻找类似Perl的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
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:linuxdate
命令输出类似于: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