четверг, 8 сентября 2011 г.

Пример переопределения сервера ovm (uvm)

Переопределение/расширение сервера ошибок ovm может потребоваться в следующих случаях:
  1. перенаправление сообщений из ovm в собственную систему сбора сообщений.
  2. вызов callback при каком-либо условии: например, создать поток транзакций ошибок и все ошибки (фактически вызовы ovm_report_error ) выводить как на консоль так и в поток транзакций.
  3. переформатирование сообщений: например, изменение формата времени моделирования или, более полезное, печать сообщений ovm_report_error в консоль красным цветом
  4. переформатирование финального хвоста, т.е summary. Обычно по специально заточенной строке в summary инструменты регрессионного тестирования определяют успешность завершения теста (test passed, test failed).

Как известно, сервер сообщений в ovm реализован как синглтон (singleton) (синглтон на википедии). Использование синглтона необходимо для хранения единой базы о всех вызовах функций сообщений (т.е счётчиков сообщений и ошибок, словарь [id-сообщения]:счётчик и т.д).

Реализация единственного объекта ovm_report_server выполнена в классе ovm_report_global_server (исходник ovm_report_server.svh).
Обратим внимание на параметр переменной static и конструктор if (global_report_server == null) global_report_server = new;

Рассмотрим на примере как переопределить сервер сообщений в ovm: "разукрасим" все ошибки и фатальные_ошибки красным:
  1. Для этого создадим класс coloured_report_server наследующий от класса ovm_report_server и переопределим виртуальную функцию compose_message - для изменения форматирования сообщения (так же для переопределения доступны: summarize - при печати финального сообщения и process_report)
  2. создадим объект класса coloured_report_server и заменим ссылку на созданный объект в ovm_report_global_server.



import ovm_pkg::*;

`define BLACK(str)   {`"\033[30m`",str,`"\033[0m`"}
`define RED(str)     {`"\033[31m`",str,`"\033[0m`"}
`define GREEN(str)   {`"\033[32m`",str,`"\033[0m`"}
`define YELLOW(str)  {`"\033[33m`",str,`"\033[0m`"}
`define BLUE(str)    {`"\033[34m`",str,`"\033[0m`"}
`define MAGENTA(str) {`"\033[35m`",str,`"\033[0m`"}
`define CYAN(str)    {`"\033[36m`",str,`"\033[0m`"}
`define WHITE(str)   {`"\033[37m`",str,`"\033[0m`"}

`define BOLD(str)    {`"\033[1m`",str,`"\033[0m`"}

class coloured_report_server extends ovm_report_server;

    function string compose_message(
            ovm_severity severity,
            string name,
            string id,
            string message,
            string filename,
            int    line
      );
        string result;
        if ((severity==OVM_ERROR) || (severity==OVM_FATAL))
            result=super.compose_message(severity, `RED(name), `RED(id), `RED(message), filename, line);
        else
            result=super.compose_message(severity, name, id, message, filename, line);
        return result;
    endfunction
//you can overload virtual function void summarize(OVM_FILE file=0);
endclass

module coloured_server_test;
   initial begin
     coloured_report_server new_server;
     ovm_report_global_server glob;
     glob=new();
     new_server=new();
     glob.set_server(new_server);
   end

   initial begin:printing_block
     #1; //delay is needed for the first initial to finish
     ovm_report_info("info",$sformatf("info from: '%m'"));
     ovm_report_error("error-id", "printing in red"); 
     //ovm_run_test();
   end
endmodule


Для запуска примера необходимо скомпилировать пакет ovm и скормить моделировщику приведённый выше пример. Большинство современных систем моделирования имеют встроенную поддержку библиотеки ovm, поэтому подключение ovm может быть выполнено указанием ключа "использовать ovm":

 $mysimulator -useovm coloured_report_server.sv 

Результат моделирования выглядит следующим образом:

 OVM_INFO @ 1: reporter [info] info from: 'coloured_server_test.printing_block'
OVM_ERROR @ 1: reporter [error-id] printing in red



PS. несколько слов про форматирование цветом. Надо понимать, что разукраска есть вставление управляющих символов в поток сообщений. Это может влиять на результат грепанья лога моделирования. В данном случае при поиске строки
$ grep 'reporter \[info\]' simulation.log будет находиться первая строка, однако при поиске
$ grep 'reporter \[error-id\]' simulation.log 2-ая строка найдена не будет, т.к строка превратилась в [31mreporter [0m [ [31merror-id [0m] [31m

Комментариев нет:

Отправить комментарий