Я использую Verilog для дизайна и использую целое число, которое переопределяется каждый раз, когда блок всегда работает на положительном фронте тактовой частоты. Это прекрасно работает для одного из моих двух массивов в блоке always, но Vivado жалуется (только) на второй массив, который использует «непостоянный» для индекса для выбора фрагмента массива. o_pl_inst
- это 128-битный регистр, а csh_reg
- это 128-мегабитный регистр, из которых я выбираю 128 бит за раз для сохранения в o_pl_inst
. Почему в той же ситуации у меня нет проблем с назначением динамического фрагмента массива, как в "csh_reg[i*i-127] = activ_inst;
", но я не могу получить значение в той же усадьбе? Любая помощь будет принята с благодарностью.
Я пытался переместить объявления моего массива за пределы блока Always, но это вызвало новые проблемы.
always@(posedge clk) begin
// Load instructions into the CSH
int i = (inst_width*(sp_csh+1))-1; /*Reference index generation for dynamic array slicing*/
int j = (i_pl_sp*128)-1; /*Reference index generation for dynamic array slicing*/
csh_reg[i*i-127] = activ_inst; /*Load 128-bit instructions into the array 128 bits apart*/
sp_csh = sp_csh +1; /*Increment internal CSH_sp*/
activ_inst = i_ps_inst; /*Get next instruction*/
// Save instruction from CSH
o_pl_inst = csh_reg[j:j-127]; /*Retrieve 128-bit instruction from 1 of 1048576 positions in CSH*/
end
Мне нужно, чтобы исправление / альтернатива были синтезируемыми. Из того, что я прочитал, у Vivado есть проблемы с использованием неконстантного использования для нарезки массива, но это происходит только со вторым массивом ...