Ethereal 0 27 сентября, 2010 Опубликовано 27 сентября, 2010 (изменено) · Жалоба День добрый. Решил я написать для собственных нужд маленькую библиотечку часто используемых модулей. Библиотечка включает ряд модулей, в которых параметры оказалось удобно (а иногда необходимо - например, для модулей с 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) Вообще, такие проблемы у кого-нибудь возникали, или я придумываю их себе сам, чтобы с успехом попытаться решить? Заранее спасибо. Изменено 27 сентября, 2010 пользователем Ethereal Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
lexus.mephi 0 27 сентября, 2010 Опубликовано 27 сентября, 2010 · Жалоба Не знаю, правильно ли я понял вашу проблему. О системном вызове $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 (сообщение о сбое или отказе в работе). Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Ethereal 0 27 сентября, 2010 Опубликовано 27 сентября, 2010 (изменено) · Жалоба Не знаю, правильно ли я понял вашу проблему. О системном вызове $display вы знаете? Пример: Знаю. Но насколько я помню, это ран-тайм (sim-тайм) вывод сообщений? Мне нужен компайл-тайм с остановкой компиляции. Изменено 27 сентября, 2010 пользователем Ethereal Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Cordroy 0 27 сентября, 2010 Опубликовано 27 сентября, 2010 · Жалоба Вы компилируете в Quartus?.. Если да, то я для себя решил подобную проблему средствами AHDL. В этом языке есть команда ASSERT которая в процессе компиляции в Квартусе выдаст требуемое сообщение, в ранге информации или ошибки. Делал модуль с фейковыми входами-выходами и подключал с проекту. Мог показывать текст, значение параметра, и т.п. В том числе останавливать компиляцию. Сообщите, если нужен пример кода, поищу. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Ethereal 0 27 сентября, 2010 Опубликовано 27 сентября, 2010 · Жалоба Вы компилируете в Quartus?.. Да. Судя по описанию, как раз то, что нужно. Сообщите, если нужен пример кода, поищу. Если не затруднит, поищите, пожалуйста. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ViKo 1 28 сентября, 2010 Опубликовано 28 сентября, 2010 · Жалоба В SystemVerilog тоже есть assert, и, вроде, Quartus его поддерживает. Попробуйте. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
xvr 12 28 сентября, 2010 Опубликовано 28 сентября, 2010 · Жалоба В SV есть compile time $info $warning $error $fatal (в добавление к ним же run time). Не уверен по поводу поддержки их в Quartus :( Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Cordroy 0 28 сентября, 2010 Опубликовано 28 сентября, 2010 · Жалоба Если не затруднит, поищите, пожалуйста. Код 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 (); Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Ethereal 0 28 сентября, 2010 Опубликовано 28 сентября, 2010 · Жалоба В SystemVerilog тоже есть assert, и, вроде, Quartus его поддерживает. Попробуйте. Попробую. Хотя я на него еще не перешел. У меня пока только Квартус, а по отзывам на форуме я понял, что Ква плохо поддерживает СВ. Код AHDL (сохраните в файле assert_trick.tdf и подключите его к проекту): Спасибо большое. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Intekus 0 28 сентября, 2010 Опубликовано 28 сентября, 2010 · Жалоба Попробую. Хотя я на него еще не перешел. У меня пока только Квартус, а по отзывам на форуме я понял, что Ква плохо поддерживает СВ. Это смотря в сравнении с чем; наверное - с 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", а процесс останавливается, не дойдя до конца - не пугайтесь. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ViKo 1 29 сентября, 2010 Опубликовано 29 сентября, 2010 · Жалоба У меня пока только Квартус, а по отзывам на форуме я понял, что Ква плохо поддерживает СВ. В Handbook на Quartus есть внушительный список поддерживаемых конструкций SV. На мой взгляд, этого достаточно, чтобы перейти на SV. По поводу assert там же написано так: "Quartus II integrated synthesis also parses, but otherwise ignores the SystemVerilog assertions". Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться