【问题标题】:Do For Loops sum between or after iterations? VerilogFor循环在迭代之间或之后求和吗? Verilog
【发布时间】:2020-08-14 18:06:43
【问题描述】:

我将使用这个示例代码来询问一些关于 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 行(显然取决于6 行)添加到“for 循环”的 end 结果(从行开始) 10)
  2. r 的定义来自79 被引入到'for 循环'中的12
  3. “for 循环”的每次迭代(或“步骤”)不会将其计算的 r 值从 先前 索引值 i 带入 后续 em> 索引值i

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

  • 在完成所有可能的步骤后,“For 循环”是否对它们的迭代求和?
  • “For 循环”将有关标识符的信息从一个步骤派生的“for 循环”传递到下一步,尽管两个步骤中出现相同的标识符(在这种情况下为r)?在此处引用12 行。
  • 我怎么知道结论 #1 是真的?基本规则是什么?

最后,我明白“for 循环”不一定要添加,如果满足条件,它们只会重复。仅在此示例中添加了“for 循环”。

【问题讨论】:

  • 我没有测试过。它取自Intel's Verilog 基础教程。时间戳为 38:09。我相信ends 的数量是正确的。总共应该有 2 个:一个用于for,一个用于begin。注意:为简单起见,我的代码与英特尔的代码略有不同。他们处理 8 位数字

标签: verilog


【解决方案1】:

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

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

79 行用于计算t1 表示的值,for-loop 用于计算t2t3。所以:

  • 线6:a[0]=1。因此,r=001017 一致。
  • 11i=1a[1]=1。因此,r=00101 + 101&lt;&lt;1 = 00101 + 1010 = 01111
  • 11i=2a[2]=0。因此,r=01111

您应该阅读 Verilog 中的 blocking and non-blocking 分配。

【讨论】:

  • @Qiu 你的回答很有帮助。那么应该在代码中替换r+(b&lt;&lt;i) 吗?这似乎是我们在之前进行左移添加这似乎是不必要的(?)另外,我仍然想知道我的结论#1的下属规则是否?代码如何知道只需将示例中的 t1 添加到 for 循环的结果(t2t3)?
【解决方案2】:

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

第 7 行或第 9 行(显然取决于第 6 行)添加到“for 循环”的最终结果(从第 10 行开始)

这是一个普通的if 运算符,与任何其他语言一样。它首先执行并为r分配一个初始值,具体取决于a[0]的值。

第 7 行或第 9 行中 r 的定义没有被带入 'for 循环' 中的第 12 行

不知道你在这里的意思。前面的if 操作符设置了r 的初始值,在循环中第一个采取的if 语句中使用r = r + b &lt;&lt;i;。表达式的右侧包含r,第一次包含初始值。

“for 循环”的每次迭代(或“步骤”)不会将其计算的 r 值从先前的索引值 i 带入后续的索引值 i

与任何编程语言一样,r 的值将在每次使用 if 语句的迭代中更新。此更新后的值将在循环的下一次迭代中以相同的表达式 r = r + b &lt;&lt;i; 使用。

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

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

【讨论】:

    猜你喜欢
    • 2015-01-14
    • 1970-01-01
    • 2021-08-16
    • 2020-09-20
    • 2017-04-03
    • 1970-01-01
    • 2012-09-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多