mirror of
https://github.com/MPSU/APS.git
synced 2026-01-11 21:25:32 +00:00
Compare commits
4 Commits
d72f6b424f
...
master
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
0bc66d1e1f | ||
|
|
e16fd228e6 | ||
|
|
fa5bb16bbd | ||
|
|
d903badf3c |
2
.github/Intro.md
vendored
2
.github/Intro.md
vendored
@@ -151,7 +151,7 @@ Readme.md
|
|||||||
|
|
||||||
Здесь находятся методические материалы ко всем 16 лабораторным работам, разложенные по соответствующим им папкам.
|
Здесь находятся методические материалы ко всем 16 лабораторным работам, разложенные по соответствующим им папкам.
|
||||||
|
|
||||||
Практически в каждой такой папке находится файл формата _lab_xx.tb_xxx.sv_ — это файл с верификационным окружением для данной лабораторной работы. Такой файл необходимо добавлять в _Simulation Sources_ проекта (подробней в разделе _Vivado Basics_).
|
Практически в каждой такой папке находится файл формата _lab_xx.tb_xxx.sv_ — это файл с верификационным окружением для данной лабораторной работы. Такой файл необходимо добавлять в _Simulation Sources_ проекта (подробнее в разделе _Vivado Basics_).
|
||||||
|
|
||||||
Кроме того, в папке лабораторной работы могут находиться _xxx_pkg.sv_ и _xxx.mem_ файлы, содержащие соответственно параметры и данные, которыми необходимо проинициализировать память устройства. Такие файлы будет необходимо добавлять в _Design Sources_ проекта.
|
Кроме того, в папке лабораторной работы могут находиться _xxx_pkg.sv_ и _xxx.mem_ файлы, содержащие соответственно параметры и данные, которыми необходимо проинициализировать память устройства. Такие файлы будет необходимо добавлять в _Design Sources_ проекта.
|
||||||
|
|
||||||
|
|||||||
34
ERRATA.md
34
ERRATA.md
@@ -2,6 +2,24 @@
|
|||||||
|
|
||||||

|

|
||||||
|
|
||||||
|
**30.12.2025**: В Финальном обзоре ЛР№4 (стр. 111) указан неверный тип константы для инструкций переходов: 23-битная `const`, в то время как на самом деле используется 8-битная `offset`.
|
||||||
|
|
||||||
|
<details>
|
||||||
|
<summary> Исправленная версия абзаца </summary>
|
||||||
|
|
||||||
|
```diff
|
||||||
|
1. 10 вычислительных инструкций 0 0 01 alu_op RA1 RA2 xxxx xxxx WA
|
||||||
|
2. Инструкция загрузки константы 0 0 00 const WA
|
||||||
|
3. Инструкция загрузки из внешних устройств 0 0 10 xxx xxxx xxxx xxxx xxxx xxxx WA
|
||||||
|
---4. Безусловный переход 1 x xx xxx xxxx xxxx xxxx const xxxxx
|
||||||
|
---5. 6 инструкций условного перехода 0 1 xx alu_op RA1 RA2 const xxxxx
|
||||||
|
+++4. Безусловный переход 1 x xx xxx xxxx xxxx xxxx offset xxxxx
|
||||||
|
+++5. 6 инструкций условного перехода 0 1 xx alu_op RA1 RA2 offset xxxxx
|
||||||
|
```
|
||||||
|
</details>
|
||||||
|
|
||||||
|
<br>
|
||||||
|
|
||||||
**28.10.2025**: В ЛР№3 (стр. 90) указано неверное количество блоков, необходимое для реализации 1 KiB памяти.
|
**28.10.2025**: В ЛР№3 (стр. 90) указано неверное количество блоков, необходимое для реализации 1 KiB памяти.
|
||||||
|
|
||||||
<details>
|
<details>
|
||||||
@@ -11,7 +29,7 @@
|
|||||||
|
|
||||||
</details>
|
</details>
|
||||||
|
|
||||||
<br><br>
|
<br>
|
||||||
|
|
||||||
**27.10.2025**: Исправлено отображение инверсии выхода Q̅ в _рисунках I.2-13_ и _I.3-6_.
|
**27.10.2025**: Исправлено отображение инверсии выхода Q̅ в _рисунках I.2-13_ и _I.3-6_.
|
||||||
|
|
||||||
@@ -22,7 +40,7 @@
|
|||||||
|
|
||||||
</details>
|
</details>
|
||||||
|
|
||||||
<br><br>
|
<br>
|
||||||
|
|
||||||
**27.10.2025**: Исправлена опечатка в описании функционального поведения ведомой защёлки в составе D-триггера на стр. 41:
|
**27.10.2025**: Исправлена опечатка в описании функционального поведения ведомой защёлки в составе D-триггера на стр. 41:
|
||||||
|
|
||||||
@@ -38,7 +56,7 @@
|
|||||||
|
|
||||||
</details>
|
</details>
|
||||||
|
|
||||||
<br><br>
|
<br>
|
||||||
|
|
||||||
**22.05.2025**: Исправлено несоответствие в названиях модулей в ЛР10-12.
|
**22.05.2025**: Исправлено несоответствие в названиях модулей в ЛР10-12.
|
||||||
|
|
||||||
@@ -56,7 +74,7 @@ _Рисунок II.12-3. Структурная схема блока приор
|
|||||||
|
|
||||||
</details>
|
</details>
|
||||||
|
|
||||||
<br><br>
|
<br>
|
||||||
|
|
||||||
**13.05.2025**: Исправлен рисунок II.8-3 — исправлена опечатка в названии нижнего сигнала (`mem_wd_i` → `mem_wd_o`).
|
**13.05.2025**: Исправлен рисунок II.8-3 — исправлена опечатка в названии нижнего сигнала (`mem_wd_i` → `mem_wd_o`).
|
||||||
|
|
||||||
@@ -85,7 +103,7 @@ _Рисунок II.12-3. Структурная схема блока приор
|
|||||||
|
|
||||||
</details>
|
</details>
|
||||||
|
|
||||||
<br><br>
|
<br>
|
||||||
|
|
||||||
**11.07.2025**: Обнаружена ошибка вёрстки в примере использования битовых сдвигов на стр. 79. Операции по установке, очистке и чтению N-го бита выглядят следующим образом:
|
**11.07.2025**: Обнаружена ошибка вёрстки в примере использования битовых сдвигов на стр. 79. Операции по установке, очистке и чтению N-го бита выглядят следующим образом:
|
||||||
|
|
||||||
@@ -95,7 +113,7 @@ X = X & ~(1 << N); // Очистка N-го бита
|
|||||||
Y = (X & (1 << N)) != 0; // Чтение N-го бита
|
Y = (X & (1 << N)) != 0; // Чтение N-го бита
|
||||||
```
|
```
|
||||||
|
|
||||||
<br><br>
|
<br>
|
||||||
|
|
||||||
**11.07.2025**: Исправлена опечатка в предпоследнем абзаце стр. 227 (в конце первого предложения должен был быть написан **LMA**):
|
**11.07.2025**: Исправлена опечатка в предпоследнем абзаце стр. 227 (в конце первого предложения должен был быть написан **LMA**):
|
||||||
|
|
||||||
@@ -111,13 +129,13 @@ Y = (X & (1 << N)) != 0; // Чтение N-го бита
|
|||||||
|
|
||||||
</details>
|
</details>
|
||||||
|
|
||||||
<br><br>
|
<br>
|
||||||
|
|
||||||
**16.06.2025**: Исправлена ошибка в _листинге II.14-2_.
|
**16.06.2025**: Исправлена ошибка в _листинге II.14-2_.
|
||||||
|
|
||||||
Предпоследнюю инструкцию (`lw a0, 40(a0)`) следует читать как `lw a0, 24(a0)`.
|
Предпоследнюю инструкцию (`lw a0, 40(a0)`) следует читать как `lw a0, 24(a0)`.
|
||||||
|
|
||||||
<br><br>
|
<br>
|
||||||
|
|
||||||
**29.03.2025**: Исправлен рисунок II.4-4 — убрана логика безусловного перехода, т.к. она должна была появиться только в следующем параграфе.
|
**29.03.2025**: Исправлен рисунок II.4-4 — убрана логика безусловного перехода, т.к. она должна была появиться только в следующем параграфе.
|
||||||
|
|
||||||
|
|||||||
@@ -190,7 +190,7 @@ _Рисунок 5. Схема 4-битного сумматора._
|
|||||||
|
|
||||||
Как же реализовать модуль, состоящий из цепочки других модулей? Половину этой задачи мы уже сделали, когда писали тестбенч к 1-битному полусумматору в _Листинге 2_ — мы создавали модуль внутри другого модуля и подключали к нему провода. Теперь надо сделать то же самое, только с чуть большим числом модулей.
|
Как же реализовать модуль, состоящий из цепочки других модулей? Половину этой задачи мы уже сделали, когда писали тестбенч к 1-битному полусумматору в _Листинге 2_ — мы создавали модуль внутри другого модуля и подключали к нему провода. Теперь надо сделать то же самое, только с чуть большим числом модулей.
|
||||||
|
|
||||||
Описание 4-битного сумматора, сводится к описанию межсоединения четырёх экземпляров 1-битного сумматора. Подробней о том, как описывать создание экземпляров модулей рассказано в главе [Описание модулей на языке SystemVerilog](../../Basic%20Verilog%20structures/Modules.md#Иерархия-модулей), который вы изучали перед лабораторной работой.
|
Описание 4-битного сумматора, сводится к описанию межсоединения четырёх экземпляров 1-битного сумматора. Подробнее о том, как описывать создание экземпляров модулей рассказано в главе [Описание модулей на языке SystemVerilog](../../Basic%20Verilog%20structures/Modules.md#Иерархия-модулей), который вы изучали перед лабораторной работой.
|
||||||
|
|
||||||

|

|
||||||
|
|
||||||
@@ -280,7 +280,7 @@ example1 instance_array[7:0]( // Создается массив из 8 моду
|
|||||||
// как есть ко всем модулям в массиве.
|
// как есть ко всем модулям в массиве.
|
||||||
|
|
||||||
.c(C[7:0]), // Поскольку разрядность сигнала C не равна
|
.c(C[7:0]), // Поскольку разрядность сигнала C не равна
|
||||||
// ни разрядности входа c, ни его увосьмиренной
|
// ни разрядности входа c, ни его увосьмерённой
|
||||||
// разрядности, мы должны выбрать такой диапазон
|
// разрядности, мы должны выбрать такой диапазон
|
||||||
// бит, который будет удовлетворять одному из
|
// бит, который будет удовлетворять одному из
|
||||||
// этих требований.
|
// этих требований.
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
# Лабораторная работа №2. Арифметико-логическое устройство
|
# Лабораторная работа №2. Арифметико-логическое устройство
|
||||||
|
|
||||||
Так как основной задачей процессора является обработка цифровых данных, одним из его основных блоков является арифметико-логическое устройство (АЛУ). Задача АЛУ производить над входными данным арифметические и поразрядно логические операции.
|
Так как основной задачей процессора является обработка цифровых данных, одним из его основных блоков является арифметико-логическое устройство (АЛУ). Задача АЛУ производить над входными данными арифметические и поразрядно логические операции.
|
||||||
|
|
||||||
## Цель
|
## Цель
|
||||||
|
|
||||||
@@ -234,7 +234,7 @@ endmodule
|
|||||||
|
|
||||||
Для удобства чтения, список инструкций разбит на две таблицы.
|
Для удобства чтения, список инструкций разбит на две таблицы.
|
||||||
|
|
||||||
В первой таблице перечислены операции, вычисляющие значение сигнала `result_o`. **При любом коде операции, не входящим в эту таблицу, сигнал `result_o` должен быть равен нулю**.
|
В первой таблице перечислены операции, вычисляющие значение сигнала `result_o`. **При получении АЛУ любого кода операции, не входящего в эту таблицу, сигнал `result_o` должен быть равен нулю**.
|
||||||
|
|
||||||
|Операция|={cmp, mod, opcode}|Выражение | Действие |
|
|Операция|={cmp, mod, opcode}|Выражение | Действие |
|
||||||
|--------|-------------------|-----------------------|-------------------------------------------------------|
|
|--------|-------------------|-----------------------|-------------------------------------------------------|
|
||||||
@@ -251,7 +251,7 @@ endmodule
|
|||||||
|
|
||||||
_Таблица 1. Список вычислительных операций._
|
_Таблица 1. Список вычислительных операций._
|
||||||
|
|
||||||
Во второй таблице перечислены операции, вычисляющие значение сигнала `flag_o`. **При любом коде операции, не входящим в эту таблицу, сигнал flag_o должен быть равен нулю**.
|
Во второй таблице перечислены операции, вычисляющие значение сигнала `flag_o`. **При получении АЛУ любого кода операции, не входящего в эту таблицу, сигнал `flag_o` должен быть равен нулю**.
|
||||||
|
|
||||||
|Операция|={cmp, mod, opcode}| Выражение | Действие |
|
|Операция|={cmp, mod, opcode}| Выражение | Действие |
|
||||||
|--------|-------------------|----------------------|-----------------------------------|
|
|--------|-------------------|----------------------|-----------------------------------|
|
||||||
|
|||||||
@@ -139,7 +139,7 @@ endtask
|
|||||||
|
|
||||||
task direct_test();
|
task direct_test();
|
||||||
|
|
||||||
logic [4:0] flag_opcodes_1[6] = {ALU_SLTS, ALU_SLTU, ALU_LTS, ALU_GES, ALU_LTU, ALU_GEU};
|
logic [4:0] flag_opcodes_1[8] = {ALU_SLTS, ALU_SLTU, ALU_LTS, ALU_GES, ALU_LTU, ALU_GEU, ALU_EQ, ALU_NE};
|
||||||
logic [4:0] flag_opcodes_2[3] = {ALU_SLL, ALU_SRL, ALU_SRA};
|
logic [4:0] flag_opcodes_2[3] = {ALU_SLL, ALU_SRL, ALU_SRA};
|
||||||
logic [4:0] flag_opcodes_3[2] = {ALU_ADD, ALU_SUB};
|
logic [4:0] flag_opcodes_3[2] = {ALU_ADD, ALU_SUB};
|
||||||
logic [4:0] flag_opcodes_4[5] = {ALU_XOR, ALU_OR, ALU_AND, ALU_EQ, ALU_NE};
|
logic [4:0] flag_opcodes_4[5] = {ALU_XOR, ALU_OR, ALU_AND, ALU_EQ, ALU_NE};
|
||||||
|
|||||||
@@ -100,7 +100,7 @@ logic [19:0] memory3 [15:0]; // memory3 будет такой же память
|
|||||||
// лабораторных работ будет скорее минусом).
|
// лабораторных работ будет скорее минусом).
|
||||||
|
|
||||||
|
|
||||||
logic [19:0] memory3 [1:16]; // А вот memory3 хоть и совпадает по
|
logic [19:0] memory4 [1:16]; // А вот memory4 хоть и совпадает по
|
||||||
// размеру с предыдущими реализациями,
|
// размеру с предыдущими реализациями,
|
||||||
// но отличается по адресному пространству
|
// но отличается по адресному пространству
|
||||||
// обращение по нулевому адресу выдаст
|
// обращение по нулевому адресу выдаст
|
||||||
|
|||||||
@@ -271,8 +271,8 @@ _Рисунок 5. Реализация безусловного переход
|
|||||||
1. 10 вычислительных инструкций `0 0 01 alu_op RA1 RA2 xxxx xxxx WA`
|
1. 10 вычислительных инструкций `0 0 01 alu_op RA1 RA2 xxxx xxxx WA`
|
||||||
2. Инструкция загрузки константы `0 0 00 const WA`
|
2. Инструкция загрузки константы `0 0 00 const WA`
|
||||||
3. Инструкция загрузки из внешних устройств `0 0 10 xxx xxxx xxxx xxxx xxxx xxxx WA`
|
3. Инструкция загрузки из внешних устройств `0 0 10 xxx xxxx xxxx xxxx xxxx xxxx WA`
|
||||||
4. Безусловный переход `1 x xx xxx xxxx xxxx xxxx const xxxxx`
|
4. Безусловный переход `1 x xx xxx xxxx xxxx xxxx offset xxxxx`
|
||||||
5. 6 инструкций условного перехода `0 1 xx alu_op RA1 RA2 const xxxxx`
|
5. 6 инструкций условного перехода `0 1 xx alu_op RA1 RA2 offset xxxxx`
|
||||||
|
|
||||||
При кодировании инструкций используются следующие поля:
|
При кодировании инструкций используются следующие поля:
|
||||||
|
|
||||||
|
|||||||
@@ -151,7 +151,7 @@ _Таблица 2. Значения сигнала `mem_size_o` при пере
|
|||||||
|
|
||||||
Сигнал, который должен принять значение `1`, в случае если пришла инструкция, которая не входит в список поддерживаемых процессором.
|
Сигнал, который должен принять значение `1`, в случае если пришла инструкция, которая не входит в список поддерживаемых процессором.
|
||||||
|
|
||||||
Это не единственное, что должен сделать декодер в подобной ситуации. Давайте разберем подробней, что должно происходить по приходу нелегальной инструкции.
|
Это не единственное, что должен сделать декодер в подобной ситуации. Давайте разберем подробнее, что должно происходить по приходу нелегальной инструкции.
|
||||||
|
|
||||||
## Обработка нелегальной инструкции
|
## Обработка нелегальной инструкции
|
||||||
|
|
||||||
|
|||||||
@@ -97,7 +97,7 @@ _Рисунок 1. Распределение привилегий по уров
|
|||||||
|
|
||||||
_Таблица 1. Список регистров, подлежащих реализации в рамках лабораторной работы [[6](https://github.com/riscv/riscv-isa-manual/releases/download/20240411/priv-isa-asciidoc.pdf), стр. 17]._
|
_Таблица 1. Список регистров, подлежащих реализации в рамках лабораторной работы [[6](https://github.com/riscv/riscv-isa-manual/releases/download/20240411/priv-isa-asciidoc.pdf), стр. 17]._
|
||||||
|
|
||||||
По адресу `0x304` должен располагаться регистр, позволяющий маскировать перехваты. Например, если на 5-ом входе системы прерывания генерируется прерывание, то процессор отреагирует на него только в том случае, если 5-ый бит регистра `mie` будет равен 1. Младшие 16 бит этого регистра спецификация RISC-V отводит под маскирование специальных системных прерываний [[6](https://github.com/riscv/riscv-isa-manual/releases/download/20240411/priv-isa-asciidoc.pdf), стр. 36], которые не будут поддерживаться нашим процессором (подробней об этом будет в описании регистра mcause). Поэтому в нашей процессорной системе мы будем использовать только старшие 16 бит регистра `mie`, которые отведены для нужд конкретной платформы.
|
По адресу `0x304` должен располагаться регистр, позволяющий маскировать перехваты. Например, если на 5-ом входе системы прерывания генерируется прерывание, то процессор отреагирует на него только в том случае, если 5-ый бит регистра `mie` будет равен 1. Младшие 16 бит этого регистра спецификация RISC-V отводит под маскирование специальных системных прерываний [[6](https://github.com/riscv/riscv-isa-manual/releases/download/20240411/priv-isa-asciidoc.pdf), стр. 36], которые не будут поддерживаться нашим процессором (подробнее об этом будет в описании регистра mcause). Поэтому в нашей процессорной системе мы будем использовать только старшие 16 бит регистра `mie`, которые отведены для нужд конкретной платформы.
|
||||||
|
|
||||||
По адресу `0x305` должен располагаться регистр `mtvec`, который состоит из двух полей: BASE[31:2] и MODE. Поле BASE хранит старшие 30 бит базового адреса обработчика перехвата (поскольку этот адрес должен быть всегда равен четырём, младшие два бита считаются равными нулю). Поле MODE кодирует тип системы прерывания:
|
По адресу `0x305` должен располагаться регистр `mtvec`, который состоит из двух полей: BASE[31:2] и MODE. Поле BASE хранит старшие 30 бит базового адреса обработчика перехвата (поскольку этот адрес должен быть всегда равен четырём, младшие два бита считаются равными нулю). Поле MODE кодирует тип системы прерывания:
|
||||||
|
|
||||||
|
|||||||
@@ -36,7 +36,7 @@ module lab_11_tb_processor_system();
|
|||||||
rst = 0;
|
rst = 0;
|
||||||
repeat(20)@(posedge clk);
|
repeat(20)@(posedge clk);
|
||||||
DUT.irq_req = 1;
|
DUT.irq_req = 1;
|
||||||
while(DUT.irq_ret == 0) begin
|
while(DUT.irq_ret !== 1) begin
|
||||||
@(posedge clk);
|
@(posedge clk);
|
||||||
end
|
end
|
||||||
DUT.irq_req = 0;
|
DUT.irq_req = 0;
|
||||||
|
|||||||
@@ -51,7 +51,7 @@ Readme.md
|
|||||||
|
|
||||||
Здесь находятся методические материалы ко всем 16 лабораторным работам, разложенные по соответствующим им папкам.
|
Здесь находятся методические материалы ко всем 16 лабораторным работам, разложенные по соответствующим им папкам.
|
||||||
|
|
||||||
Практически в каждой такой папке находится файл формата `lab_xx.tb_xxx.sv` — это файл с верификационным окружением для данной лабораторной работы. Такой файл необходимо добавлять в _Simulation Sources_ проекта (подробней в разделе _Vivado Basics_).
|
Практически в каждой такой папке находится файл формата `lab_xx.tb_xxx.sv` — это файл с верификационным окружением для данной лабораторной работы. Такой файл необходимо добавлять в _Simulation Sources_ проекта (подробнее в разделе _Vivado Basics_).
|
||||||
|
|
||||||
Кроме того, в папке лабораторной работы могут находиться `xxx_pkg.sv` и `xxx.mem` файлы, содержащие соответственно параметры и данные, которыми необходимо проинициализировать память устройства. Такие файлы будет необходимо добавлять в _Design Sources_ проекта.
|
Кроме того, в папке лабораторной работы могут находиться `xxx_pkg.sv` и `xxx.mem` файлы, содержащие соответственно параметры и данные, которыми необходимо проинициализировать память устройства. Такие файлы будет необходимо добавлять в _Design Sources_ проекта.
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user