For 循环在迭代之间或之后求和吗? verilog
Do For Loops sum between or after iterations? Verilog
我将使用此示例代码来询问有关 for 循环的一些一般性问题。
以下代码旨在在两个 3 位数字 a
和 b
之间创建一个简单的乘法函数:
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
我相信这会给出预期的结果,但只有在以下情况下我才能理解它:
- 行
7
或9
(显然取决于行6
)add到end 'for loop' 的结果(从第 10
行开始)
- 行
7
或 9
中 r
的定义 而不是 进入行 12
中的 'for loop'
- 'for loop' 的每次迭代(或 'step')不携带
r
的 先验 索引值的计算值 i
转换为后续索引值i
如果这三个结论是正确的,那么我有以下问题:
- 在完成所有可能的步骤后,'For Loops' 对它们的迭代求和吗?
- 'For Loops'不携带有关标识符的信息在'for loop'派生的从一步 到下一步,尽管两个步骤中都出现了相同的标识符(在本例中为
r
)?参考第 12
行。
- 我怎么知道结论 #1 是真的?基本规则是什么?
最后,我明白了'for loops'不一定要加,只要满足条件就重复。只有在这个例子中是 'for loop' 添加。
这里的逻辑很简单。考虑 a=3 -> 011
和 b=5 -> 101
。您可以使用以下方案计算它:
101 (b=5)
x 011 (a=3)
-----
101 (t1)
101 (t2)
+000 (t3)
-----
=01111 (15)
行7
和9
用于计算值表示为t1
和for-loop
用于计算t2
和t3
.所以:
- 第
6
行:a[0]=1
。因此,r=00101
行 7
.
- 第
11
行和 i=1
:a[1]=1
。因此,r=00101 + 101<<1 = 00101 + 1010 = 01111
.
- 第
11
行和 i=2
:a[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:
您的结论不正确。所以你必须重新考虑你的进一步问题。
我将使用此示例代码来询问有关 for 循环的一些一般性问题。
以下代码旨在在两个 3 位数字 a
和 b
之间创建一个简单的乘法函数:
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
我相信这会给出预期的结果,但只有在以下情况下我才能理解它:
- 行
7
或9
(显然取决于行6
)add到end 'for loop' 的结果(从第10
行开始) - 行
7
或9
中r
的定义 而不是 进入行12
中的 'for loop' - 'for loop' 的每次迭代(或 'step')不携带
r
的 先验 索引值的计算值i
转换为后续索引值i
如果这三个结论是正确的,那么我有以下问题:
- 在完成所有可能的步骤后,'For Loops' 对它们的迭代求和吗?
- 'For Loops'不携带有关标识符的信息在'for loop'派生的从一步 到下一步,尽管两个步骤中都出现了相同的标识符(在本例中为
r
)?参考第12
行。 - 我怎么知道结论 #1 是真的?基本规则是什么?
最后,我明白了'for loops'不一定要加,只要满足条件就重复。只有在这个例子中是 'for loop' 添加。
这里的逻辑很简单。考虑 a=3 -> 011
和 b=5 -> 101
。您可以使用以下方案计算它:
101 (b=5)
x 011 (a=3)
-----
101 (t1)
101 (t2)
+000 (t3)
-----
=01111 (15)
行7
和9
用于计算值表示为t1
和for-loop
用于计算t2
和t3
.所以:
- 第
6
行:a[0]=1
。因此,r=00101
行7
. - 第
11
行和i=1
:a[1]=1
。因此,r=00101 + 101<<1 = 00101 + 1010 = 01111
. - 第
11
行和i=2
:a[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:
您的结论不正确。所以你必须重新考虑你的进一步问题。