【问题标题】:Delay associated with xor of 1023 10 bit vectors in VerilogVerilog 中与 1023 个 10 位向量的异或相关的延迟
【发布时间】:2019-01-03 14:59:48
【问题描述】:

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

【问题讨论】:

  • 可能你在做功能仿真,而你应该做时序仿真来看看你提到的延迟。

标签: verilog fpga


【解决方案1】:

Verilog 模拟器将执行您为其提供的任何合法语法——该工具对最终实现的样子一无所知。将时序约束提供给综合工具取决于您,它会告诉您它是否可以满足逻辑以满足约束(或者您可能需要运行另一个工具来查看它是否满足时序约束)。

由于您将参数命名为c0, c1, c2, ...,因此您不妨将它们命名为czero, cone, ctwo, ...,这样您就没有快捷方式选项了。

如果您的工具支持 SystemVerilog,您可以将参数写入数组,然后使用数组异或归约运算符

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

【讨论】:

  • dave_59 回答的附录:如果综合后您的设计时序失败,您应该考虑通过添加寄存器级来使设计流水线化。您的问题非常适合,因为数据流都在“一个方向”。您的延迟会增加,但逻辑应该能够以非常非常高的时钟速度运行。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-05-03
  • 2013-05-19
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多