mirror of
https://github.com/MPSU/APS.git
synced 2025-09-15 17:20:10 +00:00
ЛР3. Добавление подписей к листингам
This commit is contained in:
@@ -111,6 +111,8 @@ logic [19:0] memory3 [1:16]; // А вот memory3 хоть и совпадае
|
||||
// особенность.
|
||||
```
|
||||
|
||||
_Листинг 1. Пример создания массива ячеек._
|
||||
|
||||
В приведенном листинге `logic [19:0] memory1 [16];` создается память с шестнадцатью (от 0-го до 15-го адреса) 20-битными ячейками памяти. В таком случае говорят, что ширина памяти 20 бит, а глубина 16. Для адресации такой памяти потребуется адрес с разрядностью ceil(log2(16)) = 4 бита (`ceil` — операция округления вверх). Это однопортовая память.
|
||||
|
||||
Для обращения к конкретной ячейке памяти используются квадратные скобки с указанием нужного адреса `memory[addr]`. Грубо говоря, то, что указывается в квадратных скобках будет подключено ко входу адреса памяти `memory`.
|
||||
@@ -158,6 +160,8 @@ module mem16_20 ( // создать блок с именем
|
||||
endmodule
|
||||
```
|
||||
|
||||
_Листинг 2. Пример описания портов памяти._
|
||||
|
||||
В случае реализации ПЗУ нет необходимости в описании входов для записи, поэтому описание памяти занимает всего пару строк. Чтобы проинициализировать такую память (то есть поместить в нее начальные значения, которые можно было бы из нее читать), требуемое содержимое нужно добавить к прошивке, вместе с которой данные попадут в ПЛИС. Для этого в проект добавляется текстовый файл формата `.mem` с содержимым памяти. Для того, чтобы отметить данный файл в качестве инициализирующего память, можно использовать системную функцию `$readmemh`.
|
||||
|
||||
У данной функции есть два обязательных аргумента:
|
||||
@@ -195,12 +199,14 @@ module rom16_8 (
|
||||
end // файла rom_data.mem
|
||||
|
||||
|
||||
assign read_data1 = R0M[addr1]; // реализация первого порта на чтение
|
||||
assign read_data2 = R0M[addr2] // реализация второго порта на чтение
|
||||
assign read_data1 = ROM[addr1]; // реализация первого порта на чтение
|
||||
assign read_data2 = ROM[addr2] // реализация второго порта на чтение
|
||||
|
||||
endmodule
|
||||
```
|
||||
|
||||
_Листинг 3. Пример использования инициализирующей функции $readmemh._
|
||||
|
||||
Содержимое файла `rom_data.mem`, к примеру может быть таким (каждая строка соответствует значению отдельной ячейки памяти, начиная со стартового адреса):
|
||||
|
||||
```hex
|
||||
@@ -285,6 +291,8 @@ import memory_pkg::INSTR_MEM_SIZE_WORDS;
|
||||
endmodule
|
||||
```
|
||||
|
||||
_Листинг 4. SystemVerilog-описание памяти инструкций._
|
||||
|
||||
### 3. Регистровый файл
|
||||
|
||||
На языке SystemVerilog необходимо реализовать модуль регистрового файла (`rf_r𝚒sсv`) для процессора с архитектурой RISC-V, представляющего собой трехпортовое ОЗУ с двумя портами на чтение и одним портом на запись и состоящей из 32-х 32-битных регистров, объединенных в массив с именем `rf_mem`.
|
||||
@@ -329,7 +337,7 @@ mоdulе rf_r𝚒sсv(
|
||||
2. Добавьте в проект файл [`memory_pkg.sv`](memory_pkg.sv). Этот файл содержит объявление пакета `memory_pkg`, в котором прописаны размеры памяти инструкций и памяти данных (реализуется позднее).
|
||||
3. Реализуйте память инструкций. Для этого:
|
||||
1. В `Design Sources` проекта с предыдущих лаб, создайте `SystemVerilog`-файл `instr_mem.sv`.
|
||||
2. Опишите в нем модуль памяти инструкций по предоставленному коду.
|
||||
2. Опишите в нем модуль памяти инструкций по предоставленному в _листинге 4_ коду.
|
||||
4. Реализуйте регистровый файл. Для этого:
|
||||
1. В `Design Sources` проекта создайте `SystemVerilog`-файл `rf_riscv.sv`.
|
||||
2. Опишите в нем модуль регистрового файла с таким же именем и портами, как указано в задании.
|
||||
|
Reference in New Issue
Block a user