在 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
}
我正在尝试为不同的参数值合成一个模块。我在 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
}