VoltageCurrent 0 June 22 Posted June 22 (edited) · Report post Хочу, чтобы внутри моего библиотечного модуля происходила проверка входных параметров. И если они не удовлетворяют определённым условиям, то на стадии синтеза выдавалась бы осмысленная ошибка с указанием на то, какие параметры и как именно не удовлетворяют условиям. В Quartus для этой цели я сделал проверку параметров в блоке initial: module test_module #(parameter TEST_PARAM = 1) (input some_in, output some_out); initial begin if(TEST_PARAM == 1) $error("TEST_PARAM must be zero"); end assign some_out = some_in; endmodule ...и Quartus исправно выдаёт данную ошибку. Пробую делать тоже самое в Synplify, он игнорирует $error, собирает проект и лишь выдаёт предупреждение, что: Цитата CG532: Within an initial block, only Verilog force statements and memory $readmemh/$readmemb initialization statements are recognized, and all other content is ignored При попытке вставить условие непосредственно в тело модуля, Synplify выдаёт такую ошибку: Цитата CG505: Ignoring system task $error. Supported only within an assertion А при попытке написать так: module test_module #(parameter TEST_PARAM = 1) (input some_in, output some_out); assert (TEST_PARAM == 1) $error("TEST_PARAM must be zero"); else $error("good!!"); assign some_out = some_in; endmodule ...Synplify всё собирает, не выдаёт никаких ошибок и не выводит мои сообщения. Вопрос: как в Synplify на стадии синтеза вывести кастомное сообщение об ошибке? P.S. Есть известный анекдот, в котором турист идёт по горам/лесам, встречает пожилого местного жителя и спрашивает его: - Добрый день, уважаемый! Скажите пожалуйста, не знаете ли вы, чем здесь так неприятно пахнет, прямо скажем, воняет? - О-о-о, молодой человек! Как-то раз один юноша из соседнего села... <далее идёт длинная-длинная история в духе Ромео-и-Джульетты> ...жили они долго и счастливо и/или умерли в один день! - А-а. Ясно. А пахнет-то чем? - Да фиг его знает, нагадил кто-то, наверное. Разбираясь с ассерт-ассет, кавер-фигавер и методологиями верификации, я понял, что про них написано очень много и очень заумно. И в первую очередь они нужны для симуляции, а к синтезу относятся весьма косвенно. Поэтому, хотелось бы пропустить все истории про Ромео-и-Джульетту и понять чем воняет, как решить типовую (как мне представляется) задачу вывода ошибки в зависимости от значения параметров на этапе синтеза. То есть: 1) может ли Synplify это делать? 2) И если да, то при помощи каких конкретно слов? Edited June 22 by VoltageCurrent Quote Share this post Link to post Share on other sites More sharing options...
andrew_b 0 June 22 Posted June 22 · Report post Стесняюсь спросить, а в документации на Синплифай на эту тему что-нибудь написано? Quote Share this post Link to post Share on other sites More sharing options...
VoltageCurrent 0 June 22 Posted June 22 (edited) · Report post В 22.06.2022 в 10:20, andrew_b сказал: Стесняюсь спросить, а в документации на Синплифай на эту тему что-нибудь написано? Нет, в документе Synopsys Synplify Pro for Microsemi Edition User Guide по слову "$error" не находится ни одного совпадения. Стесняюсь спросить, а почему вы спрашиваете? Edited June 22 by VoltageCurrent Quote Share this post Link to post Share on other sites More sharing options...
andrew_b 0 June 22 Posted June 22 · Report post Ну потому что поиск ответа на вопрос надо начинать или с чтения документации на САПР, или с поиска в Гугле/Яндексе/etc. Поскольку вы об этом не упомянули, возникло ощущение, что вы пытаетесь решить проблему методом тыка без чтения мануалов. Quote Share this post Link to post Share on other sites More sharing options...
VoltageCurrent 0 June 22 Posted June 22 (edited) · Report post В 22.06.2022 в 10:43, andrew_b сказал: Ну потому что поиск ответа на вопрос надо начинать или с чтения документации на САПР, или с поиска в Гугле/Яндексе/etc. Поскольку вы об этом не упомянули, возникло ощущение, что вы пытаетесь решить проблему методом тыка без чтения мануалов. Аа. Не, я поковырял Гугл изрядно. В том числе, нашёл на electronix тему 12-летней давности Verilog. Создание сообщений об ошибках, где нет внятных ответов. А также, нашёл практически эталонный образец творчества в духе "Тем, кто и так знает, всё будет кристально ясно. Те, кто сталкиваются в первый раз - не поймут ничего" про ассерты (код выполнен в виде картинок, лайк!). Потом уже попробовал метод тыка (в Quartus всё получилось именно благодаря ему). А уже потом написал сюда. Edited June 22 by VoltageCurrent Quote Share this post Link to post Share on other sites More sharing options...
makc 12 June 22 Posted June 22 · Report post Похоже никак, в гайде 2020 года написано: Quote Share this post Link to post Share on other sites More sharing options...
VoltageCurrent 0 June 22 Posted June 22 (edited) · Report post В 22.06.2022 в 11:10, makc сказал: Похоже никак, в гайде 2020 года написано: Если так, то это офигенно! Не, я просто не пойму Synopsys, это же не ООП реализовать в синтезатор! Это же просто... сообщения! Подобный код не то, что второкурсник - продвинутый 10-классник написал бы. И в дополнение к этому, так милы советы: "Не, а вот нужно параметризовывать модули. Вот вы параметризуете, отладите, натычете туда дефайнов и познаете мудрость бытия, счастье и (возможно) богатство!" Да-да, можно обпараметризоваться, а потом нафигачить дичь в самих параметрах и всё пойдёт по ммм... по коричневой субстанции. Потому, что за 15 лет в синтезаторе не реализовали выполнение $error. А я ещё ругался на Альтеру за неполную поддержку SV. Да подразделение Квартуса - чёртовы герои СистемВерилога! Edited June 22 by VoltageCurrent Quote Share this post Link to post Share on other sites More sharing options...
des00 1 June 22 Posted June 22 · Report post Если уж настолько критично проверить параметры, то в чем проблема сделать по олдскульному, вызывав гарантированную ошибку синтеза и добавив туда комментарий? Quote Share this post Link to post Share on other sites More sharing options...
makc 12 June 22 Posted June 22 · Report post 11 минут назад, VoltageCurrent сказал: Если так, то это офигенно! Не, я просто не пойму Synopsys, это же не ООП реализовать в синтезатор! Это же просто... сообщения! Подобный код не то, что второкурсник - продвинутый 10-классник написал бы. Вроде бы у них есть поддержка SVA (SystemVerilog Assertions). И это может быть решением для вашей проблемы. Quote Share this post Link to post Share on other sites More sharing options...
VoltageCurrent 0 June 22 Posted June 22 (edited) · Report post В 22.06.2022 в 11:28, des00 сказал: Если уж настолько критично проверить параметры, то в чем проблема сделать по олдскульному, вызывав гарантированную ошибку синтеза и добавив туда комментарий? Не вполне понимаю, как это сделать. module test_module #(parameter TEST_PARAM = 1) (input some_in, output some_out); <что-то, что должно вызвать ошибку, если тест_парам равен единице>//TEST_PARAM must be zero assign some_out = some_in; endmodule Что нужно вписать в код, чтобы он упал на синтезе при TEST_PARAM=1 и не упал при, скажем, TEST_PARAM=0 ? Что-нибудь типа такого: module test_module #(parameter TEST_PARAM = 1) (input some_in, output some_out); parameter dummy = 10/(TEST_PARAM-1);//TEST_PARAM must be zero assign some_out = some_in; endmodule В 22.06.2022 в 11:34, makc сказал: Вроде бы у них есть поддержка SVA (SystemVerilog Assertions). И это может быть решением для вашей проблемы. Предположим, что она есть. Как ею воспользоваться для решения данной задачи? Edited June 22 by VoltageCurrent Quote Share this post Link to post Share on other sites More sharing options...
des00 1 June 22 Posted June 22 · Report post 6 minutes ago, VoltageCurrent said: Что нужно вписать в код, чтобы он упал на синтезе при TEST_PARAM=1 и не упал при, скажем, TEST_PARAM=0 ? Во времена далекой далекой галактики делал как то так module test_module #(parameter TEST_PARAM = 1) (input some_in, output some_out); assign some_out = some_in; generate if (TEST_PARAM == 0) begin wire pipa[0:0]; assign pipa[-1] = 1'bz; // hahaha you are stupid. see parameter list decription end endgenerate endmodule вместо pipa может быть любой другой сигнал. синтез остановится с точкой на этой строке, а там в коментах написано что делать) ЗЫ. Код заменил) вот так делали Quote Share this post Link to post Share on other sites More sharing options...
VoltageCurrent 0 June 22 Posted June 22 (edited) · Report post В 22.06.2022 в 11:40, des00 сказал: Во времена далекой далекой галактики делал как то так module test_module #(parameter TEST_PARAM = 1) (input some_in, output some_out); assign some_out = some_in; generate if (TEST_PARAM == 0) begin wire pipa[1'bx] = 1'bz; // hahaha you are stupid. see paramter list decription end endgenerate endmodule вместо pipa может быть любой другой сигнал. синтез остановится с точкой на этой строке, а там в коментах написано что делать) Спасибо большое, но чую, иные синтезаторы могут залезть внутрь if-а вне зависимости от значения его условия. И обнаружить ошибку. Думаю, как бы покрасивей вызывать костылеобразное деление на ноль - это могло бы быть более кросплатформенно. Надо будет попробовать и то и другое на различных синтезаторах. Edited June 22 by VoltageCurrent Quote Share this post Link to post Share on other sites More sharing options...
des00 1 June 22 Posted June 22 · Report post Just now, VoltageCurrent said: Спасибо большое, но чую, иные синтезаторы могут залезть внутрь if-а вне зависимости от значения его условия. И обнаружить ошибку. Думаю, как бы покрасивей вызывать костылеобразное деление на ноль - это могло бы быть более кросплатформенно. Надо будет попробовать и то и другое. в случае генерейтов нет, они обрабатываются до синтеза логики. Этот метод использую лет 15 на разных платформах, особенно когда другим свой код даю. Никто не жаловался. Quote Share this post Link to post Share on other sites More sharing options...
VoltageCurrent 0 June 22 Posted June 22 · Report post В 22.06.2022 в 11:47, des00 сказал: в случае генерейтов нет, они обрабатываются до синтеза логики. Этот метод использую лет 15 на разных платформах, особенно когда другим свой код даю. Никто не жаловался. Что же, тогда большое спасибо за проверенное опытом решение! Теплится надежда, что @makc подскажет решение, основанное на ассертах, но согласно тому, что я про них читал, этот механизм применим лишь к стадии симуляции. Quote Share this post Link to post Share on other sites More sharing options...
makc 12 June 22 Posted June 22 · Report post 7 минут назад, VoltageCurrent сказал: Теплится надежда, что @makc подскажет решение, основанное на ассертах, но согласно тому, что я про них читал, этот механизм применим лишь к стадии симуляции. Похоже вы правы, ассерт сам по себе сработает, но вот обеспечить необходимую реакцию уже никак не получится. Quote Share this post Link to post Share on other sites More sharing options...