Есть ли способ узнать системное время в VCS / UVM? Я ищу что-то похожее на Perl localtime(time)
. Есть ли способ распечатать системное время для каждого напечатанного uvm_info
?
3 ответа
Один из способов - использовать $system()
для запуска любой системной команды, включая системную команду date.
initial
begin
$system("date");
end
Из IEEE 1800 LRM:
$system
вызывает функцию C system (). Функция C выполняет переданный ему аргумент, как если бы аргумент был выполнен с терминала.$system
можно назвать либо задачей, либо функция. При вызове как функции возвращает возвращаемое значение вызов system () с типом данных int. Если$system
вызывается без строковый аргумент, функция C system () будет вызываться с NULL нить.
Также см. здесь.
Зависит от используемой вами версии 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 и скомпилируйте ее в VCS с вашими файлами SystemVerilog. В SystemVerilog добавьте import
, чтобы разрешить доступ к вашей функции C. Предполагая, что имя вашего метода - my_localtime, а время возврата - строка, импорт должен выглядеть так:
import "DPI" function string my_localtime();
localtime()
является функцией библиотеки C и возвращает struct tm *
, а не строку. Назовите свою собственную функцию, отличную от localtime
, иначе симулятор может вызвать неправильную функцию из-за зависимости порядка разделяемой библиотеки.
date
будет примерно таким: Mon Aug 7 14:00:34 PDT 2017
. Когда вы вызываете $fscanf
, вы используете %s
в качестве формата, поэтому он будет соответствовать строке (которая представляет собой последовательность символов, отличных от пробелов, в соответствии с LRM). Поскольку 4-й символ — это пробел, строка localtime
будет содержать только первые 3 символа вывода (т. е. день недели).
В 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
Похожие вопросы
Связанные вопросы
Новые вопросы
verilog
Verilog - это язык описания аппаратных средств (HDL), используемый для моделирования электронных систем. Он чаще всего используется при разработке, проверке и реализации цифровых логических чипов.
$system
до и после каждой фазы, каждый раз записывайте вывод в файл и считывайте его обратно. Затем измерьте разницу.