在 foreach 循环中通过 chparam 更改参数后找不到子模块

Sub-module not found after changing parameter through chparam in a foreach loop

我正在尝试为不同的参数值合成一个模块。我在 tcl 中使用 foreach 循环更改参数,并使用 hierarchy 命令中的 -chparam 标记将更新后的参数传递给顶层模块。它适用于循环的第一次迭代。但是,在第二次迭代中,它显示未找到子模块之一的错误。

我写了一个简单的模块(写在test.sv)来演示这个问题。

module top #(parameter N = 8)(
    input [N-1:0] x,
    output y
);

    isZero #(.N(N)) isZero_inst(
        .x(x),
        .y(y)
    );

endmodule


module isZero #(parameter N = 8)(
    input [N-1:0] x,
    output y
);

    assign y = |x;

endmodule

我正在使用以下 tcl 命令(用 test.tcl 编写):

yosys -import

read_verilog -defer -sv  test.sv 

foreach N [list 4 8] {
    hierarchy -check -top top -chparam N $N 
    procs; opt; 
    flatten; opt; 
    techmap; opt;
    abc; opt; 
    clean; opt;
    opt_clean -purge
    write_verilog -noattr -noexpr test_${N}_syn.v
}

它生成第一个文件:test_4_syn.v。但是,在第二次迭代中,它显示错误:

Module `\isZero' referenced in module `\top' in cell `\isZero_inst' is not part of the design.

为了完整起见:我正在对 运行 tcl 文件使用以下命令:

yosys -c test.tcl

我通过在带有 -overwrite 标签的 foreach 循环中移动 read_verilog 解决了这个问题(没有 -overwrite Yosys 会产生模块重新定义错误)。这是 tcl 文件现在的样子:

foreach N [list 4 8] {
    read_verilog -overwrite -defer -sv  test.sv
    hierarchy -check -top top -chparam N $N 
    procs; opt; 
    flatten; opt; 
    techmap; opt;
    abc; opt; 
    clean; opt;
    opt_clean -purge
    write_verilog -noattr -noexpr test_${N}_syn.v
}

我不确定这是否是正确的方法,但它确实有效。我知道在 Synopsys Design Compiler 中,文件只读一次。

hierarchy是精化的主要部分,IIRC将清除参数化模块的非参数化版本。

design 命令是处理此问题的好方法,无需重新 运行 read_verilog。例如:

yosys -import

read_verilog -defer -sv  test.sv 
design -stash test

foreach N [list 4 8] {
    design -load test
    hierarchy -check -top top -chparam N $N 
    procs; opt; 
    flatten; opt; 
    techmap; opt;
    abc; opt; 
    clean; opt;
    opt_clean -purge
    write_verilog -noattr -noexpr test_${N}_syn.v
}