【问题标题】:Quartus Prime throwing an error at a $error commandQuartus Prime 在 $error 命令中抛出错误
【发布时间】:2020-04-23 04:33:37
【问题描述】:

我遇到了以下代码的问题,它应该只是在编译时抛出一个错误 如果我的输入数量不能被我的输出数量整除。

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

    generate
        if (N_INPUTS % N_OUTPUTS != 0) begin
            $error("%m ** Illegal Parameter ** NUMBER OF INPUTS(%d) does not divide into NUMBER OF OUTPUTS(%d)", N_INPUTS, N_OUTPUTS);
        end
    endgenerate

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

    always @ (select, in) begin
        out = in[(select + 1) * N_OUTPUTS - 1:(select + 1) * N_OUTPUTS - N_OUTPUTS];
    end

endmodule

但是当我进行分析时,Quartus 不断向我抛出这个错误:

Error (10170): Verilog HDL syntax error at multiplexer.v(5) near text: "$error";  expecting "end". Check for and fix any syntax errors that appear immediately before or at the specified keyword. The Intel FPGA Knowledge Database contains many articles with specific details on how to resolve this error. Visit the Knowledge Database at https://www.altera.com/support/support-resources/knowledge-base/search.html and search for this specific error message number.

我开始怀疑 Quartus 的编译器是否支持 $error 命令(这是我第一次使用它)。

我将非常感谢任何关于该主题的帮助,因为我仍然是该领域的初学者 :)

【问题讨论】:

  • 我会试试的。请让我几分钟了解如何启用此功能:P
  • SystemVerilog 是否具有相同的语法和所有内容(基本上只是更多功能)?因为当我上网时,它告诉我将文件的扩展名从 .v(用于 Verilog)更改为 .sv(用于 SystemVerilog)。
  • 我会尝试找到一种方法来简单地激活它,因为如果我将我的文件更改为 SystemVerilog,我认为我的其他文件可能会开始出现错误,因为它们都包含 always 块,我注意到 SystemVerilog 作为一些每种逻辑类型的特殊总是阻塞。但是感谢您的所有帮助,我很确定这个问题现在已经解决了。我本来想将您的答案标记为正确的,但您只评论了...

标签: verilog fpga system-verilog quartus intel-fpga


【解决方案1】:

关闭您的 Quartus 项目并在 .qsf 文件中,将指向您的 multiplexer 模块 verilog 文件的行从:

set_global_assignment -name VERILOG_FILE multiplexer.v

收件人:

set_global_assignment -name SYSTEMVERILOG_FILE multiplexer.v

编辑:

同时设置:

set_global_assignment -name VERILOG_INPUT_VERSION SYSTEMVERILOG_2009

编辑 2:

这是 SystemVerilog 2009 的功能,Quartus Prime Standard 和 Quartus Prime Lite 不支持 VHDL 2008 或 SystemVerilog 2009。

Quartus Prime Pro 19.4:

Quartus Prime 标准 19.1:

【讨论】:

  • 是的,我尝试从项目中排除每个文件,然后将它们的扩展名更改为 .sv 并在项目中重新导入它们(这与您的小技巧具有相同的效果,但还需要更改扩展名)。唉,它不工作。我还告诉 Quartus 将我的 Verilog HDL 编译为 SystemVerilog,但没有成功……此时我什至不明白这个文件出了什么问题……
  • 尽管在我的 .qsf 中提到了这一行:set_global_assignment -name VERILOG_INPUT_VERSION SYSTEMVERILOG_2005。会不会是版本不对?尚未找到在 Quartus 本身中更改它的方法。
  • 如果您在GUI本身中找不到更改这些值的地方,您可以直接更改.qsf中的settings。您可以尝试将版本更改为SystemVerilog_2009,但我不知道您是否会看到很大的不同。你看到的错误还是和正文一样吗?
  • 是的,仍然是同样的错误。我还重新创建了项目并导入了我现在具有 .sv 扩展名的文件,但我仍然遇到同样的错误。我将继续尝试 2009 年。编辑:Quartus 只需删除更改并使用旧的 2005 年参数重试编译。
  • 我在标准版和素数版中都对其进行了测试,是的,这就是问题所在。 Quartus Prime Standard 和 Quartus Prime Lite 不支持 VHDL 2008 或 SystemVerilog 2009。
【解决方案2】:

我发现了问题...钱... 如果你看下面的图片你会注意到如果你很穷你不能使用 Quartus Prime 的 Lite 和 Standard 版本中的 SystemVerilog 的最新版本。

嗯,这就解释了一切。 如果有人作为另一种在编译时抛出错误的解决方案看起来比这更好,请告诉我:

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

注意:本文取自https://electronics.stackexchange.com/a/71226

【讨论】:

    【解决方案3】:

    我看到其他错误:

    • 您正在从程序块(您的 always 堵塞)。你不能这样做,你只能驱动一个变量。即out 必须是变量。

    • 方括号内的代码是非法的。您将需要使用 +:-: 运算符之一。见this answer here

    【讨论】:

    • 虽然问题似乎与 Verilog 有关,但请注意 $error 等在程序块之外是合法的,通常是为了在 SystemVerilog(详细系统任务)中生成块 DRC。
    • 感谢您对这个新运营商的建议。这比考虑这些变量要容易得多 XD
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-28
    • 2016-12-10
    • 2017-04-06
    • 1970-01-01
    相关资源
    最近更新 更多