verilog生成循环分配给迭代器宽度不匹配

verilog生成循环分配给迭代器宽度不匹配,verilog,system-verilog,synthesis,Verilog,System Verilog,Synthesis,我正在使用generate循环来实例化可参数化数量的模块,并希望根据循环迭代将一些输入分配给模块。不幸的是,我遇到了合成方面的问题,设计编译器说这是一个错误,因为端口宽度不匹配。以下是我想做的: genvar k; generate for(k = 0; k < `NUM/2; ++k) begin cmp2 cmps( .a (arr[k]), .b (arr[k+1]),

我正在使用generate循环来实例化可参数化数量的模块,并希望根据循环迭代将一些输入分配给模块。不幸的是,我遇到了合成方面的问题,设计编译器说这是一个错误,因为端口宽度不匹配。以下是我想做的:

genvar k;
generate
    for(k = 0; k < `NUM/2; ++k) begin
        cmp2 cmps(
            .a       (arr[k]),
            .b       (arr[k+1]),
            .a_idx   (k),   //gives errors about port width mismatch
            .b_idx   (k+1), //but I can't get it to work any other way
            .data_out(data[k]),
            .idx_out (idx[k])
            );
    end
endgenerate
genvark;
生成
对于(k=0;k<`NUM/2;++k)开始
cmp2 cmps(
.a(arr[k]),
.b(arr[k+1]),
.a_idx(k),//提供有关端口宽度不匹配的错误
.b_idx(k+1),//但我无法以任何其他方式让它工作
.数据输出(数据[k]),
.idx_out(idx[k])
);
结束
最终生成
我还尝试在循环中使用localparams,并将a_idx和b_idx分配给localparam,但在合成中仍然会遇到相同的错误

我尝试过类似于
.a_idx((k)[bit\u width-1:0]),
的方法,但这也不起作用


有什么想法吗?

k
k+1
是32位宽的,这会导致宽度不匹配。 根据合成工具支持的内容,您可能希望尝试以下操作:

  • 位切片:

    .a_idx   (k[0 +: bit_width])
    
  • 转换为
    位宽度
    -宽逻辑:

    typedef logic[bit_width-1:0] logicN_t;
    // .... //
      .a_idx   (logicN_t'(k)),
      .b_idx   (logicN_t'(k+1)),
    // .... //
    

k
k+1
是32位宽,这会导致宽度不匹配。 根据合成工具支持的内容,您可能希望尝试以下操作:

  • 位切片:

    .a_idx   (k[0 +: bit_width])
    
  • 转换为
    位宽度
    -宽逻辑:

    typedef logic[bit_width-1:0] logicN_t;
    // .... //
      .a_idx   (logicN_t'(k)),
      .b_idx   (logicN_t'(k+1)),
    // .... //