Verilog中与1023 10位向量的xor关联的延迟

时间:2019-01-03 02:18:40

标签: verilog fpga

我对verilog有点陌生,我有一个使我感到困惑的问题。 我有许多常数参数,特别是c10,c1,c2 ..... c1022中的近1023个,每个参数的长度为10位。我也有一个向量r [1022:0],它的长度是1023位。我的任务是计算ci * r [i],其中我从0到1022变化,最后取1023我得到的1023位向量的异或。当我在仿真中执行此操作时,verilog会在时间0生成分配的输出声明。 verilog如何在时间0生成输出?这些1023个xor不会有延迟吗? 另外,如果我需要简洁地执行此操作,是否可以使用一种简短的形式?还是需要手动编写c0 * r [0] ^ c1 * r [1] ...... ^ c [1022] * r [1022]可合成吗?

1 个答案:

答案 0 :(得分:1)

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);