在将动态变量成员作为端口传递给generate进行循环实例化时,
int clk[];
initial begin
N=clk.size();
end
initial begin
clk=new[4];
end
always @(*) begin
clk[0]=clk0_out;
clk[1]=clk1_out;
clk[2]=clk2_out;
clk[3]=clk3_out;
end
genvar i;
generate
for(i=0;i<N;i=i+1) begin: monitor_call
clock_mon cm1(.clock(clk[i]),.reset(reset));
end
endgenerate
发生以下错误:
- 非法的非恒定生成循环条件。
- 不允许将动态变量(clk)的成员用作实际端口。
虽然将静态数组作为端口传递给内部时会生成循环实例化,但没有此类错误。 为什么动态数组会出现问题?
不能在generate循环内使用它们吗?如果没有,那么与我要实例化模块“ n”次相同,还有什么替代方法?
答案 0 :(得分:0)
静态数组的大小在编译时是固定的。动态数组的大小在运行时是固定的(也可以在运行时更改)。
generate循环的边界必须为 static 。也就是说,它们必须在编译时固定。如果考虑一下,其原因很明显:generate loop的边界控制着要模拟或综合多少硬件。您不能有一个电路的大小会根据某些输入而变化。
因此,您需要使数组和generate循环的边界保持静态。也就是说,您需要在编译时固定数组的大小和generate循环的边界。