Есть ли способ условно вызвать ошибку времени компиляции в Verilog?

9

У меня есть параметризованный модуль в Verilog, где параметры - это тактовая частота и частота обновления, которая используется для расчета количества циклов бездействия, вставленных между экземплярами повторяющейся операции. Тем не менее, очень легко установить параметры, которые не могут быть достигнуты (потому что операция занимает нетривиальный промежуток времени, поэтому повторение должно произойти до того, как она будет завершена), и в данный момент проект не дает никакой обратной связи на этом.

Мне было интересно, есть ли какой-нибудь способ, которым я мог бы вызвать ошибку во время синтеза (или компиляции до моделирования), если условия не могут быть выполнены (то есть, если один локальный параметр меньше другого)? Возможно, это какой-то эквивалент популярного взлома C / C ++ во время компиляции.

Жюль
источник

Ответы:

10

Я уверен, что есть какой-то способ привязки в обратном вызове времени компиляции C / C ++. Однако, пока ваши generateблоки поддержки (введены в IEEE Std 1364-2001), вы можете сделать что-то вроде следующего:

generate
if (CONDITION > MAX_ALLOWED /* your condition check */ ) begin
    illegal_parameter_condition_triggered_will_instantiate_an non_existing_module();
end
endgenerate

Если условие истинно, то компилятор выдаст ошибку, потому что есть запрос на то, чего не существует. Если условие ложно, то операция пропускается. Единственным требованием является то, что код недопустимого условия следует легальному синтаксису Verilog, и недопустимое условие никогда не станет случайно действительным (отсюда и длинное и подробное несуществующее имя модуля).

Если ваш симулятор и инструменты синтеза поддерживают стандарт IEEE Std 1800-2009 (редакция SystemVerilog, выпущенная в 2009 г.) или более новую редакцию, вы можете использовать $error()и дать более значимое сообщение, чтобы исправить ошибку. Я не уверен, что кто-нибудь из продавцов реализовал эту функцию. Это должно стать предпочтительным методом, как только большинство продавцов реализовано, поэтому я приведу пример:

generate
if (CONDITION > MAX_ALLOWED /* your condition check */ ) begin
    $error("%m ** Illegal Condition ** CONDITION(%d) > MAX_ALLOWED(%d)", CONDITION, MAX_ALLOWED);
end
endgenerate
Greg
источник
1

Вы могли бы сделать что-то вроде этого:

module test();

  parameter VALUE=16;

  // VALUE should be between 16 and 64
  wire [64:16] range_for_value;
  assign range_for_value[VALUE] = 1'b0;

endmodule

Инструменты могут обрабатывать это немного по-другому, но если они VALUEне находятся в ожидаемом диапазоне, это действительно должно быть ошибкой, поскольку битовый индекс для оператора assign будет выходить за пределы range_for_value.

dwikle
источник
1

Правда ли, что в Verilog нет ничего подобного «утверждению»? Это довольно простые вещи!

Если ваши инструменты поддерживают смешанный язык, вы можете добавить модуль, который является просто сущностью VHDL с необходимыми портами или обобщениями и очевидным оператором ASSERT. Для условий, определяемых временем компиляции или разработки, это будет одинаково хорошо работать в симе или синтезе (по крайней мере, с XST или Synplicity).

entity CheckSize is
   generic (depth : natural := 16);
   port (data : std_logic_vector);
end CheckSize;

architecture empty of CheckSize is
begin
   Assert depth * data'length <= 256 Report "Size too large!" 
      severity Failure;
end empty;

Пока что ни один из ответов не является действительно удовлетворительным, за исключением, возможно, $ error () «System Verilog 2009», но это, вероятно, самый простой из широкого спектра инструментов.

Брайан Драммонд
источник