Перейти к содержанию
    

Verilog. Создание сообщений об ошибках

День добрый.

Решил я написать для собственных нужд маленькую библиотечку часто используемых модулей. Библиотечка включает ряд модулей, в которых параметры оказалось удобно (а иногда необходимо - например, для модулей с RAM-блоками) задавать строковыми константами. И вот тут сразу же полезли проблемы.

Очевидно, что допустимые значения строковых константы могут содержать определенный диапазон значений. Например, если в модуле подключается какая-нибудь лабуда константами "on"/"off", или выбирается тип арифмитеческих операций "signed"/"unsigned", или делается еще что-нибудь этакое, то появляется необходимость проверки правильности ввода. Например, если некий погромист введет в тип "znakovie", то хотелось бы указать ему на его некорректные действия с помощью сообщения об ошибке.

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

 

Сейчас выхожу из ситуации написанием чего-нибудь вроде указанного:

parameter pStringParameter="Enable";

wire [0:0]Error_WrongStringParameter;

assign Error_WrongStringParameter[(pStringParameter=="Enable" | pStringParameter=="Disable")?0:1]=1'b1;

При этом, если ввести неправильный вариант строки, то сразу же вылезет сообщение, что мол WrongStringParameter подключен неверно. Побочные эффекты очевидны:

-- реализация системы выдачи ошибок через жопу;

-- невозможность выдать подробный отчет, например, выдать список допустимых параметров;

-- затруднительность реализации при большом числе значений констант;

-- когда все хорошо, появляются варнинги: Error объявлен, но не используется - что нарушает эстетическую красоту отчета комилятора.

 

Так что вопроса четыре.

1) Можно ли выдать ошибку какой-либо командой, например 'error "Чо пишешь, дятел????"

2) Если нет, то как можно решить проблему более красиво?

3) Если никак, то как задисаблить варнинги в конкретной точке описания?

4) Вообще, такие проблемы у кого-нибудь возникали, или я придумываю их себе сам, чтобы с успехом попытаться решить?

 

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

Изменено пользователем Ethereal

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Не знаю, правильно ли я понял вашу проблему. О системном вызове $display вы знаете? Пример:

    integer errors;
    . . .
    $display("=====================================");
    if (errors == 1)
        $display(" Test completed with 1 error");
    else if (errors)
        $display(" Test completed with %d errors", errors);
    else  
        $display(" Test completed without errors");
    $display("=====================================");

errors - это вектор ошибок, который увеличивается на 1 при возникновении любой ошибки.

В SystemVerilog есть специальные вызовы, которые разделяют ошибки по степени важности:

* $info (информационное сообщение);

* $warning (предупреждение);

* $error (сообщение об ошибке);

* $fatal (сообщение о сбое или отказе в работе).

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Не знаю, правильно ли я понял вашу проблему. О системном вызове $display вы знаете? Пример:

Знаю. Но насколько я помню, это ран-тайм (sim-тайм) вывод сообщений? Мне нужен компайл-тайм с остановкой компиляции.

Изменено пользователем Ethereal

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Вы компилируете в Quartus?..

 

Если да, то я для себя решил подобную проблему средствами AHDL. В этом языке есть команда ASSERT которая в процессе компиляции в Квартусе выдаст требуемое сообщение, в ранге информации или ошибки.

Делал модуль с фейковыми входами-выходами и подключал с проекту. Мог показывать текст, значение параметра, и т.п. В том числе останавливать компиляцию.

Сообщите, если нужен пример кода, поищу.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Вы компилируете в Quartus?..

Да.

Судя по описанию, как раз то, что нужно.

 

Сообщите, если нужен пример кода, поищу.

Если не затруднит, поищите, пожалуйста.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

В SystemVerilog тоже есть assert, и, вроде, Quartus его поддерживает. Попробуйте.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

В SV есть compile time $info $warning $error $fatal (в добавление к ним же run time). Не уверен по поводу поддержки их в Quartus :(

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Если не затруднит, поищите, пожалуйста.

 

Код AHDL (сохраните в файле assert_trick.tdf и подключите его к проекту):

parameters (
assert_instance_name	= "NO",	 
assert_info_param_num 	= 0,
assert_info_param_str 	= "NO",
assert_error_str 		= "NO",	
assert_error_num 		= 0	
);
SUBDESIGN assert_trick
(
fake_inp		: INPUT;
fake_outp		: OUTPUT;
)
BEGIN

ASSERT (assert_instance_name == "NO")
	REPORT "#assert_trick#   MESSAGE FROM: %   ###"	assert_instance_name
	SEVERITY  INFO;

ASSERT (assert_info_param_str == "NO") 
	REPORT "#assert_trick#   %   ###"	assert_info_param_str
	SEVERITY  INFO;

ASSERT (assert_info_param_num == -1)
	REPORT "#assert_trick#   VALUE: %   ###"	assert_info_param_num
	SEVERITY  INFO;


ASSERT (assert_error_str == "NO")
	REPORT "#assert_trick#   ERROR FROM: %. MESSAGE: %. VALUE: %.   ###"	assert_instance_name,  assert_error_str, assert_error_num
	SEVERITY  ERROR;

fake_outp	= fake_inp;
END;

 

Пример использования в Верилоге-2003 (вставьте в том файле где нужно проверять параметры):

assert_trick #(
	.assert_instance_name	("my_DUT_module.v"),
	.assert_info_param_num	(DUT_PARAMETER),
	.assert_info_param_str	("DUT_PARAMETER value")
) info_assert_017 ();

- выдаст строчки в логе компиляции, в ранге ИНФО, выделенные "###".

 

Если нужна остановка компиляции:

assert_trick #(
	.assert_instance_name	("my_DUT_module.v"),
	.assert_error_num	        (DUT_PARAMETER),
	.assert_error_str                ("DUT_PARAMETER has ERROR value!")
) error_assert_007 ();

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

В SystemVerilog тоже есть assert, и, вроде, Quartus его поддерживает. Попробуйте.

Попробую. Хотя я на него еще не перешел. У меня пока только Квартус, а по отзывам на форуме я понял, что Ква плохо поддерживает СВ.

 

Код AHDL (сохраните в файле assert_trick.tdf и подключите его к проекту):

Спасибо большое.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Попробую. Хотя я на него еще не перешел. У меня пока только Квартус, а по отзывам на форуме я понял, что Ква плохо поддерживает СВ.

Это смотря в сравнении с чем; наверное - с Simplify / Precision. Ибо XST (синтезатор Xilinx) не поддерживает его совсем: V2001 и всё (с учётом того, что на календаре "2010" а не "2001" - путается, видимо :blink: ).

Для Quartus при синтезе делал примерно как Вы в первом сообщении - специальный модуль, выдававший очень характерную ошибку при синтезе

http://electronix.ru/forum/index.php?showtopic=51290

потом перешёл на макрос с generate

//Проверка условия на ИСТИННОСТЬ (на уровне модуля, не в процедурном коде); хак специально
//для слишком дотошного ModelSim, проверяющего даже неактивные ветки generate.
//Недостаток: не может использоваться внутри блоков generate.
`define IL_ASSERT(TEST)         generate if (!(TEST)) begin \
                                  reg [(1'bx >> (TEST)):0] r; \
                                end endgenerate //Presence of some comment here is a
                                                //XilinxISE-required magic :)

- при срабатывании он всегда жёстко останавливает синтез и не позволяет выдавать сообщений, зато написан на чистом Verilog, то есть может быть включён в кроссплатформенный код.

Для Xilinx (в Quartus, по крайней мере 8.0 подобное не проходило, проверено) есть ещё один способ, подсмотернный в родных Xilinx'овских моделях, по-моему в их "макромодуле" RAM. Ставится блок initial с проверкой и, в ветке нарушения, командами $display для выдачи сообщения и $stop для остановки. Хотя $stop должна останавливать симуляцию, при такой конструкции именно XST останавливает и синтез (или какой-то из этапов реализации, может, и translate / map, не помню), предварительно выдавая указанное сообщение. Причём ситуация может вызывать недоумение: в "errors" пусто (сообщение выводится в "'warnings"), "0 errors", а процесс останавливается, не дойдя до конца - не пугайтесь.

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

У меня пока только Квартус, а по отзывам на форуме я понял, что Ква плохо поддерживает СВ.

В Handbook на Quartus есть внушительный список поддерживаемых конструкций SV. На мой взгляд, этого достаточно, чтобы перейти на SV. По поводу assert там же написано так: "Quartus II integrated synthesis also parses, but otherwise ignores the SystemVerilog assertions".

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
К сожалению, ваш контент содержит запрещённые слова. Пожалуйста, отредактируйте контент, чтобы удалить выделенные ниже слова.
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...