Параметризованные функции SystemVerilog в Quartus II

У меня есть следующий код, файл c.sv:

virtual class C#(parameter W = 32); // line #2 where error message points
    static function logic [W-1 : 0] f(input logic [W-1 : 0] in);
        return ~in;
    endfunction
endclass

Затем я вызываю его из top.sv:

`include "c.sv"
module top(input wire [3:0] key, ouptut wire [3:0] led);
    assign led = C#(4)::f(sw);
endmodule

В ModelSim 10.3d он работает нормально, но Quartus II x64 15.0.1 build 150 сообщает об этой ошибке после анализа и синтеза:

Ошибка (10170): синтаксическая ошибка Verilog HDL в c.sv (2) рядом с текстом «виртуальный»; ожидая описания

Если я закомментирую inlcude "c.sv" и заменю вызов функции простым индикатором ~, тогда он будет работать на плате разработчика.

Что я делаю неправильно?


person Mishka    schedule 09.09.2015    source источник


Ответы (1)


К сожалению, в настоящее время нет возможности поддерживать параметризованные функции в Altera Quartus. Вам доступны следующие варианты действий:

  1. Подайте заявку в службу поддержки с помощью Altera
  2. Используйте сторонний инструмент синтеза и загрузите список соединений в Quartus
  3. Измените код, сделав его менее универсальным

Вариант 2, конечно же, предполагает выделение нетривиальной суммы денег. Компилятор Synopsys Design Compiler поддерживает эту конструкцию, ваш опыт работы с другими инструментами может отличаться.

Для варианта 3 вы можете прибегнуть к макросам, сгенерированному коду или необязательной компиляции файла для достижения аналогичного результата.

Несколько удручает то, что эта возможность недоступна для пользователей Altera FPGA. Пожалуйста, поднимите заявку на благо сообщества независимо от того, какой образ действий вы выберете. Чем больше будет спрос, тем больше вероятность, что Altera реализует эту функцию.

Существует еще несколько обсуждений и прототипов возможных обходных решений, которые не включают классы в "Ширина независимые функции "вопрос.

person Chiggs    schedule 09.09.2015
comment
Кстати, конструкция let предназначена для определения функций без типов, чтобы вы могли писать let f(in) = ~in; без использования классов или параметризации. Я считаю, что это еще не поддерживается Quartus, но я думаю, что у них будет больше шансов реализовать это в первую очередь. - person dave_59; 09.09.2015
comment
@ dave_59 действительно, конструкция let была бы очень полезной! К сожалению, производители FPGA, похоже, не имеют никакого желания внедрять SV сверх того, что у них уже есть. Радости #semiEDA ... - person Chiggs; 09.09.2015
comment
Список желаний функций, которые следует синтезировать, напоминает мне 2014-DVCon Статья о синтезе ASIC-FPGA SV. В приложении есть таблица, в которой псевдоанонимные синтезаторы сравниваются с кратким списком возможностей. Я хотел бы видеть более обширный список, включающий let, foreach, атрибуты (* *), _4 _ – _ 5_, может быть, даже alias и методы сокращения массива (.sum, .product) - person Greg; 09.09.2015
comment
@greg действительно. Было бы неплохо определить синтезируемое подмножество и иметь какой-то определенный набор тестов для сертификации как SV-совместимый. В настоящее время я подозреваю, что HLS обгонит SV до того, как многие инновационные функции когда-либо будут реализованы или широко используются. Продавцы относятся к SV как к синтаксическому сахару, который является пустой тратой и сдерживает темпы развития ... - person Chiggs; 10.09.2015