Не удается создать файл символов для модуля, поскольку порт имеет неподдерживаемый тип - PullRequest
1 голос
/ 25 апреля 2020

У меня странная проблема, когда Quartus не генерирует файл символов для следующего кода:

module bin_to_bcd #(parameter N_DIGITS = 4) (count, bcd_output);

input wire [$clog2(9999)-1:0] count;
output reg [(N_DIGITS<<2)-1:0] bcd_output;

integer i;
integer decade;

always @ (count) begin
    bcd_output = 'b0;
    for(i = $clog2(9999) - 1; i >= 0; i = i - 1) begin
        for(decade = 1; decade < N_DIGITS + 1; decade = decade + 1) begin
            if(bcd_output[(decade<<2) - 1 -: 4] >= 5) begin
                bcd_output[(decade<<2) - 1 -: 4] = bcd_output[(decade<<2) - 1 -: 4] + 3;
            end
        end

        bcd_output = bcd_output << 1;
        bcd_output[0] = count[i];
    end
end

endmodule

Выдается ошибка:

10016 Can't create symbol/include/instantiation/component file for module "bin_to_bcd" because port "count" has an unsupported type

Но " count "является" входным проводом ", как и должно быть, и у меня есть другой подобный код, который работает просто отлично. Может быть, я упускаю что-то очевидное, но я был бы очень признателен за любую помощь, которую я могу получить.

Я должен также упомянуть, что этот код прекрасно работает при моделировании в ModelSim-Altera.

Спасибо.

РЕДАКТИРОВАТЬ: Я также хотел бы иметь возможность указать число ди git для вывода в качестве параметра, если кто-либо, как идеи, как это реализовать. Примечание: $ clog2 ({N_DIGITS {9}}) не работает ...

РЕДАКТИРОВАТЬ # 2: Извините, если я медленно отвечаю, я работал над чем-то еще. Таким образом, проблема все еще представляет собой, и я не понимаю, почему ... Вот некоторые идеи, которые могут быть полезны. Следующий код прекрасно работает и использует тот же тип размеров регистров с $ clog2. Если кто-то видит какие-либо различия между кодом, который я разместил, и этим, пожалуйста, сделайте шаг вперед и закричите «Я НАШЕЛ ЭТО!», Потому что это сводит меня с ума: P

module multiplexer #(parameter N_INPUTS = 2, parameter N_OUTPUTS = 1) (in, out, select);

generate
    if (N_INPUTS % N_OUTPUTS != 0) begin
        illegal_parameter_cant_divide_inputs_by_outputs non_existing_module();
    end
endgenerate

input wire [N_INPUTS-1:0] in;
input wire [$clog2(N_INPUTS/N_OUTPUTS) - 1:0] select; //THIS LINE WORKS FINE
output wire [N_OUTPUTS-1:0] out;

assign out = in[(select + 1) * N_OUTPUTS - 1 -: N_OUTPUTS];

endmodule

Правка № 3: Я на самом деле просто заметил, что код мультиплексора не был правильно синтезирован как символ (выбранный порт отсутствует ... Я применил то же исправление, и теперь все нормально).

Опять же, любая помощь будет принята с благодарностью.

Ответы [ 3 ]

1 голос
/ 27 апреля 2020

Мне удалось устранить вашу ошибку, задав для параметра выражение $clog2, а затем с помощью параметра связать шину.

module test #(
    parameter N_DIGITS = 4,
    parameter int M = $clog2(9999) // see here
)(
    count, 
    bcd_output
);

input wire [M-1:0] count; // and here
output reg [(N_DIGITS<<2)-1:0] bcd_output;

integer i;
integer decade;

always @ (count) begin
    bcd_output = 'b0;
    for(i = $clog2(9999) - 1; i >= 0; i = i - 1) begin
        for(decade = 1; decade < N_DIGITS + 1; decade = decade + 1) begin
            if(bcd_output[(decade<<2) - 1 -: 4] >= 5) begin
                bcd_output[(decade<<2) - 1 -: 4] = bcd_output[(decade<<2) - 1 -: 4] + 3;
            end
        end

        bcd_output = bcd_output << 1;
        bcd_output[0] = count[i];
    end
end

endmodule

Can't create symbol/include/instantiation/component file for module "<name>" because port "<name>" has an unsupported type (ID: 10016)

ПРИЧИНА:

Вы попытались создать файл символа / include / instantiation / component для указанного модуля в Verilog Design File (.vhd). Однако указанный порт в модуле имеет тип, который не может быть представлен символом / include / instantiation / компонентный файл. К неподдерживаемым типам портов относятся структуры, интерфейсы или порты SystemVerilog. Большинство типов массивов или векторов обычно поддерживаются, но их границы должны определяться константными выражениями или простыми арифметическими c выражениями, включающими параметры модуля и целочисленные литералы . Поскольку указанный порт имеет неподдерживаемый тип, программное обеспечение Quartus II не может создать файл символа / include / instantiation / component для модуля.

ACTION:

Пропустить порт из декларации модуля или измените его тип.

https://www.intel.com/content/www/us/en/programmable/quartushelp/13.0/mergedProjects/msgs/msgs/evrfx_symbol_cant_handle_verilog_port.htm

1 голос
/ 27 апреля 2020

Из синтаксиса Verilog-2005 и SystemVerilog я не могу обнаружить ничего плохого в вашем коде. Он отлично работал на EDAplayground с различными симуляторами. Если bin_to_bcd находится в файле .v, а multiplexer имеет файл .sv, то это может быть способ анализа файла. $clog2 не является встроенным типом для Verilog-2001, вы можете убедиться, что файлы Verilog анализируются как 2005, а не как 2001. Хотя я рекомендую использовать тип файла SystemVerilog .sv.

Что касается создания $clog2(9999) масштаба на основе N_DIGITS, используйте $clog2(10**N_DIGITS-1).

Возможно, вы также захотите присвоить $clog2(...) параметру. Пример стиля заголовка ANSI:

module bin_to_bcd #(
  parameter N_DIGITS = 4,
  parameter IN_BITS = $clog2(10**N_DIGITS-1)
) (
  input wire [IN_BITS-1:0] count,
  output reg [(N_DIGITS<<2)-1:0] bcd_output );
0 голосов
/ 25 апреля 2020

Я не уверен, что говорится в стандарте, но рекомендуется всегда использовать порты в стиле ANSI, особенно в сочетании с параметрами стиля ANSI.

Это будет выглядеть так:

module bin_to_bcd #(parameter N_DIGITS = 4) (input wire [$clog2(9999)-1:0] count, output reg [(N_DIGITS<<2)-1:0] bcd_output);
...