You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

在Verilog的for循环内调用模块报错求助(Synopsys编译)

解决Verilog代码中的语法错误问题

咱们一步步拆解你代码里的问题,然后修正过来:

核心错误原因

你的代码有两个关键语法问题,都是Verilog语法规则明确禁止的:

  • Generate块不能嵌套在always块内部:Generate是编译阶段生效的静态结构,用来批量生成逻辑实例;而always块是描述电路动态行为的过程块,两者的执行阶段完全不同,语法上严禁嵌套。
  • always块内不能直接实例化门级原语always块里只能放过程赋值(=/<=)、条件语句(if/case)、仿真用循环这类行为级代码,门级原语(比如and)或者模块实例必须放在模块的顶层作用域里。

另外你在always块里同时定义了integer itrgenvar itr,属于重复变量定义,也是需要避免的小问题。

修正后的门级实现代码

把generate块移到模块顶层,去掉多余的always块,门级实例直接放在模块作用域内:

module ands ( input1, input2, outputs );
    input [2:0] input1;
    input input2;
    output [2:0] outputs;

    // 第一个与门,单独实例化(也可以合并到generate循环里)
    and a0 (outputs[0], input1[0], input2);

    // Generate块放在模块顶层,编译阶段自动展开循环生成实例
    genvar itr;
    generate 
        for (itr = 1 ; itr <= 2; itr = itr+1) begin : gen_loop
            and a (outputs[itr], input1[itr], outputs[itr-1]);
        end
    endgenerate
endmodule

另一种行为级实现方式(更简洁)

如果你倾向于用always块描述组合逻辑,也可以不用门级实例化,直接用过程赋值实现:

module ands ( input1, input2, outputs );
    input [2:0] input1;
    input input2;
    output reg [2:0] outputs;

    // 用@(*)自动推断组合逻辑敏感列表
    always @(*) begin
        outputs[0] = input1[0] & input2;
        // 用int类型变量做循环(Verilog-2001及以后版本支持)
        for (int itr = 1; itr <= 2; itr++) begin
            outputs[itr] = input1[itr] & outputs[itr-1];
        end
    end
endmodule

这两种写法都能通过Synopsys工具的编译,实现你想要的级联与门逻辑。

内容的提问来源于stack exchange,提问作者Riaz Ul Haque Mian

火山引擎 最新活动