From 8d2ea38c54ebb0394dcf169f17c2863c0b2b9488 Mon Sep 17 00:00:00 2001 From: Andrei Solodovnikov Date: Mon, 18 Mar 2024 12:35:16 +0300 Subject: [PATCH 1/4] =?UTF-8?q?=D0=9B=D0=A01.=20=D0=97=D0=B0=D0=BC=D0=B5?= =?UTF-8?q?=D0=BD=D0=B0=20generate=20=D0=BD=D0=B0=20=D0=BC=D0=B0=D1=81?= =?UTF-8?q?=D1=81=D0=B8=D0=B2=20=D0=BC=D0=BE=D0=B4=D1=83=D0=BB=D0=B5=D0=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Массив модулей позволяет описать 32-битный сумматор более лаконично и что главнее — без использования цикла, который может навести на крамольные мысли о программировании. --- .pic/Labs/lab_01_adder/fig_07.png | Bin 53431 -> 0 bytes Labs/01. Adder/README.md | 80 +++++++++++++++++++++--------- 2 files changed, 56 insertions(+), 24 deletions(-) delete mode 100644 .pic/Labs/lab_01_adder/fig_07.png diff --git a/.pic/Labs/lab_01_adder/fig_07.png b/.pic/Labs/lab_01_adder/fig_07.png deleted file mode 100644 index a93280185b8271849bd04c86a3e6e54452741726..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 53431 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 z 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 Dk2}t^ diff --git a/Labs/01. Adder/README.md b/Labs/01. Adder/README.md index e9e19878..4156bf60 100644 --- a/Labs/01. Adder/README.md +++ b/Labs/01. Adder/README.md @@ -237,9 +237,21 @@ module fulladder( ); ``` -Далее, вам необходимо реализовать полный 32-разрядный сумматор. Соединять вручную 32 однотипных модуля чревато усталостью и ошибками, поэтому можно сначала создать 4-разрядный сумматор (либо другой разрядности), а затем из набора 4-разрядных сумматоров сделать 32-битный. +Далее, вам необходимо реализовать полный 32-разрядный сумматор со следующим прототипом: -Модуль должен быть описан в соответствии со следующим прототипом: +```systemverilog +module fulladder32( + іnput logic [31:0] a_i, + іnput logic [31:0] b_i, + іnput logic carry_i, + оutput logic [31:0] sum_o, + оutput logic carry_o +); +``` + +Соединять вручную 32 однотипных модуля чревато усталостью и ошибками, поэтому можно сначала создать 4-разрядный сумматор (либо другой разрядности), а затем из набора 4-разрядных сумматоров сделать 32-битный. + +Если вы решите делать 4-разрядный сумматор, то модуль должен быть описан в соответствии со следующим прототипом: ```SystemVerilog module fulladder4( @@ -251,36 +263,56 @@ module fulladder4( ); ``` -Либо же можно воспользоваться конструкцией `generate for`, пример использования которой вы можете увидеть на изображении ниже (так же существуют конструкции `generate if`, `generate case`). - -![../../.pic/Labs/lab_01_adder/fig_07.png](../../.pic/Labs/lab_01_adder/fig_07.png) - -_Рисунок 7. Пример использования конструкции generate for._ +либо же можно создать массив однобитных сумматоров. -Как вы можете догадаться, в этом примере создано 3 модуля, имена которых оканчиваются на значение итератора, по которому шел цикл, а к самим модулям подключены соответствующие итератору провода из шин. Разумеется, для своих целей вы можете использовать и **i+1** и двойные циклы. +Создание массива модулей схоже с созданием одного модуля за исключением того, что после имени сущности модуля указывается диапазон, определяющий количество модулей в массиве. При этом подключение сигналов к массиву модулей осуществляется следующим образом: -Обратите внимание на `: newgen` стоящий после ключевого слова `begin`. В некоторых САПР, код может не собраться, если у конструкции `generate for` нет названия (**лейбла**) с помощью подобной записи (двоеточия и названия). +- если разрядность подключаемого сигнала совпадает с разрядностью порта модуля из массива, этот сигнал подключается к каждому из модулей в массиве; +- если разрядность подключаемого сигнала превосходит разрядность порта модуля из массива в `N` раз (где `N` — количество модулей в массиве), к модулю подключается соответствующий диапазон бит подключаемого сигнала (диапазон меньших бит будет подключен к модулю с меньшим индексом в массиве). +- если разрядность подключаемого сигнала не подходит ни под один из описанных выше пунктов, происходит ошибка синтеза схемы, поскольку в этом случае САПР не способен понять каким образом подключать данный сигнал к каждому модулю из массива. -**Обратите внимание**, что данный рисунок не является решением вашей задачи, поскольку у вашего сумматора три входа и два выхода, а у сумматора в примере нет бита переноса. +Далее идет пример того, как можно создать массив модулей -Несмотря на то, что конструкция выглядит как [~~утка, плавает как утка и крякает как утка~~](https://ru.wikipedia.org/wiki/Утиный_тест) цикл и ведет себя как цикл, нужно понимать, что это не цикл в привычном вам понимании этого слова. Это по-прежнему не программа. Вместо этого, вы выделяете общую закономерность по размещению однотипных модулей на схеме и описываете эту закономерность в виде цикла. +```SystemVerilog +module example1( + input logic [3:0] a, + input logic b, + output logic c, + output logic d +); -Если вы захотите воспользоваться этой конструкцией, вам будет нужно продумать как вы будете: + assign c = |a ^ b; + assign d = &a; -1. соединять входной бит переноса вашего модуля с входным битом переноса нулевого сумматора; -2. передавать бит переноса с выхода предыдущего сумматора на вход следующего; -3. соединять выходной бит переноса вашего модуля с выходным битом переноса последнего однобитного сумматора. +endmodule -Далее идет пример того, как должен выглядеть заголовок модуля разрабатываемого устройства. +module example2( + input logic [31:0] A, + input logic B, + output logic [ 8:0] C +); -```systemverilog -module fulladder32( - іnput logic [31:0] a_i, - іnput logic [31:0] b_i, - іnput logic carry_i, - оutput logic [31:0] sum_o, - оutput logic carry_o +example1 instance_array[7:0]( // Создается массив из 8 модулей example1 + .a(A), // Поскольку разрядность сигнала A в 8 раз больше + // разрядности входа a, к каждому модулю в массиве + // будет подключен свой диапазон бит сигнала A + // (к instance_array[0] будет подключен диапазон + // A[3:0], к instance_array[7] будет подключен + // диапазон A[31:28]). + + .b(B) // Поскольку разрядность сигнала B совпадает с + // разрядностью входа b, сигнал B будет подключен + // как есть ко всем модулям в массиве. + + .c(C[7:0]) // Поскольку разрядность сигнала C не равна + // ни разрядности входа c, ни его увосьмиренной + // разрядности, мы должны выбрать такой диапазон + // бит, который будет удовлетворять одному из + // этих требований. + + .d(C[8]) // Аналогично предыдущему. ); +endmodule ``` ### Порядок выполнения задания @@ -303,7 +335,7 @@ module fulladder32( 4. Проверьте содержимое TCL-консоли. Убедитесь в появлении сообщения о завершении теста. В случае, если в tcl-консоли написано `CLICK THE BUTTON 'Run All'`, вам необходимо нажать соответствующую кнопку на панели моделирования. 5. Убедитесь по сигналам временной диаграммы, что модуль работает корректно. 8. В `Design Sources` проекта создайте `SystemVerilog`-файл `fulladder32`. -9. Опишите модуль `fulladder32` так, чтобы в нем выполнялось поразрядное сложение двух 32-разрядных чисел и входного бита переноса. Его можно реализовать через последовательное соединение восьми 4-битных сумматоров, либо же можно соединить 32 однобитных сумматора (как вручную, так и с помощью конструкции `generate for`). +9. Опишите модуль `fulladder32` так, чтобы в нем выполнялось поразрядное сложение двух 32-разрядных чисел и входного бита переноса. Его можно реализовать через последовательное соединение восьми 4-битных сумматоров, либо же можно соединить 32 однобитных сумматора (как вручную, так и с создания массива модулей). 1. Обратите внимание, что входной бит переноса должен подаваться на сумматор, выполняющий сложение нулевого разряда, выходной бит переноса соединяется с выходным битом переноса сумматора, выполняющего сложение 31-го разряда. 10. Проверьте 32-битный сумматор. Для этого: 1. В `Simulation Sources` проекта создайте `SystemVerilog`-файл `tb_fulladder32`. From d06a561d53cb2e0d5ffd45e6d6c7ee91de9b2db9 Mon Sep 17 00:00:00 2001 From: Andrei Solodovnikov Date: Mon, 18 Mar 2024 12:36:18 +0300 Subject: [PATCH 2/4] =?UTF-8?q?=D0=9B=D0=A02,=2012,=2015.=20=D0=98=D0=B7?= =?UTF-8?q?=D0=BC=D0=B5=D0=BD=D0=B5=D0=BD=D0=B8=D0=B5=20=D0=B2=20=D1=83?= =?UTF-8?q?=D0=BF=D0=BE=D0=BC=D0=B8=D0=BD=D0=B0=D0=BD=D0=B8=D1=8F=D1=85=20?= =?UTF-8?q?generate=20=D0=B1=D0=BB=D0=BE=D0=BA=D0=BE=D0=B2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Labs/02. Arithmetic-logic unit/README.md | 2 +- Labs/12. Daisy chain/README.md | 24 ++++++++++++++++++++++-- Labs/15. Programming device/README.md | 6 ++++++ 3 files changed, 29 insertions(+), 3 deletions(-) diff --git a/Labs/02. Arithmetic-logic unit/README.md b/Labs/02. Arithmetic-logic unit/README.md index fe1ddfd6..e9e48891 100644 --- a/Labs/02. Arithmetic-logic unit/README.md +++ b/Labs/02. Arithmetic-logic unit/README.md @@ -62,7 +62,7 @@ _Рисунок 3. Пример исполнения операции АЛУ._ Допустим, ваше устройство должно включить тостер, если на вход ему придет сигнал `32'haf3c5bd0`. Человек, не знакомый с устройством, при прочтении этого кода будет недоумевать, что это за число и почему используется именно оно. Однако, скрыв его за параметром `TOASTER_EN`, читающий поймет, что это код включения тостера. Кроме того, если некоторая константа должна использоваться в нескольких местах кода, то определив её через в виде параметра, можно будет менять её в одном месте, и она тут же поменяется везде. -Параметры позволяют влиять на структуру модуля. К примеру, описывая сумматор, можно параметризовать его разрядность и использовать этот параметр при описании модуля (например, в блоке `generate for`). В этом случае вы сможете создавать множество сумматоров различных разрядностей, подставляя при создании нужное вам значение параметра. +Параметры позволяют влиять на структуру модуля. К примеру, описывая сумматор, можно параметризовать его разрядность и использовать этот параметр при описании модуля (например, в качестве диапазона массива модулей). В этом случае вы сможете создавать множество сумматоров различных разрядностей, подставляя при создании нужное вам значение параметра. Параметр может быть объявлен в модуле двумя способами: diff --git a/Labs/12. Daisy chain/README.md b/Labs/12. Daisy chain/README.md index eec0e5a2..1230d797 100644 --- a/Labs/12. Daisy chain/README.md +++ b/Labs/12. Daisy chain/README.md @@ -17,10 +17,30 @@ _Рисунок 1. Структурная схема daisy chain._ Данная схема состоит из двух массивов элементов И. Первый массив (верхний ряд элементов) формирует многоразрядный сигнал (назовем его для определенности `ready`, на _рис. 1_ он обозначен как "_Приоритет_"), который перемножается с запросами с помощью массива элементов И нижнего ряда, формируя многоразрядный сигнал `y`. Обратите внимание на то, что результат операции И на очередном элементе нижнего массива влияет на результат И следующего за ним элемента верхнего массива и наоборот (`readyₙ₊₁` зависит от `yₙ`, в то время как `yₙ` зависит от `readyₙ`). Как только на одном из разрядов `y` появится значение `1`, оно сразу же распространится в виде `0` по всем оставшимся последующим разрядам `ready`, обнуляя их. А обнулившись, разряды `ready` обнулят соответствующие разряды `y` (нулевые разряды `ready` запрещают генерацию прерывания для соответствующих разрядов `y`). -Для описания верхнего ряда элементов И на языке SystemVerilog будет удобно воспользоваться конструкцией `generate for`, о которой рассказывалось в [ЛР 1 "Сумматор"](../01.%20Adder#Задание) (необходимо сделать непрерывное присваивание `readyₙ & !yₙ` для `n+1`-ого бита `ready`). - Нижний массив элементов И можно описать через непрерывное присваивание побитового И между `ready` и сигналом запросов на прерывание. +Для описания верхнего ряда элементов И вам будет необходимо сделать непрерывное присваивание `readyₙ & !yₙ` для `n+1`-ого бита `ready`. Для будет удобно воспользоваться конструкцией `generate for`, которая позволяет автоматизировать создание множества однотипных структур. + +Рассмотрим принцип работы этой конструкции. Предположим, мы хотим создать побитовое присваивание 5-битного сигнала `a` 5-битному сигналу `b`. + +Индексы, используемые конструкцией, должны быть объявлены с помощью ключевого слова `genvar`. Далее, в области, ограниченной ключевыми словами `generate`/`endgenerate` описывается цикл присваиваний / созданий модулей: + +```SystemVerilog +logic [4:0] a; +logic [4:0] b; + +// ... + +genvar i; +generate + for(i = 0; i < 5; i++) begin + assign a[i] = b[i]; + end +endgenerate +``` + +Разумеется в этом примере можно было бы просто сделать одно непрерывное присваивание `assign a = b;`, однако в случае реализации верхнего ряда элементов И, подобное многобитное непрерывное присваивание не приведет к синтезу требуемой схемы. + ## Практика Рассмотрим реализацию нашего контроллера прерываний: diff --git a/Labs/15. Programming device/README.md b/Labs/15. Programming device/README.md index 6427841f..253caed8 100644 --- a/Labs/15. Programming device/README.md +++ b/Labs/15. Programming device/README.md @@ -287,6 +287,12 @@ localparam FLASH_MSG_SIZE = 57; localparam ACK_MSG_SIZE = 4; logic [7:0] [7:0] flash_size_ascii, flash_addr_ascii; +// Блок generate позволяет создавать структуры модуля цикличным или условным +// образом. В данном случае, при описании непрерывных присваиваний была +// обнаружена закономерность, позволяющая описать четверки присваиваний в более +// общем виде, который был описан в виде цикла. +// Важно понимать, данный цикл лишь автоматизирует описание присваиваний и во +// время синтеза схемы развернется в четыре четверки непрерывных присваиваний. genvar i; generate for(i=0; i < 4; i=i+1) begin From 5627464ac0b11289cb9487acd56a5be26dbb259b Mon Sep 17 00:00:00 2001 From: Andrei Solodovnikov Date: Wed, 10 Apr 2024 11:33:49 +0300 Subject: [PATCH 3/4] Update Labs/01. Adder/README.md --- Labs/01. Adder/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Labs/01. Adder/README.md b/Labs/01. Adder/README.md index 4156bf60..9bc8ff1c 100644 --- a/Labs/01. Adder/README.md +++ b/Labs/01. Adder/README.md @@ -268,7 +268,7 @@ module fulladder4( Создание массива модулей схоже с созданием одного модуля за исключением того, что после имени сущности модуля указывается диапазон, определяющий количество модулей в массиве. При этом подключение сигналов к массиву модулей осуществляется следующим образом: - если разрядность подключаемого сигнала совпадает с разрядностью порта модуля из массива, этот сигнал подключается к каждому из модулей в массиве; -- если разрядность подключаемого сигнала превосходит разрядность порта модуля из массива в `N` раз (где `N` — количество модулей в массиве), к модулю подключается соответствующий диапазон бит подключаемого сигнала (диапазон меньших бит будет подключен к модулю с меньшим индексом в массиве). +- если разрядность подключаемого сигнала превосходит разрядность порта модуля из массива в `N` раз (где `N` — количество модулей в массиве), к модулю подключается соответствующий диапазон бит подключаемого сигнала (диапазон младших бит будет подключен к модулю с меньшим индексом в массиве). - если разрядность подключаемого сигнала не подходит ни под один из описанных выше пунктов, происходит ошибка синтеза схемы, поскольку в этом случае САПР не способен понять каким образом подключать данный сигнал к каждому модулю из массива. Далее идет пример того, как можно создать массив модулей From 86af48c6d79268adb24f699429ac3cd7e0b8c47e Mon Sep 17 00:00:00 2001 From: Andrei Solodovnikov Date: Wed, 10 Apr 2024 11:35:44 +0300 Subject: [PATCH 4/4] Update Labs/12. Daisy chain/README.md --- Labs/12. Daisy chain/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Labs/12. Daisy chain/README.md b/Labs/12. Daisy chain/README.md index 1230d797..e7f28c86 100644 --- a/Labs/12. Daisy chain/README.md +++ b/Labs/12. Daisy chain/README.md @@ -19,7 +19,7 @@ _Рисунок 1. Структурная схема daisy chain._ Нижний массив элементов И можно описать через непрерывное присваивание побитового И между `ready` и сигналом запросов на прерывание. -Для описания верхнего ряда элементов И вам будет необходимо сделать непрерывное присваивание `readyₙ & !yₙ` для `n+1`-ого бита `ready`. Для будет удобно воспользоваться конструкцией `generate for`, которая позволяет автоматизировать создание множества однотипных структур. +Для описания верхнего ряда элементов И вам будет необходимо сделать непрерывное присваивание `readyₙ & !yₙ` для `n+1`-ого бита `ready`. Для этого будет удобно воспользоваться конструкцией `generate for`, которая позволяет автоматизировать создание множества однотипных структур. Рассмотрим принцип работы этой конструкции. Предположим, мы хотим создать побитовое присваивание 5-битного сигнала `a` 5-битному сигналу `b`.