Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Запись симуляции в лог SV
Форум разработчиков электроники ELECTRONIX.ru > Программируемая логика ПЛИС (FPGA,CPLD, PLD) > Работаем с ПЛИС, области применения, выбор
-=Vitaly=-
Здравствуйте.

Подскажите наиболее оптимально в СистемВерилоге сохранить ход симуляции в файл?

Я попробовал внутри класса вставить в таск $fwrite но Квесте не понравилось. Такой вариант вообще возможен?

Заранее спасибо.
des00
Цитата(-=Vitaly=- @ Jul 30 2008, 04:22) *
Здравствуйте.

Подскажите наиболее оптимально в СистемВерилоге сохранить ход симуляции в файл?

Я попробовал внутри класса вставить в таск $fwrite но Квесте не понравилось. Такой вариант вообще возможен?

Заранее спасибо.


а файлик открыть? а проверить что указатель валидный ? а указать функциям файлового ввода вывода указатель на файлик ? а корректно его закрыть ? все как в с/с++ в общем smile.gif))

читайте стандарт на верилог

удачи !!!
-=Vitaly=-
Цитата(des00 @ Jul 30 2008, 12:47) *
а файлик открыть? а проверить что указатель валидный ? а указать функциям файлового ввода вывода указатель на файлик ? а корректно его закрыть ? все как в с/с++ в общем smile.gif))

читайте стандарт на верилог

удачи !!!


Да тут конкретно Квеста говорит Hierarchical reference file not allowed from within package. Наверное все таки так нельзя

Спасибо
des00
Цитата(-=Vitaly=- @ Jul 30 2008, 06:26) *
Да тут конкретно Квеста говорит Hierarchical reference file not allowed from within package. Наверное все таки так нельзя

Спасибо


чего ????

код в студию.

вот совершенно рабочий пример


Код
//
// Project      : High-Speed SDRAM Controller with adaptive bank management and command pipeline
//
// Project Nick : HSSDRC
//
// Version      : 1.0-beta
//  
// Revision     : $Revision: 240 $
//
// Date         : $Date: 2008-02-19 17:41:56 +0600 (Р'С', 19 С"РчР_ 2008) $
//
// Workfile     : message_class.sv
//
// Description  : simple message service class
//


`ifndef __MESSAGE_CLASS__

  `define __MESSAGE_CLASS__

  class message_class;
  
    static int fp;
  
    static int err_cnt;

    //
    //
    //

    function new (string file_name = "");
      if (file_name.len() != 0)
        fp = $fopen(file_name, "w");
      else
        fp = 0;
    endfunction

    //
    //
    //
  
    function void stop();
      $fclose(fp);
    endfunction
  
    //
    //
    //
    
    function void note (string str);
      string io_str;
  
      io_str = $psprintf("**NOTE** at %0t : ", $time);
  
      io_str = {io_str, str};
  
      $display (io_str);
      if (fp)
        $fdisplay (fp, io_str);
    endfunction

    //
    //
    //

    function void err (string str);
      string io_str;
  
      err_cnt++;
  
      io_str = $psprintf("**ERROR** at %0t : ", $time);
  
      io_str = {io_str, str};
  
      $display (io_str);
      if (fp)
        $fdisplay (fp, io_str);
  
    endfunction
  
  endclass

`endif
-=Vitaly=-
Цитата(des00 @ Jul 30 2008, 14:31) *
чего ????

код в студию.

А вот совершенно нерабочий :-)
Код
import definitions::*;
program simple_spi_tb (spi_bus_i.master spi_m);
   //import definitions::*;
spi_simple_class spi_sender, spi_sender2;
Packet p;    
//reg SSB,SCLK,MOSI;  
bit [7:0] my_data []='{`SI,8'hBB,8'hCC};
static int file;
initial
  begin
  file=$fopen("log.txt","w");
  $fwrite(file, "Simulation started %t", $realtime);
  spi_sender = new(spi_m);
  spi_m.RSTB=1'b0;
  #600;
  spi_m.RSTB=1'b1;
  spi_m.SSB=1'b1;
  spi_sender.SPI_COMMAND_WRITE(my_data);
  repeat (10)
  begin
   spi_sender.SPI_TRASH_WRITER();
  end
  spi_sender2=null;
  $stop;
end    
//========================================================
endprogram

class Packet;
bit [7:0] commands_array [] ='{`NOP,`CR,`RT,`WT,`SI,`SIL,`RO1,`RO2,`RO4,`RO8,`TZ1,`TZ2,`TZ12,`TZ0,`SM,`WU};
typedef bit [7:0] command_payload_t [3];
rand int command_index;
rand command_payload_t data;

constraint inside_sixteen {
  command_index inside {[0:16]};
endclass

class spi_simple_class;

virtual spi_bus_i spi;
const int tcs_sclk=100;
const int tsclk_cs=100;
  typedef bit [7:0] my_data [3];
  rand my_data data;
  function new (virtual spi_bus_i spi);
    this.spi=spi;
  endfunction

task SPI_COMMAND_WRITE (bit [7:0] data []);
    
endtask

task SPI_TRASH_WRITER();
  Packet p;
  bit [7:0] data [3];
  p=new;
   begin
    assert(p.randomize());
       $fwrite(file, "Send packet over SPI time=%t p.data= %p",  $realtime ,p.data);
     data[0]=p.commands_array[p.command_index];
     data[1:2]=p.data[1:2];
     $display("p.data= %p", data);
     SPI_COMMAND_WRITE(data);
   end  
endtask  
endclass


Спасибо!
-=Vitaly=-
Вот так вот работает, но чувствую что это некрасиво. Особенно если логить много прийдется надо все время передавать указатель на файл. smile3046.gif

Код
program simple_spi_tb (spi_bus_i.master spi_m);
   //import definitions::*;
spi_simple_class spi_sender, spi_sender2;
static int file;
Packet p;    
//reg SSB,SCLK,MOSI;  
bit [7:0] my_data []='{`SI,8'hBB,8'hCC};

initial
  begin
   spi_sender = new(spi_m);
   file=$fopen("log.txt","w");
  $fdisplay(file, "Simulation started %0t", $realtime);

  spi_m.RSTB=1'b0;
  #600;
  spi_m.RSTB=1'b1;
  spi_m.SSB=1'b1;
  spi_sender.SPI_COMMAND_WRITE(my_data);
  repeat (10)
  begin
   =========================spi_sender.SPI_TRASH_WRITER(file);
  end
  spi_sender2=null;
  $stop;
end    

endprogram


class Packet;
bit [7:0] commands_array [] ='{`NOP,`CR,`RT,`WT,`SI,`SIL,`RO1,`RO2,`RO4,`RO8,`TZ1,`TZ2,`TZ12,`TZ0,`SM,`WU};
typedef bit [7:0] command_payload_t [3];
rand int command_index;
rand command_payload_t data;

constraint inside_sixteen {
  command_index inside {[0:16]};}
endclass

class spi_simple_class;

virtual spi_bus_i spi;
=================================================int file;
const int tcs_sclk=100;
const int tsclk_cs=100;
  typedef bit [7:0] my_data [3];
  rand my_data data;
    function new (virtual spi_bus_i spi);
     this.spi=spi;
    endfunction

task SPI_COMMAND_WRITE (bit [7:0] data []);
         endtask

===================================task SPI_TRASH_WRITER(input int file);
  Packet p;
  bit [7:0] data [3];
  p=new;
   begin
    assert(p.randomize());
    $fdisplay(file, "Send packet over SPI time inside class=%0t p.data= %p",  $realtime ,p.data);
     data[0]=p.commands_array[p.command_index];
     data[1:2]=p.data[1:2];
     $display("p.data= %p", data);
     SPI_COMMAND_WRITE(data);
   end  
endtask  
endclass


Как объявить переменную чтобы она была видна всем объектам использующимся в программе?

Спасибо
dvladim
А вы Бержерона читали?

Он там, конечно, не о СВ а о Верилоге и ВХДЛ, но общая идея такая:
Он использует несколько модулей верхнего уровня один из которых syslog. В этом модуле несколько task-ов и вызывет он их как syslog.note("msg"); syslog.error("msg"); ну и т.д. А в тасках, соответственно, врапперы для сообщений ошибок и всего такого. Переписываешь враппер и перенаправляешь куда хочешь - хоть в файл, хоть на экран. Опять же можно и количество посчитать.
des00
Цитата(dvladim @ Jul 30 2008, 12:59) *
Он там, конечно, не о СВ а о Верилоге и ВХДЛ, но общая идея такая:


автор плодороден, он и про СВ много писал smile.gif))

но идея та. используйте так называемый сервер/службу сообщений. самостоятельный объект в который передаете логи. В этом объекте static переменная, которая видна всем экземплярам класса.
указатель на службу можете передавать в классы.

Еще проще использовать базовые классы OVM, там в каждом базовом классе защит механизм коннекта к серверу сообщений, тогда там будет все проще.

а в вашем конкретном случае, могли бы и public переменную в классе сделать и присвоить ее в конструкторе или после создания класса %)))

удачи.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.