|
|
  |
Запись симуляции в лог SV, как лучше? |
|
|
|
Jul 30 2008, 09:47
|
Вечный ламер
     
Группа: Модераторы
Сообщений: 7 248
Регистрация: 18-03-05
Из: Томск
Пользователь №: 3 453

|
Цитата(-=Vitaly=- @ Jul 30 2008, 04:22)  Здравствуйте.
Подскажите наиболее оптимально в СистемВерилоге сохранить ход симуляции в файл?
Я попробовал внутри класса вставить в таск $fwrite но Квесте не понравилось. Такой вариант вообще возможен?
Заранее спасибо. а файлик открыть? а проверить что указатель валидный ? а указать функциям файлового ввода вывода указатель на файлик ? а корректно его закрыть ? все как в с/с++ в общем  )) читайте стандарт на верилог удачи !!!
--------------------
|
|
|
|
|
Jul 30 2008, 11:26
|

Местный
  
Группа: Свой
Сообщений: 468
Регистрация: 31-08-06
Из: Киев
Пользователь №: 19 991

|
Цитата(des00 @ Jul 30 2008, 12:47)  а файлик открыть? а проверить что указатель валидный ? а указать функциям файлового ввода вывода указатель на файлик ? а корректно его закрыть ? все как в с/с++ в общем  )) читайте стандарт на верилог удачи !!! Да тут конкретно Квеста говорит Hierarchical reference file not allowed from within package. Наверное все таки так нельзя Спасибо
|
|
|
|
|
Jul 30 2008, 11:31
|
Вечный ламер
     
Группа: Модераторы
Сообщений: 7 248
Регистрация: 18-03-05
Из: Томск
Пользователь №: 3 453

|
Цитата(-=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
--------------------
|
|
|
|
|
Jul 30 2008, 13:19
|

Местный
  
Группа: Свой
Сообщений: 468
Регистрация: 31-08-06
Из: Киев
Пользователь №: 19 991

|
Цитата(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 Спасибо!
|
|
|
|
|
Jul 30 2008, 14:34
|

Местный
  
Группа: Свой
Сообщений: 468
Регистрация: 31-08-06
Из: Киев
Пользователь №: 19 991

|
Вот так вот работает, но чувствую что это некрасиво. Особенно если логить много прийдется надо все время передавать указатель на файл. Код 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 Как объявить переменную чтобы она была видна всем объектам использующимся в программе? Спасибо
|
|
|
|
|
Jul 31 2008, 03:40
|
Вечный ламер
     
Группа: Модераторы
Сообщений: 7 248
Регистрация: 18-03-05
Из: Томск
Пользователь №: 3 453

|
Цитата(dvladim @ Jul 30 2008, 12:59)  Он там, конечно, не о СВ а о Верилоге и ВХДЛ, но общая идея такая: автор плодороден, он и про СВ много писал  )) но идея та. используйте так называемый сервер/службу сообщений. самостоятельный объект в который передаете логи. В этом объекте static переменная, которая видна всем экземплярам класса. указатель на службу можете передавать в классы. Еще проще использовать базовые классы OVM, там в каждом базовом классе защит механизм коннекта к серверу сообщений, тогда там будет все проще. а в вашем конкретном случае, могли бы и public переменную в классе сделать и присвоить ее в конструкторе или после создания класса %))) удачи.
--------------------
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|