Jump to content
    

Как в Synplify на стадии синтеза вывести кастомное сообщение об ошибке?

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

 

В 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 by VoltageCurrent

Share this post


Link to post
Share on other sites

Стесняюсь спросить, а в документации на Синплифай на эту тему что-нибудь написано?

Share this post


Link to post
Share on other sites

В 22.06.2022 в 10:20, andrew_b сказал:

Стесняюсь спросить, а в документации на Синплифай на эту тему что-нибудь написано?

Нет, в документе Synopsys Synplify Pro for Microsemi Edition User Guide по слову "$error" не находится ни одного совпадения. Стесняюсь спросить, а почему вы спрашиваете?

Edited by VoltageCurrent

Share this post


Link to post
Share on other sites

Ну потому что поиск ответа на вопрос надо начинать или с чтения документации на САПР, или с поиска в Гугле/Яндексе/etc. Поскольку вы об этом не упомянули, возникло ощущение, что вы пытаетесь решить проблему методом тыка без чтения мануалов.

Share this post


Link to post
Share on other sites

В 22.06.2022 в 10:43, andrew_b сказал:

Ну потому что поиск ответа на вопрос надо начинать или с чтения документации на САПР, или с поиска в Гугле/Яндексе/etc. Поскольку вы об этом не упомянули, возникло ощущение, что вы пытаетесь решить проблему методом тыка без чтения мануалов.

Аа. Не, я поковырял Гугл изрядно. В том числе, нашёл на electronix тему 12-летней давности Verilog. Создание сообщений об ошибках, где нет внятных ответов. А также, нашёл практически эталонный образец творчества в духе "Тем, кто и так знает, всё будет кристально ясно. Те, кто сталкиваются в первый раз - не поймут ничего" про ассерты (код выполнен в виде картинок, лайк!). Потом уже попробовал метод тыка (в Quartus всё получилось именно благодаря ему). А уже потом написал сюда.

Edited by VoltageCurrent

Share this post


Link to post
Share on other sites

Похоже никак, в гайде 2020 года написано:

image.thumb.png.f82881d7b7133bdc9cfc10fea56b130b.png

Share this post


Link to post
Share on other sites

В 22.06.2022 в 11:10, makc сказал:

Похоже никак, в гайде 2020 года написано:

Если так, то это офигенно! Не, я просто не пойму Synopsys, это же не ООП реализовать в синтезатор! Это же просто... сообщения! Подобный код не то, что второкурсник - продвинутый 10-классник написал бы.

 

И в дополнение к этому, так милы советы: "Не, а вот нужно параметризовывать модули. Вот вы параметризуете, отладите, натычете туда дефайнов и познаете мудрость бытия, счастье и (возможно) богатство!" Да-да, можно обпараметризоваться, а потом нафигачить дичь в самих параметрах и всё пойдёт по ммм... по коричневой субстанции. Потому, что за 15 лет в синтезаторе не реализовали выполнение $error. А я ещё ругался на Альтеру за неполную поддержку SV. Да подразделение Квартуса - чёртовы герои СистемВерилога!

Edited by VoltageCurrent

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites

11 минут назад, VoltageCurrent сказал:

Если так, то это офигенно! Не, я просто не пойму Synopsys, это же не ООП реализовать в синтезатор! Это же просто... сообщения! Подобный код не то, что второкурсник - продвинутый 10-классник написал бы.

Вроде бы у них есть поддержка SVA (SystemVerilog Assertions). И это может быть решением для вашей проблемы.

Share this post


Link to post
Share on other sites

В 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 by VoltageCurrent

Share this post


Link to post
Share on other sites

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 может быть любой другой сигнал. синтез остановится с точкой на этой строке, а там в коментах написано что делать)

ЗЫ. Код заменил) вот так делали

Share this post


Link to post
Share on other sites

В 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 by VoltageCurrent

Share this post


Link to post
Share on other sites

Just now, VoltageCurrent said:

Спасибо большое, но чую, иные синтезаторы могут залезть внутрь if-а вне зависимости от значения его условия. И обнаружить ошибку. Думаю, как бы покрасивей вызывать костылеобразное деление на ноль - это могло бы быть более кросплатформенно. Надо будет попробовать и то и другое.

в случае генерейтов нет, они обрабатываются до синтеза логики. Этот метод использую лет 15 на разных платформах, особенно когда другим свой код даю. Никто не жаловался. 

Share this post


Link to post
Share on other sites

В 22.06.2022 в 11:47, des00 сказал:

в случае генерейтов нет, они обрабатываются до синтеза логики. Этот метод использую лет 15 на разных платформах, особенно когда другим свой код даю. Никто не жаловался. 

Что же, тогда большое спасибо за проверенное опытом решение!

 

Теплится надежда, что @makc подскажет решение, основанное на ассертах, но согласно тому, что я про них читал, этот механизм применим лишь к стадии симуляции.

Share this post


Link to post
Share on other sites

7 минут назад, VoltageCurrent сказал:

Теплится надежда, что @makc подскажет решение, основанное на ассертах, но согласно тому, что я про них читал, этот механизм применим лишь к стадии симуляции.

Похоже вы правы, ассерт сам по себе сработает, но вот обеспечить необходимую реакцию уже никак не получится.

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

×
×
  • Create New...