ЛР15. Добавление тб для таймера

This commit is contained in:
Andrei Solodovnikov
2024-01-09 10:59:38 +03:00
parent 1374a14e93
commit f85e07c73f
2 changed files with 107 additions and 11 deletions

View File

@@ -53,7 +53,7 @@
|0x00 | R | [0:2⁶⁴-1] | Значение системного счетчика, доступное только для чтения |
|0x04 | RW | [0:2⁶⁴-1] | Указание задержки, спустя которую таймер будет генерировать прерывание |
|0x08 | RW | [0:2] | Указание режима генерации прерываний (выключен, заданное число раз, бесконечно) |
|0x0c | RW | [0:2³²] | Указание количества повторений генерации прерываний |
|0x0c | RW | [0:2³²-1] | Указание количества повторений генерации прерываний |
|0x24 | W | 1 | Программный сброс |
Прототип модуля следующий:
@@ -265,25 +265,26 @@ Correct operation validated. See README.md for run and reporting rules.
## Порядок выполнения задания
1. [Опишите](#таймер) таймер в виде модуля `timer_sb_ctrl`.
2. Подключите данный модуль к системной шине. Сигнал прерывания этого модуля подключать не нужно.
2. Проверьте описанный модуль с помощью модуля [tb_timer](tb_timer.sv).
3. Подключите `timer_sb_ctrl` к системной шине. Сигнал прерывания этого модуля подключать не нужно.
2.1 В случае, если до этого в ЛР12 вашим устройством вывода было не UART TX, вам необходимо подключить к системной шине и готовый модуль [uart_tx_sb_ctrl](../Made-up%20modules/lab_12.uart_tx_sb_ctrl.sv).
3. Получите исходники программы Coremark. Для этого можно либо склонировать репозиторий, либо скачать его в виде архива со страницы: [https://github.com/eembc/coremark](https://github.com/eembc/coremark).
4. Добавьте реализацию платформозависимых функций программы coremark. Для этого в папке `barebones` необходимо:
4. Получите исходники программы Coremark. Для этого можно либо склонировать репозиторий, либо скачать его в виде архива со страницы: [https://github.com/eembc/coremark](https://github.com/eembc/coremark).
5. Добавьте реализацию платформозависимых функций программы coremark. Для этого в папке `barebones` необходимо:
1. в файле `core_portme.c`:
1. [реализовать](#реализация-функции-измеряющей-время) функцию `barebones_clock`, возвращающую текущее значение системного счетчика;
2. объявить макрос `CLOCKS_PER_SEC`, характеризующий тактовую частоту процессора;
3. [реализовать](#реализация-функции-первичной-настройки) функцию `portable_init`, выполняющую первичную инициализацию периферийных устройств до начала теста;
2. в файле `ee_printf.c` [реализовать](#реализация-вывода-очередного-символа-сообщения) функцию `uart_send_char`, отвечающую за отправку очередного символа сообщения о результате.
5. Добавьте с заменой в корень программы файлы [Makefile](Makefile), [linker_script.ld](linker_script.ld) и [startup.S](../13.%20Programming/startup.S).
6. Скомпилируйте программу вызовом `make`.
6. Добавьте с заменой в корень программы файлы [Makefile](Makefile), [linker_script.ld](linker_script.ld) и [startup.S](../13.%20Programming/startup.S).
7. Скомпилируйте программу вызовом `make`.
1. Если кросскомпилятор расположен не в директории `C:/riscv_cc`, перед вызовом `make` вам необходимо соответствующим образом отредактировать первую строчку в `Makefile`.
2. В случае отсутствия на компьютере утилиты `make`, вы можете самостоятельно скомпилировать программу вызовом команд, представленных в разделе ["Компиляция"](#компиляция).
7. Временно измените размер памяти инструкций до 64KiB.
8. Временно измените размер памяти инструкций до 64KiB.
1. Для этого необходимо изменить размер памяти инструкций с 1024 слов до 16384 слов.
2. Кроме того, необходимо изменить используемые индексы адреса с `[11:2]` на `[15:2]`.
8. Проинициализируйте память инструкций и память данных файлами "coremark_instr.mem" и "coremark_data.mem", полученными в ходе компиляции программы.
9. Выполните моделирование системы с помощью модуля [tb_coremark](tb_coremark).
1. Результаты теста будут выведены приблизительно на `335ms` времени моделирования.
9. Проинициализируйте память инструкций и память данных файлами "coremark_instr.mem" и "coremark_data.mem", полученными в ходе компиляции программы.
10. Выполните моделирование системы с помощью модуля [tb_coremark](tb_coremark).
1. Результаты теста будут выведены приблизительно на `335ms` времени моделирования.
<details>
<summary>10. Прочти меня после успешного завершения моделирования </summary>
@@ -318,7 +319,7 @@ Iterations/Sec : <скрыто то получения результатов
Это и есть так называемый "кормарк" — метрика данной программы. Результат нашего процессора: 3.88 кормарка.
Обычно, для сравнения между собой нескольких реализаций микроархитектур, более достоверной считается величина "кормарк / МГц", т.е. значение кормарка поделеное на тактовую частоту процессора. Дело в том, что можно реализовать какую-нибудь очень сложную архитектуру, которая будет выдавать очень хороший кормарк, но при этом будет иметь очень низкую частоту. Более того, при сравнении с другими результатами, необходимо учитывать флаги оптимизации, которые использовались при компиляции программы, поскольку они также влияют на результат.
Обычно, для сравнения между собой нескольких реализаций микроархитектур, более достоверной считается величина "кормарк / МГц", т.е. значение кормарка, поделеное на тактовую частоту процессора. Дело в том, что можно реализовать какую-нибудь очень сложную архитектуру, которая будет выдавать очень хороший кормарк, но при этом будет иметь очень низкую частоту. Более того, при сравнении с другими результатами, необходимо учитывать флаги оптимизации, которые использовались при компиляции программы, поскольку они также влияют на результат.
Мы не будем уходить в дебри темных паттернов маркетинга и вместо этого будет оценивать производительность в лоб: сколько кормарков в секунду смог прогнать наш проц в сравнении с представленными результатами других систем вне зависимости от их оптимизаций.