Skip to content

Commit b67bd2f

Browse files
ЛР16. Исправление опечаток
* Опечатки ЛР № 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]>
1 parent 39bdea1 commit b67bd2f

File tree

1 file changed

+12
-12
lines changed

1 file changed

+12
-12
lines changed

Labs/16. Coremark/README.md

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@
2424

2525
Для вывода результатов тестирования, необходимо описать способ, которым coremark сможет выводить очередной символ сообщения — для этого мы будем использовать контроллер UART из ЛР№13.
2626

27-
Кроме того, скомпилированная без оптимизаций программа будет занимать чуть более 32KiB, поэтому нам потребуется изменить размер памяти инструкций.
27+
Кроме того, скомпилированная без оптимизаций программа будет занимать чуть более 32&nbsp;KiB, поэтому нам потребуется изменить размер памяти инструкций.
2828

2929
Таким образом, для того чтобы запустить данную программу, нам необходимо выполнить как аппаратные изменения процессорной системы (добавить таймер и (если отсутствует) контроллер UART), так и программные изменения самого coremark (для этого в нем предусмотрены специальные платформозависимые файлы, в которых объявлены функции, реализацию которых нам необходимо выполнить).
3030

@@ -34,7 +34,7 @@
3434

3535
1. Реализовать модуль-контроллер "таймер".
3636
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).
3838
3. Добавить реализацию платформозависимых функций программы coremark.
3939
4. Скомпилировать программу.
4040
5. Изменить размер памяти инструкций.
@@ -61,7 +61,7 @@
6161
|0x14 | RW | [0:2³²-1] | Указание количества повторений генерации прерываний |
6262
|0x24 | W | 1 | Программный сброс |
6363

64-
_Таблица 1. Адресное пространство
64+
_Таблица 1. Адресное пространство контроллера таймера._
6565

6666
Прототип модуля представлен в _листинге 1_.
6767

@@ -86,7 +86,7 @@ module timer_sb_ctrl(
8686
);
8787
```
8888

89-
_Листинг 1. Прототип таймера._
89+
_Листинг 1. Прототип контроллера таймера._
9090

9191
Обратите внимание, что у модуля нет сигнала `interrupt_return_i`. Модуль будет генерировать прерывания ровно на 1 такт. Если процессор в этот момент не будет готов обработать прерывания (обрабатывая в этот момент какой-либо другой перехват) — запрос будет сразу же пропущен и таймер начнет отсчитывать следующий.
9292

@@ -144,7 +144,7 @@ barebones_clock()
144144

145145
_Листинг 2. Код функции `barebones_clock`._
146146

147-
После ЛР№14 вы уже должны представлять, что здесь происходит. Мы создали указатель с абсолютным адресом `0x08000000` — адресом системного счётчика. Разыменование данного указателя вернет текущее значение системного счётчика, что и должно быть результатом вызова этой функции. Поскольку тест закончится менее чем за секунду, не обязательно загружать значение старших 32 бит (они будут не равны нулю только спустя 2³²тактов / 10⁶тактов/с ≈ 429c).
147+
После ЛР№14 вы уже должны представлять, что здесь происходит. Мы создали указатель с абсолютным адресом `0x08000000` — адресом системного счётчика. Разыменование данного указателя вернет текущее значение системного счётчика, что и должно быть результатом вызова этой функции. Поскольку тест закончится менее чем за секунду, не обязательно загружать значение старших 32 бит (они будут не равны нулю только спустя 2³² тактов / 10⁶ тактов/с ≈ 429 c).
148148

149149
Для того, чтобы корректно преобразовать тики системного счётчика во время, используется функция [`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):
150150

@@ -176,14 +176,14 @@ uart_send_char(char c)
176176
}
177177
```
178178
179-
_Листинг 3. Код функции `uart_send_char_`._
179+
_Листинг 3. Код функции `uart_send_char`._
180180
181181
`0x06000000` — базовый адрес контроллера UART TX из ЛР№13 (и адрес передаваемых этим контроллером данных).
182182
`0x08` — смещение до адреса регистра `busy` в адресном пространстве этого контроллера.
183183
184184
#### 3. Реализация функции первичной настройки
185185
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.
187187
Допустим мы хотим, чтобы данные передавались на скорости `115200`, c одним стоповым битом и контролем бита четности. В этом случае, мы должны добавить в начало функции следующий код:
188188
189189
```C
@@ -262,13 +262,13 @@ _Листинг 5. Последовательность команд для ко
262262

263263
### Изменение размера памяти инструкций
264264

265-
Как видите, размер секции инструкций превышает 32KiB на 1556 байт (32768—34000). Поэтому на время оценки моделирования, нам придется увеличить размер памяти инструкций до 64KiB, изменив значение параметра `INSTR_MEM_SIZE_BYTES` в пакете `memory_pkg` до значения `32'h10000`. Размер памяти данных также необходимо увеличить, изменив значение параметра `DATA_MEM_SIZE_BYTES` до `32'h4000`.
265+
Как видите, размер секции инструкций превышает 32&nbsp;KiB на 1556 байт (32768—34000). Поэтому на время оценки моделирования, нам придется увеличить размер памяти инструкций до 64&nbsp;KiB, изменив значение параметра `INSTR_MEM_SIZE_BYTES` в пакете `memory_pkg` до значения `32'h10000`. Размер памяти данных также необходимо увеличить, изменив значение параметра `DATA_MEM_SIZE_BYTES` до `32'h4000`.
266266

267267
Обратите внимание, что увеличение размера памяти в 16 раз приведет к значительному увеличению времени синтеза устройства, поэтому данное изменение мы производим исключительно на время поведенческого моделирования.
268268

269269
### Запуск моделирования
270270

271-
Программирование 34KiB по UART займет ощутимое время, поэтому вам предлагается проинициализировать память инструкций и данных "по-старинке" через системные функции `$readmemh`.
271+
Программирование 34&nbsp;KiB по UART займет ощутимое время, поэтому вам предлагается проинициализировать память инструкций и данных "по-старинке" через системные функции `$readmemh`.
272272

273273
Если все было сделано без ошибок, то примерно через `300ms` после снятия сигнала сброса с ядра процессора выход `tx_o` начнет быстро менять свое значение, сигнализируя о выводе результатов программы, которые отобразятся в `tcl console` примерно еще через `55ms` в виде _листинга 6_ (вывод сообщения будет завершен приблизительно на `355ms` времени моделирования).
274274

@@ -300,7 +300,7 @@ _Листинг 6. Лог вывода результатов coremark. Знач
300300
3. Интегрируйте модуль `timer_sb_ctrl` в процессорную систему.
301301
1. Ко входу `rst_i` модуля подключите сигнал `core_reset_o` программатора. Таким образом, системный счётчик начнет работать только когда память системы будет проинициализирована.
302302
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).
304304
5. Получите исходный код программы coremark. Для этого можно либо склонировать [репозиторий](https://github.com/eembc/coremark/tree/d5fad6bd094899101a4e5fd53af7298160ced6ab), либо скачать его в виде архива.
305305
6. Добавьте реализацию платформозависимых функций программы coremark. Для этого в папке `barebones` необходимо:
306306
1. в файле `core_portme.c`:
@@ -312,13 +312,13 @@ _Листинг 6. Лог вывода результатов coremark. Знач
312312
8. Скомпилируйте программу вызовом `make`.
313313
1. Если кросскомпилятор расположен не в директории `C:/riscv_cc`, перед вызовом `make` вам необходимо соответствующим образом отредактировать первую строчку в `Makefile`.
314314
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&nbsp;KiB, а памяти данных до 16&nbsp;KiB, изменив значение параметров `INSTR_MEM_SIZE_BYTES` и `DATA_MEM_SIZE_BYTES` в пакете `memory_pkg` на `32'h10_000` и `32'h4_000` соответственно.
316316
10. Проинициализируйте память инструкций и память данных файлами `coremark_instr.mem` и `coremark_data.mem`, полученными в ходе компиляции программы.
317317
1. Память можно проинициализировать двумя путями: с помощью вызова системной функции `$readmemh`, либо же с помощью программатора. Однако имейте в виду, что инициализация памятей с помощью программатора будет достаточно долго моделироваться в виду большого объема программы.
318318
2. В случае, если инициализация будет осуществляться посредством `$readmemh`, не забудьте удалить первую строчку со стартовым адресом из файла, инициализирующего память данных.
319319
3. В случае, если инициализация будет осуществляться с помощью программатора, используйте вспомогательные вызовы `program_region` из пакета `bluster_pkg`, как это было сделано в `lab_15_tb_system`.
320320
4. В исходном виде тестбенч описан под инициализацию памяти посредством `$readmemh`.
321-
11. Выполните моделирование системы с помощью модуля [lab_16.tb_coremark](lab_16.tb_coremark).
321+
11. Выполните моделирование системы с помощью модуля [lab_16.tb_coremark](lab_16.tb_coremark.sv).
322322
1. Результаты теста будут выведены приблизительно на `355ms` времени моделирования.
323323

324324
## Оценка производительности

0 commit comments

Comments
 (0)