You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
* Опечатки ЛР № 16
* Удаление дубликата startup.S в ЛР № 16
Все ссылки и так вели на 14 лабу, прямым текстом написано брать оттуда
* Ещё неразрывные пробелы перед единицами измерения
* Не писать неразрывные пробелы в заголовках
Не всё ПО правильно читает заголовки
* Убрал скобки
* Update Labs/16. Coremark/README.md
Co-authored-by: Andrei Solodovnikov <[email protected]>
* Приведение номеров лаб к уже установленному виду
* Revert "Удаление дубликата startup.S в ЛР № 16"
This reverts commit 8f48071.
---------
Co-authored-by: Andrei Solodovnikov <[email protected]>
Copy file name to clipboardExpand all lines: Labs/16. Coremark/README.md
+12-12Lines changed: 12 additions & 12 deletions
Original file line number
Diff line number
Diff line change
@@ -24,7 +24,7 @@
24
24
25
25
Для вывода результатов тестирования, необходимо описать способ, которым coremark сможет выводить очередной символ сообщения — для этого мы будем использовать контроллер UART из ЛР№13.
26
26
27
-
Кроме того, скомпилированная без оптимизаций программа будет занимать чуть более 32KiB, поэтому нам потребуется изменить размер памяти инструкций.
27
+
Кроме того, скомпилированная без оптимизаций программа будет занимать чуть более 32 KiB, поэтому нам потребуется изменить размер памяти инструкций.
28
28
29
29
Таким образом, для того чтобы запустить данную программу, нам необходимо выполнить как аппаратные изменения процессорной системы (добавить таймер и (если отсутствует) контроллер UART), так и программные изменения самого coremark (для этого в нем предусмотрены специальные платформозависимые файлы, в которых объявлены функции, реализацию которых нам необходимо выполнить).
30
30
@@ -34,7 +34,7 @@
34
34
35
35
1. Реализовать модуль-контроллер "таймер".
36
36
2. Подключить этот модуль к системной шине.
37
-
2.1. В случае, если до этого в ЛР13 вашим устройством вывода было не UART TX, вам необходимо подключить к системной шине готовый модуль [uart_tx_sb_ctrl](../Made-up%20modules/lab_13.uart_tx_sb_ctrl.sv).
37
+
1. В случае, если до этого в ЛР№13 вашим устройством вывода было не UART TX, вам необходимо подключить к системной шине готовый модуль [uart_tx_sb_ctrl](../Made-up%20modules/lab_13.uart_tx_sb_ctrl.sv).
38
38
3. Добавить реализацию платформозависимых функций программы coremark.
39
39
4. Скомпилировать программу.
40
40
5. Изменить размер памяти инструкций.
@@ -61,7 +61,7 @@
61
61
|0x14 | RW |[0:2³²-1]| Указание количества повторений генерации прерываний |
62
62
|0x24 | W | 1 | Программный сброс |
63
63
64
-
_Таблица 1. Адресное пространство
64
+
_Таблица 1. Адресное пространство контроллера таймера._
65
65
66
66
Прототип модуля представлен в _листинге 1_.
67
67
@@ -86,7 +86,7 @@ module timer_sb_ctrl(
86
86
);
87
87
```
88
88
89
-
_Листинг 1. Прототип таймера._
89
+
_Листинг 1. Прототип контроллера таймера._
90
90
91
91
Обратите внимание, что у модуля нет сигнала `interrupt_return_i`. Модуль будет генерировать прерывания ровно на 1 такт. Если процессор в этот момент не будет готов обработать прерывания (обрабатывая в этот момент какой-либо другой перехват) — запрос будет сразу же пропущен и таймер начнет отсчитывать следующий.
92
92
@@ -144,7 +144,7 @@ barebones_clock()
144
144
145
145
_Листинг 2. Код функции `barebones_clock`._
146
146
147
-
После ЛР№14 вы уже должны представлять, что здесь происходит. Мы создали указатель с абсолютным адресом `0x08000000` — адресом системного счётчика. Разыменование данного указателя вернет текущее значение системного счётчика, что и должно быть результатом вызова этой функции. Поскольку тест закончится менее чем за секунду, не обязательно загружать значение старших 32 бит (они будут не равны нулю только спустя 2³²тактов / 10⁶тактов/с ≈ 429c).
147
+
После ЛР№14 вы уже должны представлять, что здесь происходит. Мы создали указатель с абсолютным адресом `0x08000000` — адресом системного счётчика. Разыменование данного указателя вернет текущее значение системного счётчика, что и должно быть результатом вызова этой функции. Поскольку тест закончится менее чем за секунду, не обязательно загружать значение старших 32 бит (они будут не равны нулю только спустя 2³²тактов / 10⁶тактов/с ≈ 429 c).
148
148
149
149
Для того, чтобы корректно преобразовать тики системного счётчика во время, используется функция [`time_in_secs`](https://github.com/eembc/coremark/blob/d5fad6bd094899101a4e5fd53af7298160ced6ab/barebones/core_portme.c#L117), которая уже реализована, но для работы которой нужно определить макрос `CLOCKS_PER_SEC`, характеризующий тактовую частоту, на которой работает процессор. Давайте определим данный макрос сразу над макросом [`EE_TICKS_PER_SEC`](https://github.com/eembc/coremark/blob/d5fad6bd094899101a4e5fd53af7298160ced6ab/barebones/core_portme.c#L62):
150
150
@@ -176,14 +176,14 @@ uart_send_char(char c)
176
176
}
177
177
```
178
178
179
-
_Листинг 3. Код функции `uart_send_char_`._
179
+
_Листинг 3. Код функции `uart_send_char`._
180
180
181
181
`0x06000000` — базовый адрес контроллера UART TX из ЛР№13 (и адрес передаваемых этим контроллером данных).
182
182
`0x08` — смещение до адреса регистра `busy` в адресном пространстве этого контроллера.
183
183
184
184
#### 3. Реализация функции первичной настройки
185
185
186
-
Это функция [`portable_init`](https://github.com/eembc/coremark/blob/d5fad6bd094899101a4e5fd53af7298160ced6ab/barebones/core_portme.c#L130), расположена в уже известном ранее файле [`core_portme`.c]. Данная функция выполняет необходимые нам настройки перед началом теста. Для нас главное — настроить нужным образом контроллер UART.
186
+
Это функция [`portable_init`](https://github.com/eembc/coremark/blob/d5fad6bd094899101a4e5fd53af7298160ced6ab/barebones/core_portme.c#L130), расположена в уже известном ранее файле `core_portme.c`. Данная функция выполняет необходимые нам настройки перед началом теста. Для нас главное — настроить нужным образом контроллер UART.
187
187
Допустим мы хотим, чтобы данные передавались на скорости `115200`, c одним стоповым битом и контролем бита четности. В этом случае, мы должны добавить в начало функции следующий код:
188
188
189
189
```C
@@ -262,13 +262,13 @@ _Листинг 5. Последовательность команд для ко
262
262
263
263
### Изменение размера памяти инструкций
264
264
265
-
Как видите, размер секции инструкций превышает 32KiB на 1556 байт (32768—34000). Поэтому на время оценки моделирования, нам придется увеличить размер памяти инструкций до 64KiB, изменив значение параметра `INSTR_MEM_SIZE_BYTES` в пакете `memory_pkg` до значения `32'h10000`. Размер памяти данных также необходимо увеличить, изменив значение параметра `DATA_MEM_SIZE_BYTES` до `32'h4000`.
265
+
Как видите, размер секции инструкций превышает 32 KiB на 1556 байт (32768—34000). Поэтому на время оценки моделирования, нам придется увеличить размер памяти инструкций до 64 KiB, изменив значение параметра `INSTR_MEM_SIZE_BYTES` в пакете `memory_pkg` до значения `32'h10000`. Размер памяти данных также необходимо увеличить, изменив значение параметра `DATA_MEM_SIZE_BYTES` до `32'h4000`.
266
266
267
267
Обратите внимание, что увеличение размера памяти в 16 раз приведет к значительному увеличению времени синтеза устройства, поэтому данное изменение мы производим исключительно на время поведенческого моделирования.
268
268
269
269
### Запуск моделирования
270
270
271
-
Программирование 34KiB по UART займет ощутимое время, поэтому вам предлагается проинициализировать память инструкций и данных "по-старинке" через системные функции `$readmemh`.
271
+
Программирование 34 KiB по UART займет ощутимое время, поэтому вам предлагается проинициализировать память инструкций и данных "по-старинке" через системные функции `$readmemh`.
272
272
273
273
Если все было сделано без ошибок, то примерно через `300ms` после снятия сигнала сброса с ядра процессора выход `tx_o` начнет быстро менять свое значение, сигнализируя о выводе результатов программы, которые отобразятся в `tcl console` примерно еще через `55ms` в виде _листинга 6_ (вывод сообщения будет завершен приблизительно на `355ms` времени моделирования).
3. Интегрируйте модуль `timer_sb_ctrl` в процессорную систему.
301
301
1. Ко входу `rst_i` модуля подключите сигнал `core_reset_o` программатора. Таким образом, системный счётчик начнет работать только когда память системы будет проинициализирована.
302
302
2. Сигнал прерывания этого модуля подключать не обязательно, т.к. coremark будет осуществлять чтение путем опроса системного счётчика, а не по прерыванию.
303
-
4. В случае, если до этого в Л№Р13 вашим устройством вывода было не UART TX, вам необходимо подключить к системной шине готовый модуль [uart_tx_sb_ctrl](../Made-up%20modules/lab_13.uart_tx_sb_ctrl.sv).
303
+
4. В случае, если до этого в ЛР№13 вашим устройством вывода было не UART TX, вам необходимо подключить к системной шине готовый модуль [uart_tx_sb_ctrl](../Made-up%20modules/lab_13.uart_tx_sb_ctrl.sv).
304
304
5. Получите исходный код программы coremark. Для этого можно либо склонировать [репозиторий](https://github.com/eembc/coremark/tree/d5fad6bd094899101a4e5fd53af7298160ced6ab), либо скачать его в виде архива.
305
305
6. Добавьте реализацию платформозависимых функций программы coremark. Для этого в папке `barebones` необходимо:
1. Если кросскомпилятор расположен не в директории `C:/riscv_cc`, перед вызовом `make` вам необходимо соответствующим образом отредактировать первую строчку в `Makefile`.
314
314
2. В случае отсутствия на компьютере утилиты `make`, вы можете самостоятельно скомпилировать программу вызовом команд, представленных в параграфе ["Компиляция"](#компиляция).
315
-
9. Временно измените размер памяти инструкций до 64KiB, а памяти данных до 16KiB, изменив значение параметров `INSTR_MEM_SIZE_BYTES` и `DATA_MEM_SIZE_BYTES` в пакете `memory_pkg` на `32'h10_000` и `32'h4_000` соответственно.
315
+
9. Временно измените размер памяти инструкций до 64 KiB, а памяти данных до 16 KiB, изменив значение параметров `INSTR_MEM_SIZE_BYTES` и `DATA_MEM_SIZE_BYTES` в пакете `memory_pkg` на `32'h10_000` и `32'h4_000` соответственно.
316
316
10. Проинициализируйте память инструкций и память данных файлами `coremark_instr.mem` и `coremark_data.mem`, полученными в ходе компиляции программы.
317
317
1. Память можно проинициализировать двумя путями: с помощью вызова системной функции `$readmemh`, либо же с помощью программатора. Однако имейте в виду, что инициализация памятей с помощью программатора будет достаточно долго моделироваться в виду большого объема программы.
318
318
2. В случае, если инициализация будет осуществляться посредством `$readmemh`, не забудьте удалить первую строчку со стартовым адресом из файла, инициализирующего память данных.
319
319
3. В случае, если инициализация будет осуществляться с помощью программатора, используйте вспомогательные вызовы `program_region` из пакета `bluster_pkg`, как это было сделано в `lab_15_tb_system`.
320
320
4. В исходном виде тестбенч описан под инициализацию памяти посредством `$readmemh`.
321
-
11. Выполните моделирование системы с помощью модуля [lab_16.tb_coremark](lab_16.tb_coremark).
321
+
11. Выполните моделирование системы с помощью модуля [lab_16.tb_coremark](lab_16.tb_coremark.sv).
322
322
1. Результаты теста будут выведены приблизительно на `355ms` времени моделирования.
0 commit comments