2014-09-25 180 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