For 循环在迭代之间或之后求和吗? verilog

Do For Loops sum between or after iterations? Verilog

我将使用此示例代码来询问有关 for 循环的一些一般性问题。

以下代码旨在在两个 3 位数字 ab 之间创建一个简单的乘法函数:

1   function [5:0] mult;
2     input [2:0] a,b;
3     reg [5:0] r;
4     integer i;
5   begin
6     if(a[0] == 1)
7       r = b;
8     else
9       r = 0;
10    for(i=1; i<=2; i = i+1) begin
11       if(a[i]==1)
12         r = r + b <<i;
13    end
14    mult = r;  // set function name equal to product
15  end
16  endfunction

我相信这会给出预期的结果,但只有在以下情况下我才能理解它:

  1. 79(显然取决于行6addend 'for loop' 的结果(从第 10 行开始)
  2. 79r 的定义 而不是 进入行 12 中的 'for loop'
  3. 'for loop' 的每次迭代(或 'step')不携带 r 先验 索引值的计算值 i转换为后续索引值i

如果这三个结论是正确的,那么我有以下问题:

最后,我明白了'for loops'不一定要加,只要满足条件就重复。只有在这个例子中是 'for loop' 添加。

这里的逻辑很简单。考虑 a=3 -> 011b=5 -> 101。您可以使用以下方案计算它:

   101 (b=5)
x  011 (a=3)
 -----
   101 (t1)
  101  (t2)
+000   (t3)
 -----
=01111 (15)

79用于计算值表示为t1for-loop用于计算t2t3.所以:

  • 6 行:a[0]=1。因此,r=001017.
  • 11 行和 i=1a[1]=1。因此,r=00101 + 101<<1 = 00101 + 1010 = 01111.
  • 11 行和 i=2a[2]=0。因此,r=01111.

您应该阅读 Verilog 中的 blocking and non-blocking 赋值。

您示例中的 for 循环与任何其他编程语言中的 for 循环没有区别。它的工作原理完全一样。 always 块中的所有运算符都是顺序执行的,它们之间除了行号之外没有其他依赖机制。

Lines 7 or 9 (depending on line 6 obviously) add to the end result of the 'for loop' (which begins on line 10)

这是一个普通的 if 运算符,与任何其他语言一样。它首先被执行并根据a[0].

的值给r赋初值

The definition of r from lines 7 or 9 is not carried into line 12 in the 'for loop'

不确定你的意思。前面的if运算符设置了r的初始值,在循环中第一个takenif语句中使用的是r = r + b <<i;。表达式的右侧包含 r,第一次包含初始值。

Each iteration (or 'step') of the 'for loop' does not carry its calculated value for r from a prior index value i into a subsequent index value i

与任何编程语言一样,r 的值将在每次执行 if 语句的迭代中更新。此更新值将在同一表达式 r = r + b <<i;.

的下一次循环迭代中使用

If these three conclusions are correct then I have these questions:

您的结论不正确。所以你必须重新考虑你的进一步问题。