Делать для циклов сумму между или после итераций? Verilog - PullRequest
0 голосов
/ 30 апреля 2020

Я буду использовать этот пример кода, чтобы задать некоторые общие вопросы о циклах.

Следующий код предназначен для создания простой функции умножения между двумя 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

Я считаю, что это дает желаемый результат, но я могу понять его только в том случае, если:

  1. Линии 7 или 9 (в зависимости от строки 6 очевидно) добавить к end результату 'for l oop' (который начинается в строке 10)
  2. Определение r из строки 7 или 9 не переносятся в строку 12 в 'for l oop'
  3. Каждая итерация (или "шаг") 'для l oop 'не переносит вычисленное значение для r из до значения индекса i в последующее значение индекса i

Если эти три вывода верны, то у меня есть следующие вопросы:

  • Суммируйте ли 'For Loops' свои итерации после всех возможных шагов?
  • Делать 'Для циклов' , а не переносить информацию об идентификаторе в в 'для l oop' , полученном из одного шага , на следующий, несмотря на один и тот же идентификатор появляется в обоих шагах (r в данном случае)? Ссылаясь на строку 12 здесь.
  • Откуда мне знать, что вывод № 1 был правдой? Что является основным правилом (ами)?

Наконец, я понимаю, что «для циклов» не обязательно добавлять, они просто повторяются, если выполняется условие. Только в этом примере добавление 'for l oop'.

Ответы [ 2 ]

1 голос
/ 30 апреля 2020

Нет разницы между for l oop в вашем примере и for l oop на любом другом языке программирования. Работает абсолютно одинаково. Все операторы внутри блока always выполняются последовательно, между ними нет другого механизма зависимости, кроме номеров строк.

Строки 7 или 9 (в зависимости от строки 6, очевидно) добавляют к концу результат 'for l oop' (который начинается в строке 10)

Это обычный оператор if, как и на любом другом языке. Сначала выполняется и присваивает начальное значение r, в зависимости от значения a[0].

Определение r из строк 7 или 9 не переносится в строку 12 в ' для l oop '

не уверен, что вы имеете в виду здесь. Предыдущий оператор if устанавливает начальное значение r, которое используется в первом принятом операторе if в l oop как r = r + b <<i;. Правая часть выражения содержит r, и в первый раз оно содержит начальное значение.

Каждая итерация (или «шаг») для for for l oop не содержит его вычисленное значение для r из предыдущего значения индекса i в последующее значение индекса i

Как и на любом языке программирования, значение r будет обновляться на каждой итерации, где оператор if приняты. Это обновленное значение будет использовано на следующей итерации l oop в том же выражении r = r + b <<i;.

Если эти три вывода верны, у меня есть следующие вопросы:

Ваши выводы неверны . Так что вы должны переосмыслить ваши дальнейшие вопросы.

1 голос
/ 30 апреля 2020

Лог c здесь очень прост. Рассмотрим 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.

...