Вивадо дает проблемы при попытке нарезать массив с помощью непостоянного целого числа - PullRequest
0 голосов
/ 17 января 2019

Я использую 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 есть проблемы с использованием неконстантного использования для нарезки массива, но это происходит только со вторым массивом ...

1 Ответ

0 голосов
/ 17 января 2019

Проблема была решена во многом благодаря комментариям. Я поделюсь тем, что было изменено, чтобы заставить его функционировать; Во-первых, мое использование BRAM было слишком высоким. Очевидно, что перед попыткой синтеза я не получил никаких предупреждений об этом, но я столкнулся бы с этим во время синтеза или реализации, поэтому я настроил это в соответствии с таблицей данных моего чипа, чтобы не использовать больше, чем имеющийся BRAM. Во-вторых, я использовал форму динамического среза, которая не поддерживалась в Vivado, но поддерживалась другими инструментами, такими как Quartus, поэтому я изменил ее, используя ссылку, указанную в комментарии @dwikle. После этого я остался с ошибкой, которая была просто глупой ошибкой с моей стороны в моем объявлении: я объявил один из моих параметров как вектор и попытался присвоить его массиву. Так что я изменил это. Спасибо всем.

...