背景:因为相同的模块比较多,大概有40+个,所以使用generate for例化模块,每一个例化模块中,还例化了一个edif文件,这个edif中有一个参数每个模块使用的值是不一样的,所以想用索引的方式来传递参数,但是Vivado报错,说这个edif模块为黑模块。
//顶层文件部分代码
parameter [8*56-1:0] TimeDelay_Bypass = {
{9{8'd5}},8'd3,8'd6,{45{8'd5}}
};
genvar i;
generate
for(i=0;i<56;i=i+1) begin
vcu_bridge #(
.TimeDelay_Bypass (TimeDelay_Bypass[8*i+7:8*i])
u_vcu_bridge (
.clk_sys (clk_sys ),
.reset_n (reset_n ),
.SwitchOn_in (reg_hdlc_tx_data[32*i+18] ),
.Data_Send_out (Data_Send_out )
);
end
endgenerate
//vcu_bridge.v
module vcu_bridge #(
parameter TimeDelay_Bypass = 5
)(
input clk_sys ,
input SwitchOn_in ,
output Data_Send_out
);
//----------------------------------------------
InterfaceVCU #(
.Udc_Ref0 (300 ),
.TimeDelay_Bypass (TimeDelay_Bypass)
)
u_InterfaceVCU_0 (
.clk_40M_in (clk_tx ),
.rst_n_in (SwitchOn_in ),
.Data_Send_out (Data_Send_out )
);
endmodule
以上代码中,InterfaceVCU是封装好的edif文件外加一个vhdl的接口外壳。
运行结果(我在网上找的图,但是错误类型是一样的)
如果把顶层文件中的那部分代码改为
parameter TimeDelay_Bypass = 5;
genvar i;
generate
for(i=0;i<56;i=i+1) begin
vcu_bridge #(
.TimeDelay_Bypass (TimeDelay_Bypass)
u_vcu_bridge (
.clk_sys (clk_sys ),
.reset_n (reset_n ),
.SwitchOn_in (reg_hdlc_tx_data[32*i+18] ),
.Data_Send_out (Data_Send_out )
);
end
endgenerate
就能正常生成比特流文件,但不能达到每个模块参数不一样的目标,除非不使用generate for循环,但这样代码量会很大
希望得到解答,万分感谢!
.TimeDelay_Bypass (TimeDelay_Bypass[8*i+7:8*i])
这样改试试
其实,采用二维数组最合适,代码也好看