带变量的一次性索引

问题描述 投票:0回答:1

我有一个参数

NI_TYPE

parameter int NI_TYPE[NUM_ROW][NUM_COL] = '{
  '{0, 1, 2},
  '{2, 1, 2},
  '{2, 1, 0}
};

基于

NI_TYPE
,我正在创建实例,但 mni_index/sni_index 仅在实例化后才需要增加。 谁能帮我修复以下代码?

  genvar mni_index = 0;
  genvar sni_index = 0;
  for (genvar row = 0; row < NUM_ROW; row++) begin : gen_row
    for (genvar col = 0; col < NUM_COL; col++) begin : gen_col
      if (NI_TYPE[row][col] == 2) begin : gen_mni
        axi_grid_mni #(
            .req_t (mni_req_t),
            .resp_t(mni_resp_t)
        ) u_ni (
            .clk_i,
            .arst_ni,
            .req_o(mni_req_o[mni_index]),
            .resp_i(mni_resp_i[mni_index])
        );
        mni_index++;
      end else
      if (NI_TYPE[row][col] == 1) begin : gen_sni
        axi_grid_sni #(
            .req_t (sni_req_t),
            .resp_t(sni_resp_t)
        ) u_ni (
            .clk_i,
            .arst_ni,
            .req_o(sni_req_i[sni_index]),
            .resp_i(sni_resp_o[sni_index])
        );
        sni_index++;
      end else begin : gen____
      end
    end
  end

生成不像程序那样工作,但我只需要完成一次索引,并且不需要在运行时更改。

system-verilog
1个回答
0
投票

genvar
仅在generate-for-循环内递增。正如您所发现的,then 不能任意增加。

一种选择是创建第二个参数数组,其中行/列地址映射到预期的 ni_index。然后你的

mni_index
sni_index
都变成了
NI_INDEX[row][col]

parameter int NI_TYPE[NUM_ROW][NUM_COL] = '{
  '{0, 1, 2},
  '{2, 1, 2},
  '{2, 1, 0}
};
parameter int NI_INDEX[NUM_ROW][NUM_COL] = '{
  '{0, 0, 0},
  '{1, 1, 2},
  '{3, 2, 1}
};

这可行,但可能容易出错。所以另一种可能性是使用函数。然后你的

mni_index
sni_index
分别变成
ni_index(2, row, col)
ni_index(1, row, col)

function int ni_index(int key, row, col);
  ni_index = 0;
  for(int r=0; r<NUM_ROW; r++) begin
    for(int c=0; c<NUM_COL; c++) begin
       if ((r==row) && (c==col)) return ni_index;
       else if (NI_TYPE[r][c]==key) ni_index++;
    end
  end
endfunction

根据您的模拟器/合成器等,通过在使用该值之前创建本地参数,可以更好地优化

ni_index()
功能。

for (genvar row = 0; row < NUM_ROW; row++) begin : gen_row
  for (genvar col = 0; col < NUM_COL; col++) begin : gen_col
    if (NI_TYPE[row][col] == 2) begin : gen_mni
      parameter int MNI_INDEX = ni_index(2, row, col); // <-- local param
      axi_grid_mni #(
          .req_t (mni_req_t),
          .resp_t(mni_resp_t)
      ) u_ni (
          .clk_i,
          .arst_ni,
          .req_o(mni_req_o[MNI_INDEX]),
          .resp_i(mni_resp_i[MNI_INDEX])
      );
    end else
    if (NI_TYPE[row][col] == 1) begin : gen_sni
      parameter int SNI_INDEX = ni_index(1, row, col);// <-- local param
      axi_grid_sni #(
          .req_t (sni_req_t),
          .resp_t(sni_resp_t)
      ) u_ni (
          .clk_i,
          .arst_ni,
          .req_o(sni_req_i[SNI_INDEX]),
          .resp_i(sni_resp_o[SNI_INDEX])
    );
    end else begin : gen____
    end
  end
end
© www.soinside.com 2019 - 2024. All rights reserved.