Задержка, связанная с xor 1023 10-битных векторов в Verilog - PullRequest
0 голосов
/ 03 января 2019

Я немного новичок в verilog, и у меня есть вопрос, который сбивает меня с толку.У меня есть ряд постоянных параметров, в частности, около 1023 из них c0, c1, c2 ..... c1022, каждый из которых имеет длину 10 бит.У меня также есть вектор r [1022: 0], длина которого составляет 1023 бита.Моя задача - вычислить ci * r [i], где i изменяется от 0 до 1022, и, наконец, взять xor из 1023 10-битных векторов, которые я получаю. Когда я делаю это в симуляции, verilog генерирует вывод в момент времени 0 для назначениязаявление .Как Verilog может генерировать вывод в момент времени 0?Не будет ли задержки, связанной с этими 1023 xors?Кроме того, если мне нужно сделать это кратко, есть ли краткая форма, которую я могу использовать, или мне нужно вручную написать c0 * r [0] ^ c1 * r [1] ...... ^ c [1022]* r [1022], который является синтезируемым?

1 Ответ

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

Симулятор Verilog выполнит любой допустимый синтаксис, который вы ему дадите - инструмент ничего не знает о том, как в конечном итоге выглядит реализация. Вы должны передать ограничения по времени инструменту синтеза, и он сообщит вам, может ли он соответствовать логике, чтобы соответствовать ограничениям (или вам может потребоваться запустить другой инструмент, чтобы увидеть, соответствует ли он ограничениям времени).

Поскольку вы назвали свои параметры c0, c1, c2, ..., вы могли бы также назвать их czero, cone, ctwo, ..., что не дает вам вариантов для ярлыков.

Если ваш инструмент поддерживает SystemVerilog, вы можете записать свой параметр в виде массива и затем использовать оператор сокращения xor для массива

parameter [9:0] C[1023] = {10'h123, 10'h234, ...};
assign out = C.xor() with (item*r[item.index]);

Если ваш инструмент синтеза не поддерживает этот синтаксис SystemVerilog, вы можете упаковать значения параметров в один вектор и использовать индексированную деталь, выбранную в Verilog.

   parameter [10220-1:0] C = {10'h123, 10'h234, ...};

   function [9:0] xor_reduction (input [1022:0] r);
     integer I;
     begin
       xor_reduction = 0;
       for(I=0;I<1023;I=I+1)
          xor_reduction = xor_refuction ^ (r[1022-I]*C[I-:10]);
     end
   endfunction
   assign out = xor_reduction(r);
...