Verilog генерирует цикл, назначая несоответствие ширины итератора

Я использую цикл генерации для создания экземпляра параметризуемого количества модулей, и я хочу назначить некоторые входные данные модулю на основе итерации цикла. К сожалению, у меня возникают проблемы с синтезом, когда компилятор дизайна говорит об ошибке, потому что ширина порта не совпадает. Вот что я пытаюсь сделать:

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

Я также пытался использовать localparams в цикле и назначать a_idx и b_idx для localparam, но все равно получаю ту же ошибку при синтезе.

Я пробовал что-то вроде .a_idx((k)[bit_width-1:0]),, но это тоже не работает.

Есть идеи?


person mtveezy    schedule 13.03.2017    source источник


Ответы (1)


k и k+1 имеют ширину 32 бита, что приводит к несоответствию ширины. В зависимости от того, что поддерживает ваш инструмент синтеза, вы можете попробовать следующее:

  • Битовая нарезка:

    .a_idx   (k[0 +: bit_width])
    
  • Приведение к bit_width-широкой логике:

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