Переопределение/расширение сервера ошибок ovm может потребоваться в следующих случаях:
Реализация единственного объекта ovm_report_server выполнена в классе ovm_report_global_server (исходник ovm_report_server.svh).
Обратим внимание на параметр переменной static и конструктор if (global_report_server == null) global_report_server = new;
Рассмотрим на примере как переопределить сервер сообщений в ovm: "разукрасим" все ошибки и фатальные_ошибки красным:
Для запуска примера необходимо скомпилировать пакет ovm и скормить моделировщику приведённый выше пример. Большинство современных систем моделирования имеют встроенную поддержку библиотеки ovm, поэтому подключение ovm может быть выполнено указанием ключа "использовать ovm":
Результат моделирования выглядит следующим образом:
PS. несколько слов про форматирование цветом. Надо понимать, что разукраска есть вставление управляющих символов в поток сообщений. Это может влиять на результат грепанья лога моделирования. В данном случае при поиске строки
$ grep 'reporter \[info\]' simulation.log будет находиться первая строка, однако при поиске
$ grep 'reporter \[error-id\]' simulation.log 2-ая строка найдена не будет, т.к строка превратилась в [31mreporter [0m [ [31merror-id [0m] [31m
- перенаправление сообщений из ovm в собственную систему сбора сообщений.
- вызов callback при каком-либо условии: например, создать поток транзакций ошибок и все ошибки (фактически вызовы ovm_report_error ) выводить как на консоль так и в поток транзакций.
- переформатирование сообщений: например, изменение формата времени моделирования или, более полезное, печать сообщений ovm_report_error в консоль красным цветом
- переформатирование финального хвоста, т.е 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: "разукрасим" все ошибки и фатальные_ошибки красным:
- Для этого создадим класс coloured_report_server наследующий от класса ovm_report_server и переопределим виртуальную функцию compose_message - для изменения форматирования сообщения (так же для переопределения доступны: summarize - при печати финального сообщения и process_report)
- создадим объект класса 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
Комментариев нет:
Отправить комментарий