Есть ли способ узнать системное время в VCS / UVM? Я ищу что-то похожее на Perl localtime(time). Есть ли способ распечатать системное время для каждого напечатанного uvm_info?

4
Jean 25 Сен 2014 в 23:23

3 ответа

Лучший ответ

Один из способов - использовать $system() для запуска любой системной команды, включая системную команду date.

initial
 begin
    $system("date");
 end

Из IEEE 1800 LRM:

$system вызывает функцию C system (). Функция C выполняет переданный ему аргумент, как если бы аргумент был выполнен с терминала. $system можно назвать либо задачей, либо функция. При вызове как функции возвращает возвращаемое значение вызов system () с типом данных int. Если $system вызывается без строковый аргумент, функция C system () будет вызываться с NULL нить.

Также см. здесь.

4
Greg 26 Сен 2014 в 00:53
$system напрямую возвращает значение, возвращаемое системным вызовом при выходе, но это значение составляет всего один-два байта, и обычно это либо 0, либо код ошибки. Обычный метод извлечения времени в симуляторе - записать его в файл, как описано в ссылке, которую я разместил в своем ответе.
 – 
Ari
29 Сен 2014 в 21:40
В UVM можно сбросить время настенных часов, проведенное на каждой фазе?
 – 
Jean
29 Сен 2014 в 22:11
Похоже, вы говорите о времени, затраченном симулятором на выполнение каждой фазы. Если да, то да, вызывайте $system до и после каждой фазы, каждый раз записывайте вывод в файл и считывайте его обратно. Затем измерьте разницу.
 – 
Ari
29 Сен 2014 в 22:51

Зависит от используемой вами версии 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();
4
Greg 18 Дек 2017 в 23:56
2
localtime() является функцией библиотеки C и возвращает struct tm *, а не строку. Назовите свою собственную функцию, отличную от localtime, иначе симулятор может вызвать неправильную функцию из-за зависимости порядка разделяемой библиотеки.
 – 
jclin
26 Сен 2014 в 07:25
Есть ли встроенная функция DPI для получения времени, чтобы мне не приходилось ее писать?
 – 
Jean
24 Окт 2014 в 21:04
@Greg: вывод команды linux date будет примерно таким: Mon Aug 7 14:00:34 PDT 2017. Когда вы вызываете $fscanf, вы используете %s в качестве формата, поэтому он будет соответствовать строке (которая представляет собой последовательность символов, отличных от пробелов, в соответствии с LRM). Поскольку 4-й символ — это пробел, строка localtime будет содержать только первые 3 символа вывода (т. е. день недели).
 – 
AndresM
8 Авг 2017 в 00:12

В 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
1
Meir 15 Янв 2018 в 16:13