【问题标题】:In Verilog, when using a for-loop within a sequential process, how can you increment the sequential variable?在 Verilog 中,当在顺序过程中使用 for 循环时,如何增加顺序变量?
【发布时间】:2019-07-29 18:23:58
【问题描述】:

这是一段 sn-p 代码,希望你没有序言就没事:

   always @ (posedge clk)
   begin
      if(rst)
      begin
         i<=0;
         j<=0;
      end
      else
      begin
         for(j = 0 ; j < 16 ; j = j+1)
         begin
            if(i<8)
            begin
               var[j] <= var_2[i];
               i <= i+1;
            end
         end      
      end
   end

基本上,我想知道外部“for-loop”是否会错误地增加计数器变量i,而不是简单地并行计算 16 个vars。如果是这种情况,我是否应该缩短 for 循环以便变量在 for 循环之外递增?

谢谢!

【问题讨论】:

  • 如果你不确定代码会做什么,正常的过程是模拟。我不知道您想要代码做什么。在这里,如果 i
  • 嗨 Oldfart(好名字哈哈 :))我已经模拟了,它确实在模拟中工作。但是,综合给了我错误。这就是我问的原因!此外,我发现 StackOverflow 可以为我提供我什至不知道自己需要的额外信息
  • 你的合成错误是什么?可能对 i 有多个分配的东西,因为 i 在这里没有初始化或以任何方式设置
  • 你好,Oldfart。 i 在每个“rst”信号处初始化为 0。我只是没有写那部分。我会编辑它。我想这段代码有点混乱,因为我只是想传达这个想法。你是对的,这没有意义。不过,根据您的回答,我认为您是在说,对于第一次“for”迭代,var[15:0] = var_2[0],然后是下一次,var[15:0] = var_2[1]等等……对吗?谢谢!此外,综合误差显然是时序误差。我正在对大量位进行操作,但我认为这不是什么天文数字。

标签: for-loop verilog sequential


【解决方案1】:

您使代码变得不必要的复杂。

如果 i

var[j] <= var_2[i];
i <= i+1;

i 直到时钟沿之后才会递增。 由于 'i' 不会改变条件不会改变,因此一旦为真,它对于 j 的所有值都保持真。

可能更好的理解方式是编写具有完全相同行为的代码如下:

   always @ (posedge clk)
   begin
      if(rst)
      begin
         i<=0;
         j<=0;
      end
      else
      begin
         for (j = 0 ; j < 16 ; j = j+1)
         begin
            if(i<8)
               var[j] <= var_2[i];
         end      
         // i increment independent from the 'j' loop
         if(i<8)
            i <= i+1;
      end
   end

【讨论】:

  • 您好 Oldfart,感谢您的回答。因此,似乎我的实现不一定错误,但可能给想象留下了太多不必要的东西(尤其是对于像我这样刚接触 Verilog 的人)。所以,我想我需要更深入地研究我的代码并找出为什么会出现计时错误。我试图实现的实际代码是一个并行排序器,它将其结果循环回输入,在 log(x) 时间内执行而不使用太多寄存器。
  • 如果我可以补充我的并行排序器想法,请让我知道它是否对您有意义:考虑 4 个 32 位变量,即 A[0]、A[1]、 A[2] 和 A[3]。并行地,我将 (1) A[0] 与 A[1] 以及 (2) A[2] 与 A[3] 进行比较。我将 (1) 的结果放回 A[0](如果 A[1]>A[0],则 A[0] = A[1])。我将 (2) 的结果放回 A[1](如果 A[3] > A[2],A[1] = A[3])。然后,我再次运行它。 A[2] 和 A[3] 不变,但 A[0] 和 A[1] 应该有新的最大值,这样在下一个周期,A[0] 就有最大值。这是找到 A[0:3] 最大值的有效方法吗?
  • 您仍然需要将 A[1] 与 A[2] 进行比较。看看here
  • 我不确定为什么需要将 A[1] 与 A[2] 进行比较。我对订购寄存器不感兴趣,而只是获得最大值。如果 A[1] > A[0],则 A[0] = A[1];否则,A[0] = A[0]。如果 A[3] > A[2],则 A[1] = A[3];否则,A[1] = A[2]。那我再对比一下。您认为这不会使 A[0] 在下一个周期结束时获得最大值吗?
猜你喜欢
  • 1970-01-01
  • 2019-06-28
  • 1970-01-01
  • 1970-01-01
  • 2011-04-04
  • 2013-03-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多