我有一个参数
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
生成不像程序那样工作,但我只需要完成一次索引,并且不需要在运行时更改。
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