在Verilog中,使用generate for例化模块时,如何给不同的模块传递不同的参数?

背景:因为相同的模块比较多,大概有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的接口外壳。

运行结果(我在网上找的图,但是错误类型是一样的)

img

如果把顶层文件中的那部分代码改为

parameter    TimeDelay_Bypass = 5genvar 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])

这样改试试
其实,采用二维数组最合适,代码也好看