From 1374a14e93e62f999500eb9a92fd6ec267c711ff Mon Sep 17 00:00:00 2001 From: Andrei Solodovnikov Date: Sun, 31 Dec 2023 19:54:17 +0300 Subject: [PATCH] =?UTF-8?q?=D0=9B=D0=A015.=20=D0=94=D0=BE=D0=B1=D0=B0?= =?UTF-8?q?=D0=B2=D0=BB=D0=B5=D0=BD=D0=B8=D0=B5=20=D0=BC=D0=B5=D1=82=D0=BE?= =?UTF-8?q?=D0=B4=D0=B8=D1=87=D0=BA=D0=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .pic/Labs/lab_15_coremark/fig_01.png | Bin 0 -> 69869 bytes Labs/15. Coremark/Makefile | 73 ++++ Labs/15. Coremark/README.md | 343 ++++++++++++++++++ Labs/15. Coremark/linker_script.ld | 197 ++++++++++ Labs/15. Coremark/startup.S | 135 +++++++ Labs/15. Coremark/tb_coremark.sv | 132 +++++++ .../Made-up modules/lab_12.uart_tx_sb_ctrl.sv | 4 + Labs/README.md | 9 +- 8 files changed, 892 insertions(+), 1 deletion(-) create mode 100644 .pic/Labs/lab_15_coremark/fig_01.png create mode 100644 Labs/15. Coremark/Makefile create mode 100644 Labs/15. Coremark/linker_script.ld create mode 100644 Labs/15. Coremark/startup.S create mode 100644 Labs/15. Coremark/tb_coremark.sv create mode 100644 Labs/Made-up modules/lab_12.uart_tx_sb_ctrl.sv diff --git a/.pic/Labs/lab_15_coremark/fig_01.png b/.pic/Labs/lab_15_coremark/fig_01.png new file mode 100644 index 0000000000000000000000000000000000000000..6cd83dc1c869584615575cdba0e2932f04f63262 GIT binary patch literal 69869 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 R4}9YvtMhi}D$aP^{~rNVxMBbR literal 0 HcmV?d00001 diff --git a/Labs/15. Coremark/Makefile b/Labs/15. Coremark/Makefile new file mode 100644 index 0000000..c49e385 --- /dev/null +++ b/Labs/15. Coremark/Makefile @@ -0,0 +1,73 @@ +CC_PATH = /c/riscv_cc/bin +CC_PREFIX = riscv-none-elf + +CC = $(CC_PATH)/$(CC_PREFIX)-gcc +OBJDUMP = $(CC_PATH)/$(CC_PREFIX)-objdump +OBJCOPY = $(CC_PATH)/$(CC_PREFIX)-objcopy +SIZE = $(CC_PATH)/$(CC_PREFIX)-size + +ifndef src +src = core_main.o +endif + +OBJS = $(src) startup.o core_list_join.o core_matrix.o core_portme.o core_state.o core_util.o cvt.o ee_printf.o + + +LINK_SCRIPT = linker_script.ld +OUTPUT = coremark +OUTPUT_PROD = $(addprefix $(OUTPUT), .mem _instr.mem _data.mem .elf _disasm.S) +# OUTPUT_PROD :=$(OUTPUT_PROD) $(addprefix tb_$(OUTPUT), .mem _instr.mem _data.mem .elf _disasm.S) + +INC_DIRS = "./" +SRC_DIR = ./src +CC_FLAGS = -march=rv32i_zicsr -mabi=ilp32 -I$(INC_DIRS) +LD_FLAGS = -Wl,--gc-sections -nostartfiles -T $(LINK_SCRIPT) + +.PHONY: all setup clean clean_all size harvard princeton + +all: clean setup harvard + +setup: + cp barebones/*.c barebones/*.h ./ + +harvard: $(OUTPUT).elf $(OUTPUT)_disasm.S size +# $< ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚ "пСрвая Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡ‚ΡŒ" + ${OBJCOPY} -O verilog --verilog-data-width=4 -j .data -j .sdata -j .bss $< $(OUTPUT)_data.mem + ${OBJCOPY} -O verilog --verilog-data-width=4 -j .text $< $(OUTPUT)_instr.mem + ${OBJCOPY} -O verilog -j .data -j .sdata -j .bss $< tb_$(OUTPUT)_data.mem + ${OBJCOPY} -O verilog -j .text $< tb_$(OUTPUT)_instr.mem + sed -i '1d' $(OUTPUT)_data.mem + +princeton: $(OUTPUT).elf $(OUTPUT)_disasm.S size + ${OBJCOPY} -O verilog --verilog-data-width=4 --remove-section=.comment $< $(OUTPUT).mem + +$(OUTPUT).elf: $(OBJS) +# $^ ΠžΠ·Π½Π°Ρ‡Π°Π΅Ρ‚ "всС зависимости". + ${CC} $^ $(LD_FLAGS) $(CC_FLAGS) -o $(OUTPUT).elf + +$(OUTPUT)_disasm.S: $(OUTPUT).elf +# $< ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚ "пСрвая Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡ‚ΡŒ", $@ β€” "Ρ†Π΅Π»ΡŒ Ρ€Π΅Ρ†Π΅ΠΏΡ‚Π°". + ${OBJDUMP} -D $< > $@ + + +# Π¨Π°Π±Π»ΠΎΠ½Π½Ρ‹Π΅ Ρ€Π΅Ρ†Π΅ΠΏΡ‚Ρ‹ (см. https://web.mit.edu/gnu/doc/html/make_10.html#SEC91) +# Π—Π΄Π΅ΡΡŒ говорится ΠΊΠ°ΠΊ ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π½Ρ‹Π΅ Ρ„Π°ΠΉΠ»Ρ‹ ΠΈΠ· ΠΎΠ΄Π½ΠΎΠΈΠΌΠ΅Π½Π½Ρ‹Ρ… исходников +%.o: %.S + ${CC} -c $(CC_FLAGS) $^ -o $@ + +%.o: %.c + ${CC} -c $(CC_FLAGS) $^ -o $@ + +%.o: %.cpp + ${CC} -c $(CC_FLAGS) $^ -o $@ + +size: $(OUTPUT).elf +# $< ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚ "пСрвая Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡ‚ΡŒ" + $(SIZE) $< + +clean: + rm -f $(OBJS) + rm -f core_portme.* cvt.c ee_printf.c + +clean_all: clean + rm -f $(OUTPUT_PROD) diff --git a/Labs/15. Coremark/README.md b/Labs/15. Coremark/README.md index 2d2be7f..89d5f67 100644 --- a/Labs/15. Coremark/README.md +++ b/Labs/15. Coremark/README.md @@ -1,2 +1,345 @@ # Лабораторная Ρ€Π°Π±ΠΎΡ‚Π° 15 "ΠžΡ†Π΅Π½ΠΊΠ° ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ" +## Допуск ΠΊ Π»Π°Π±ΠΎΡ€Π°Ρ‚ΠΎΡ€Π½ΠΎΠΉ Ρ€Π°Π±ΠΎΡ‚Π΅ + +Данная лабораторная Ρ€Π°Π±ΠΎΡ‚Π° Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΠΎΠ»Π½ΠΎΡΡ‚ΡŒΡŽ ΠΎΠΏΠΈΡ€Π°Ρ‚ΡŒΡΡ Π½Π° Π½Π°Π²Ρ‹ΠΊΠΈ, ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½Π½Ρ‹Π΅ Π² Ρ…ΠΎΠ΄Π΅ выполнСния Π»Π°Π±ΠΎΡ€Π°Ρ‚ΠΎΡ€Π½Ρ‹Ρ… Ρ€Π°Π±ΠΎΡ‚: + +12. [ΠŸΠ΅Ρ€ΠΈΡ„Π΅Ρ€ΠΈΠΉΠ½Ρ‹Π΅ устройства](../12.%20Peripheral%20units/) +13. [ΠŸΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅](../13.%20Programming/) + +## ЦСль + +На Ρ‚Π΅ΠΊΡƒΡ‰ΠΈΠΉ ΠΌΠΎΠΌΠ΅Π½Ρ‚ ΠΌΡ‹ создали ΠΏΡ€ΠΎΡ†Π΅ΡΡΠΎΡ€Π½ΡƒΡŽ систСму, которая способна Π²Π·Π°ΠΈΠΌΠΎΠ΄Π΅ΠΉΡΡ‚Π²ΠΎΠ²Π°Ρ‚ΡŒ с внСшним ΠΌΠΈΡ€ΠΎΠΌ посрСдством ΠΏΠ΅Ρ€ΠΈΡ„Π΅Ρ€ΠΈΠΉΠ½Ρ‹Ρ… устройств Π²Π²ΠΎΠ΄Π°-Π²Ρ‹Π²ΠΎΠ΄Π° ΠΈ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ°Ρ‚ΠΎΡ€Π°. Однако слоТно ΠΏΠΎΠ½ΡΡ‚ΡŒ, ΠΊΠ°ΠΊΠΎΠ΅ мСсто данная систСма Π·Π°Π½ΠΈΠΌΠ°Π΅Ρ‚ Π² ряду ΡƒΠΆΠ΅ ΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΡ… Π²Ρ‹Ρ‡ΠΈΡΠ»ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Ρ… систСм. + + + +Для ΠΎΡ†Π΅Π½ΠΊΠΈ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ ΠΌΡ‹ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π±ΡƒΠ΄Π΅ΠΌ ΠΌΠΎΠ΄ΠΈΡ„ΠΈΡ†ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΏΡ€ΠΎΡ†Π΅ΡΡΠΎΡ€Π½ΡƒΡŽ систСму, ΡΠΎΠ±Ρ€Π°Ρ‚ΡŒ ΠΈ Π·Π°ΠΏΡƒΡΡ‚ΠΈΡ‚ΡŒ спСциализированноС ПО, ΠΎΡ‚Π²Π΅Ρ‡Π°ΡŽΡ‰Π΅Π΅ Π·Π° ΠΈΠ·ΠΌΠ΅Ρ€Π΅Π½ΠΈΠ΅ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ (ΠΌΡ‹ Π±ΡƒΠ΄Π΅ΠΌ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ Coremark). + +## ВСория + +[Coremark](https://www.eembc.org/coremark/faq.php) (Π΄Π°Π»Π΅Π΅ ΠΊΠΎΡ€ΠΌΠ°Ρ€ΠΊ) β€” это Π½Π°Π±ΠΎΡ€ синтСтичСских тСстов для измСрСния ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ процСссорной систСмы. Π’ Π΄Π°Π½Π½Ρ‹ΠΉ Π½Π°Π±ΠΎΡ€ входят Ρ‚Π°ΠΊΠΈΠ΅ тСсты, ΠΊΠ°ΠΊ Ρ€Π°Π±ΠΎΡ‚Π° со связными списками, ΠΌΠ°Ρ‚Ρ€ΠΈΡ‡Π½Ρ‹Π΅ вычислСния, ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° ΠΊΠΎΠ½Π΅Ρ‡Π½Ρ‹Ρ… Π°Π²Ρ‚ΠΎΠΌΠ°Ρ‚ΠΎΠ² ΠΈ подсчСт ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»ΡŒΠ½ΠΎΠΉ суммы. Π Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ выраТаСтся Π² ΠΎΠ΄Π½ΠΎΠΌ числС, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ для сравнСния с Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π°ΠΌΠΈ Π΄Ρ€ΡƒΠ³ΠΈΡ… процСссорных систСм. + +Для подсчСта ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ, ΠΊΠΎΡ€ΠΌΠ°Ρ€ΠΊ опираСтся Π½Π° Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ, Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°ΡŽΡ‰ΡƒΡŽ Ρ‚Π΅ΠΊΡƒΡ‰Π΅Π΅ врСмя, поэтому для ΠΎΡ†Π΅Π½ΠΊΠΈ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ Π½Π°ΠΌ потрСбуСтся Π²ΡΠΏΠΎΠΌΠΎΠ³Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΠ΅ ΠΏΠ΅Ρ€ΠΈΡ„Π΅Ρ€ΠΈΠΉΠ½ΠΎΠ΅ устройство: Ρ‚Π°ΠΉΠΌΠ΅Ρ€. + +Для Π²Ρ‹Π²ΠΎΠ΄Π° Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ΠΎΠ² тСстирования, Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΠΎΠΏΠΈΡΠ°Ρ‚ΡŒ способ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΌ ΠΊΠΎΡ€ΠΌΠ°Ρ€ΠΊ смоТСт Π²Ρ‹Π²ΠΎΠ΄ΠΈΡ‚ΡŒ ΠΎΡ‡Π΅Ρ€Π΅Π΄Π½ΠΎΠΉ символ сообщСния (для этого ΠΌΡ‹ Π±ΡƒΠ΄Π΅ΠΌ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»Π»Π΅Ρ€ UART ΠΈΠ· ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰ΠΈΡ… Π»Π°Π±ΠΎΡ€Π°Ρ‚ΠΎΡ€Π½Ρ‹Ρ… Ρ€Π°Π±ΠΎΡ‚). + +ΠšΡ€ΠΎΠΌΠ΅ Ρ‚ΠΎΠ³ΠΎ, скомпилированная Π±Π΅Π· ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·Π°Ρ†ΠΈΠΉ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° Π±ΡƒΠ΄Π΅Ρ‚ Π·Π°Π½ΠΈΠΌΠ°Ρ‚ΡŒ Ρ‡ΡƒΡ‚ΡŒ Π±ΠΎΠ»Π΅Π΅ 32KiB, поэтому Π½Π°ΠΌ потрСбуСтся ΠΈΠ·ΠΌΠ΅Π½ΠΈΡ‚ΡŒ Ρ€Π°Π·ΠΌΠ΅Ρ€ памяти инструкций + +Π’Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, для Ρ‚ΠΎΠ³ΠΎ Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π·Π°ΠΏΡƒΡΡ‚ΠΈΡ‚ΡŒ Π΄Π°Π½Π½ΡƒΡŽ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ, Π½Π°ΠΌ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ ΠΊΠ°ΠΊ Π°ΠΏΠΏΠ°Ρ€Π°Ρ‚Π½Ρ‹Π΅ измСнСния процСссорной систСмы (Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ Ρ‚Π°ΠΉΠΌΠ΅Ρ€ ΠΈ (Ссли отсутствуСт) ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»Π»Π΅Ρ€ UART), Ρ‚Π°ΠΊ ΠΈ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½Ρ‹Π΅ измСнСния самого ΠΊΠΎΡ€ΠΌΠ°Ρ€ΠΊΠ° (для этого Π² Π½Π΅ΠΌ прСдусмотрСны ΡΠΏΠ΅Ρ†ΠΈΠ°Π»ΡŒΠ½Ρ‹Π΅ платформозависимыС Ρ„Π°ΠΉΠ»Ρ‹, Π² ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… ΠΎΠ±ΡŠΡΠ²Π»Π΅Π½Ρ‹ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΡŽ ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… Π½Π°ΠΌ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ). + +## Π—Π°Π΄Π°Π½ΠΈΠ΅ + +1. Π Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΌΠΎΠ΄ΡƒΠ»ΡŒ-ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»Π»Π΅Ρ€ "Ρ‚Π°ΠΉΠΌΠ΅Ρ€". +2. ΠŸΠΎΠ΄ΠΊΠ»ΡŽΡ‡ΠΈΡ‚ΡŒ этот ΠΌΠΎΠ΄ΡƒΠ»ΡŒ ΠΊ систСмной шинС. + 2.1 Π’ случаС, Ссли Π΄ΠΎ этого Π² Π›Π 12 вашим устройством Π²Ρ‹Π²ΠΎΠ΄Π° Π±Ρ‹Π»ΠΎ Π½Π΅ UART TX, Π²Π°ΠΌ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡ΠΈΡ‚ΡŒ ΠΊ систСмной шинС ΠΈ Π³ΠΎΡ‚ΠΎΠ²Ρ‹ΠΉ ΠΌΠΎΠ΄ΡƒΠ»ΡŒ [uart_tx_sb_ctrl](../Made-up%20modules/lab_12.uart_tx_sb_ctrl.sv). +3. Π”ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΡŽ платформозависимых Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ coremark. +4. Π‘ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ. +5. Π˜Π·ΠΌΠ΅Π½ΠΈΡ‚ΡŒ Ρ€Π°Π·ΠΌΠ΅Ρ€ памяти инструкций +6. Π—Π°ΠΏΡƒΡΡ‚ΠΈΡ‚ΡŒ ΠΌΠΎΠ΄Π΅Π»ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ +7. Π‘Ρ€Π°Π²Π½ΠΈΡ‚ΡŒ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Ρ‹ измСрСния ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ с Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π°ΠΌΠΈ ΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΡ… процСссорных систСмам. + +### Π’Π°ΠΉΠΌΠ΅Ρ€ + +РазбСрСмся с Ρ‚Π΅ΠΌ, ΠΊΠ°ΠΊ Π±ΡƒΠ΄Π΅Ρ‚ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ наш Ρ‚Π°ΠΉΠΌΠ΅Ρ€. По сути, это просто систСмный счСтчик (Π½Π΅ ΠΏΡƒΡ‚Π°ΠΉΡ‚Π΅ с ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½Ρ‹ΠΌ счСтчиком), Π½Π΅ΠΏΡ€Π΅Ρ€Ρ‹Π²Π½ΠΎ ΡΡ‡ΠΈΡ‚Π°ΡŽΡ‰ΠΈΠΉ Ρ‚Π°ΠΊΡ‚Ρ‹ с ΠΌΠΎΠΌΠ΅Π½Ρ‚Π° послСднСго сброса. Для измСрСния Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ ΠΌΡ‹ Π±ΡƒΠ΄Π΅ΠΌ Π·Π°ΡΠ΅ΠΊΠ°Ρ‚ΡŒ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ счСтчика Π½Π° ΠΌΠΎΠΌΠ΅Π½Ρ‚ Π½Π°Ρ‡Π°Π»Π° отсчСта ΠΈ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ счСтчика Π² ΠΊΠΎΠ½Ρ†Π΅ отсчСта. Зная Ρ‚Π°ΠΊΡ‚ΠΎΠ²ΡƒΡŽ частоту ΠΈ Ρ€Π°Π·Π½ΠΎΡΡ‚ΡŒ ΠΌΠ΅ΠΆΠ΄Ρƒ значСниями счСтчика ΠΌΡ‹ с Π»Π΅Π³ΠΊΠΎΡΡ‚ΡŒΡŽ смоТСм Π²Ρ‹Ρ‡ΠΈΡΠ»ΠΈΡ‚ΡŒ ΠΏΡ€ΠΎΡˆΠ΅Π΄ΡˆΠ΅Π΅ врСмя. ΠŸΡ€ΠΈ этом Π½ΡƒΠΆΠ½ΠΎ ΠΎΠ±Π΅ΡΠΏΠ΅Ρ‡ΠΈΡ‚ΡŒ счСтчик Ρ‚Π°ΠΊΠΎΠΉ Ρ€Π°Π·Ρ€ΡΠ΄Π½ΠΎΡΡ‚ΡŒΡŽ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΎΠ½ Ρ‚ΠΎΡ‡Π½ΠΎ Π½Π΅ смог ΠΏΠ΅Ρ€Π΅ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒΡΡ. + +ΠŸΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ ΠΌΡ‹ ΡƒΠΆΠ΅ Π½Π°Π·Π²Π°Π»ΠΈ Π΄Π°Π½Π½Ρ‹ΠΉ ΠΌΠΎΠ΄ΡƒΠ»ΡŒ "Ρ‚Π°ΠΉΠΌΠ΅Ρ€ΠΎΠΌ", Ρ‡Ρ‚ΠΎΠ±Ρ‹ Ρ‚ΠΎΡ‚ Π½Π΅ Π±Ρ‹Π» слишком простым, Π΄Π°Π²Π°ΠΉΡ‚Π΅ Π΄ΠΎΠ±Π°Π²ΠΈΠΌ Π΅ΠΌΡƒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ: пускай это Π±ΡƒΠ΄Π΅Ρ‚ устройство, способноС Π³Π΅Π½Π΅Ρ€ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΏΡ€Π΅Ρ€Ρ‹Π²Π°Π½ΠΈΠ΅ Ρ‡Π΅Ρ€Π΅Π· Π·Π°Π΄Π°Π½Π½ΠΎΠ΅ число Ρ‚Π°ΠΊΡ‚ΠΎΠ². Π’Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, процСссорная систСма смоТСт Π·Π°ΡΠ΅ΠΊΠ°Ρ‚ΡŒ врСмя Π±Π΅Π· постоянного опроса счСтчика. + +Π‘Ρ‹Π»ΠΎ Π±Ρ‹ ΡƒΠ΄ΠΎΠ±Π½ΠΎ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΌΡ‹ ΠΌΠΎΠ³Π»ΠΈ ΡƒΠΏΡ€Π°Π²Π»ΡΡ‚ΡŒ Ρ‚Π΅ΠΌ, ΠΊΠ°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ Π΄Π°Π½Π½Ρ‹ΠΉ ΠΌΠΎΠ΄ΡƒΠ»ΡŒ Π±ΡƒΠ΄Π΅Ρ‚ Π³Π΅Π½Π΅Ρ€ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Ρ‚Π°ΠΊΠΎΠ΅ ΠΏΡ€Π΅Ρ€Ρ‹Π²Π°Π½ΠΈΠ΅: ΠΎΠ΄Π½ΠΎΠΊΡ€Π°Ρ‚Π½ΠΎ, Π·Π°Π΄Π°Π½Π½ΠΎΠ΅ число Ρ€Π°Π· ΠΈΠ»ΠΈ ΠΆΠ΅ бСсконСчно, ΠΏΠΎΠΊΠ° Ρ‚ΠΎΡ‚ Π½Π΅ остановят. + +Π’Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, ΠΌΡ‹ сформировали ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅Π΅ адрСсноС пространство Π΄Π°Π½Π½ΠΎΠ³ΠΎ ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»Π»Π΅Ρ€Π°: + +|АдрСс|Π Π΅ΠΆΠΈΠΌ доступа|ДопустимыС значСния| Π€ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½ΠΎΠ΅ Π½Π°Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ | +|-----|-------------|-------------------|---------------------------------------------------------------------------------| +|0x00 | R | [0:2⁢⁴-1] | Π—Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ систСмного счСтчика, доступноС Ρ‚ΠΎΠ»ΡŒΠΊΠΎ для чтСния | +|0x04 | RW | [0:2⁢⁴-1] | Π£ΠΊΠ°Π·Π°Π½ΠΈΠ΅ Π·Π°Π΄Π΅Ρ€ΠΆΠΊΠΈ, спустя ΠΊΠΎΡ‚ΠΎΡ€ΡƒΡŽ Ρ‚Π°ΠΉΠΌΠ΅Ρ€ Π±ΡƒΠ΄Π΅Ρ‚ Π³Π΅Π½Π΅Ρ€ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΏΡ€Π΅Ρ€Ρ‹Π²Π°Π½ΠΈΠ΅ | +|0x08 | RW | [0:2] | Π£ΠΊΠ°Π·Π°Π½ΠΈΠ΅ Ρ€Π΅ΠΆΠΈΠΌΠ° Π³Π΅Π½Π΅Ρ€Π°Ρ†ΠΈΠΈ ΠΏΡ€Π΅Ρ€Ρ‹Π²Π°Π½ΠΈΠΉ (Π²Ρ‹ΠΊΠ»ΡŽΡ‡Π΅Π½, Π·Π°Π΄Π°Π½Π½ΠΎΠ΅ число Ρ€Π°Π·, бСсконСчно) | +|0x0c | RW | [0:2Β³Β²] | Π£ΠΊΠ°Π·Π°Π½ΠΈΠ΅ количСства ΠΏΠΎΠ²Ρ‚ΠΎΡ€Π΅Π½ΠΈΠΉ Π³Π΅Π½Π΅Ρ€Π°Ρ†ΠΈΠΈ ΠΏΡ€Π΅Ρ€Ρ‹Π²Π°Π½ΠΈΠΉ | +|0x24 | W | 1 | ΠŸΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½Ρ‹ΠΉ сброс | + +ΠŸΡ€ΠΎΡ‚ΠΎΡ‚ΠΈΠΏ модуля ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ: + +```SystemVerilog +module timer_sb_ctrl( +/* + Π§Π°ΡΡ‚ΡŒ интСрфСйса модуля, ΠΎΡ‚Π²Π΅Ρ‡Π°ΡŽΡ‰Π°Ρ Π·Π° ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ ΠΊ систСмной шинС +*/ + input logic clk_i, + input logic rst_i, + input logic req_i, + input logic write_enable_i, + input logic [31:0] addr_i, + input logic [31:0] write_data_i, // Π½Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ, Π΄ΠΎΠ±Π°Π²Π»Π΅Π½ для + // совмСстимости с систСмной шиной + output logic [31:0] read_data_o, + output logic ready_o, +/* + Π§Π°ΡΡ‚ΡŒ интСрфСйса модуля, ΠΎΡ‚Π²Π΅Ρ‡Π°ΡŽΡ‰Π°Ρ Π·Π° ΠΎΡ‚ΠΏΡ€Π°Π²ΠΊΡƒ запросов Π½Π° ΠΏΡ€Π΅Ρ€Ρ‹Π²Π°Π½ΠΈΠ΅ + процСссорного ядра +*/ + output logic interrupt_request_o +); +``` + +Для Ρ€Π°Π±ΠΎΡ‚Ρ‹ Π΄Π°Π½Π½ΠΎΠ³ΠΎ ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»Π»Π΅Ρ€Π° ΠΏΠΎΡ‚Ρ€Π΅Π±ΡƒΡŽΡ‚ΡΡ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅ сигналы: + +```SystemVerilog +logic [63:0] system_counter; +logic [63:0] delay; +enum logic [1:0] {OFF, NTIMES, FOREVER} mode, next_mode; +logic [31:0] repeat_counter; +logic [63:0] system_counter_at_start; +``` + +- `system_counter` β€” рСгистр, ассоциированный с адрСсом `0x00`, систСмный счСтчик. Π—Π°Π΄Π°Ρ‡Π° рСгистра Π·Π°ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ΡΡ Π² Π΅ΠΆΠ΅Ρ‚Π°ΠΊΡ‚Π½ΠΎΠΌ ΡƒΠ²Π΅Π»ΠΈΡ‡Π΅Π½ΠΈΠΈ Π½Π° Π΅Π΄ΠΈΠ½ΠΈΡ†Ρƒ. +- `delay` β€” рСгистр, ассоциированный с адрСсом `0x04`. Число Ρ‚Π°ΠΊΡ‚ΠΎΠ², спустя ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ Ρ‚Π°ΠΉΠΌΠ΅Ρ€ (ΠΊΠΎΠ³Π΄Π° Ρ‚ΠΎΡ‚ Π±ΡƒΠ΄Π΅Ρ‚ Π²ΠΊΠ»ΡŽΡ‡Π΅Π½) сгСнСрируСт ΠΏΡ€Π΅Ρ€Ρ‹Π²Π°Π½ΠΈΠ΅. Π”Π°Π½Π½Ρ‹ΠΉ рСгистр измСняСтся Ρ‚ΠΎΠ»ΡŒΠΊΠΎ сбросом, Π»ΠΈΠ±ΠΎ запросом Π½Π° запись. +- `mode` β€” рСгистр, ассоциированный с адрСсом `0x08`. Π Π΅ΠΆΠΈΠΌ Ρ€Π°Π±ΠΎΡ‚Ρ‹ Ρ‚Π°ΠΉΠΌΠ΅Ρ€Π°: + - `OFF` β€” ΠΎΡ‚ΠΊΠ»ΡŽΡ‡Π΅Π½ (Π½Π΅ Π³Π΅Π½Π΅Ρ€ΠΈΡ€ΡƒΠ΅Ρ‚ прСрывания) + - `NTIMES` β€” Π²ΠΊΠ»ΡŽΡ‡Π΅Π½ Π΄ΠΎ Ρ‚Π΅Ρ… ΠΏΠΎΡ€, ΠΏΠΎΠΊΠ° Π½Π΅ сгСнСрируСт N ΠΏΡ€Π΅Ρ€Ρ‹Π²Π°Π½ΠΈΠΉ (Π—Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ N хранится Π² рСгистрС `repeat_counter` ΠΈ обновляСтся послС ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ сгСнСрированного прСрывания). ПослС Π³Π΅Π½Π΅Ρ€Π°Ρ†ΠΈΠΈ N ΠΏΡ€Π΅Ρ€Ρ‹Π²Π°Π½ΠΈΠΉ, ΠΏΠ΅Ρ€Π΅Ρ…ΠΎΠ΄ΠΈΡ‚ Π² Ρ€Π΅ΠΆΠΈΠΌ `OFF`. + - `FOREVER` β€” бСсконСчная гСнСрация ΠΏΡ€Π΅Ρ€Ρ‹Π²Π°Π½ΠΈΠΉ. НС ΠΎΡ‚ΠΊΠ»ΡŽΡ‡ΠΈΡ‚ΡΡ, ΠΏΠΎΠΊΠ° Ρ€Π΅ΠΆΠΈΠΌ Ρ€Π°Π±ΠΎΡ‚Ρ‹ ΠΏΡ€Π΅Ρ€Ρ‹Π²Π°Π½ΠΈΠΉ Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½. +- `next_mode` β€” ΠΊΠΎΠΌΠ±ΠΈΠ½Π°Ρ†ΠΈΠΎΠ½Π½Ρ‹ΠΉ сигнал, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ подаСтся Π½Π° Π²Ρ…ΠΎΠ΄ записи Π² рСгистр `mode` (Π°Π½Π°Π»ΠΎΠ³ `next_state` ΠΈΠ· ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰Π΅ΠΉ Π»Π°Π±ΠΎΡ€Π°Ρ‚ΠΎΡ€Π½ΠΎΠΉ Ρ€Π°Π±ΠΎΡ‚Ρ‹). +- `repeat_counter` β€” рСгистр, ассоциированный с адрСсом `0x0c`. ΠšΠΎΠ»ΠΈΡ‡Π΅ΡΡ‚Π²ΠΎ ΠΏΠΎΠ²Ρ‚ΠΎΡ€Π΅Π½ΠΈΠΉ для Ρ€Π΅ΠΆΠΈΠΌΠ° `NTIMES`. Π£ΠΌΠ΅Π½ΡŒΡˆΠ°Π΅Ρ‚ΡΡ Π² ΠΌΠΎΠΌΠ΅Π½Ρ‚ Π³Π΅Π½Π΅Ρ€Π°Ρ†ΠΈΠΈ прСрывания Π² этом Ρ€Π΅ΠΆΠΈΠΌΠ΅. +- `system_counter_at_start` β€” Π½Π΅Π°Ρ€Ρ…ΠΈΡ‚Π΅ΠΊΡ‚ΡƒΡ€Π½Ρ‹ΠΉ рСгистр, хранящий Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ систСмного счСтчика Π½Π° ΠΌΠΎΠΌΠ΅Π½Ρ‚ Π½Π°Ρ‡Π°Π»Π° отсчСта Ρ‚Π°ΠΉΠΌΠ΅Ρ€Π°. ΠžΠ±Π½ΠΎΠ²Π»ΡΠ΅Ρ‚ΡΡ ΠΏΡ€ΠΈ Π³Π΅Π½Π΅Ρ€Π°Ρ†ΠΈΠΈ прСрывания (Ссли это Π½Π΅ послСднСС ΠΏΡ€Π΅Ρ€Ρ‹Π²Π°Π½ΠΈΠ΅ Π² Ρ€Π΅ΠΆΠΈΠΌΠ΅ `NTIMES`) ΠΈ ΠΏΡ€ΠΈ запросС Π½Π° запись Π² рСгистр `mode` значСния Π½Π΅ `OFF`. + +Для ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ Π΄Π°Π½Π½ΠΎΠ³ΠΎ Ρ‚Π°ΠΉΠΌΠ΅Ρ€Π° ΠΊ систСмной шинС, ΠΌΡ‹ Π²ΠΎΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡΡ ΠΏΠ΅Ρ€Π²Ρ‹ΠΌ свободным Π±Π°Π·ΠΎΠ²Ρ‹ΠΌ адрСсом, ΠΎΡΡ‚Π°Π²ΡˆΠΈΠΌΡΡ послС Π›Π 12: `0x08`. Π’Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, для обращСния ΠΊ систСмному счСтчику, процСссор Π±ΡƒΠ΄Π΅Ρ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ адрСс `0x08000000` для обращСния ΠΊ рСгистру `delay` `0x08000004` ΠΈ Ρ‚.ΠΏ. + +### Настройка Coremark + +Π’ ΠΏΠ΅Ρ€Π²ΡƒΡŽ ΠΎΡ‡Π΅Ρ€Π΅Π΄ΡŒ, Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΡΠΊΠ°Ρ‡Π°Ρ‚ΡŒ исходный ΠΊΠΎΠ΄ Π΄Π°Π½Π½ΠΎΠΉ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹, Ρ€Π°Π·ΠΌΠ΅Ρ‰Π΅Π½Π½Ρ‹ΠΉ ΠΏΠΎ адрСсу: [https://github.com/eembc/coremark](https://github.com/eembc/coremark). На случай Π²ΠΎΠ·ΠΌΠΎΠΆΠ½Ρ‹Ρ… нСсовмСстимых ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΉ Π² Π±ΡƒΠ΄ΡƒΡ‰Π΅ΠΌ, всС дальнСйшиС ссылки Π±ΡƒΠ΄ΡƒΡ‚ Π΄Π°Π²Π°Ρ‚ΡŒΡΡ слСпок рСпозитория, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π±Ρ‹Π» Π½Π° ΠΌΠΎΠΌΠ΅Π½Ρ‚ ΠΊΠΎΠΌΠΌΠΈΡ‚Π° `d5fad6b`. + +Нам Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΡƒ нашСй процСссорной систСмы. Для этого Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ + +1. Π Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Ρ‚ΡŒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ, ΠΈΠ·ΠΌΠ΅Ρ€ΡΡŽΡ‰ΡƒΡŽ врСмя +2. Π Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Ρ‚ΡŒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ, Π²Ρ‹Π²ΠΎΠ΄ΡΡ‰ΡƒΡŽ ΠΎΡ‡Π΅Ρ€Π΅Π΄Π½ΠΎΠΉ символ сообщСния с Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π°ΠΌΠΈ +3. Π Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Ρ‚ΡŒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ, Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡŽΡ‰ΡƒΡŽ ΠΏΠ΅Ρ€Π²ΠΈΡ‡Π½ΡƒΡŽ настройку ΠΏΠ΅Ρ€ΠΈΡ„Π΅Ρ€ΠΈΠΈ ΠΏΠ΅Ρ€Π΅Π΄ тСстом +4. Π’Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ ΠΌΠ΅Π»ΠΊΡƒΡŽ подстройку, Ρ‚Π°ΠΊΡƒΡŽ ΠΊΠ°ΠΊ количСство ΠΈΡ‚Π΅Ρ€Π°Ρ†ΠΈΠΉ Π² тСстС ΠΈ ΡƒΠΊΠ°Π·Π°Π½ΠΈΠ΅ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠ², с ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΌΠΈ Π±ΡƒΠ΄Π΅Ρ‚ скомпилирована ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ°. + +ВсС Ρ„Π°ΠΉΠ»Ρ‹, содСрТимоС ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… ΠΌΡ‹ Π±ΡƒΠ΄Π΅ΠΌ ΠΌΠ΅Π½ΡΡ‚ΡŒ располоТСны Π² ΠΏΠ°ΠΏΠΊΠ΅ [barebones](https://github.com/eembc/coremark/tree/d5fad6bd094899101a4e5fd53af7298160ced6ab/barebones). + +#### РСализация Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, ΠΈΠ·ΠΌΠ΅Ρ€ΡΡŽΡ‰Π΅ΠΉ врСмя + +НС ΠΌΡ‹ ΠΏΠ΅Ρ€Π²Ρ‹Π΅ ΠΏΡ€ΠΈΠ΄ΡƒΠΌΠ°Π»ΠΈ ΠΈΠ·ΠΌΠ΅Ρ€ΡΡ‚ΡŒ врСмя ΠΏΡƒΡ‚Π΅ΠΌ отсчСта систСмных Ρ‚Π°ΠΊΡ‚ΠΎΠ², поэтому вся Π»ΠΎΠ³ΠΈΠΊΠ° ΠΏΠΎ ΠΈΠ·ΠΌΠ΅Ρ€Π΅Π½ΠΈΡŽ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ ΡƒΠΆΠ΅ Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½Π° Π² coremark. ΠžΡ‚ нас трСбуСтся Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Ρ‚ΡŒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ, которая Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ Ρ‚Π΅ΠΊΡƒΡ‰Π΅Π΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ систСмного счСтчика. + +Π”Π°Π½Π½ΠΎΠΉ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠ΅ΠΉ являСтся `barebones_clock`, располоТСнная Π² Ρ„Π°ΠΉΠ»Π΅ [`core_portme.c`](https://github.com/eembc/coremark/blob/d5fad6bd094899101a4e5fd53af7298160ced6ab/barebones/core_portme.c). Π’ Π΄Π°Π½Π½Ρ‹ΠΉ ΠΌΠΎΠΌΠ΅Π½Ρ‚, Π² Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ описан Π²Ρ‹Π·ΠΎΠ² ошибки (ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ ΠΊΠ°ΠΊ Ρ‚Π°ΠΊΠΎΠ²ΠΎΠΉ Π½Π΅Ρ‚). ΠœΡ‹ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ **Π·Π°ΠΌΠ΅Π½ΠΈΡ‚ΡŒ** Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌ ΠΊΠΎΠ΄ΠΎΠΌ: + +```C +barebones_clock() +{ + volatile ee_u32 *ptr = (ee_u32*)0x08000000; + ee_u32 tim = *ptr; + return tim; +} +``` + +ПослС Π›Π 13 Π²Ρ‹ ΡƒΠΆΠ΅ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΠΏΡ€Π΅Π΄ΡΡ‚Π°Π²Π»ΡΡ‚ΡŒ Ρ‡Ρ‚ΠΎ здСсь происходит. ΠœΡ‹ создали ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ с Π°Π±ΡΠΎΠ»ΡŽΡ‚Π½Ρ‹ΠΌ адрСсом `0x08000000` β€” адрСсом систСмного счСтчика. Π Π°Π·Ρ‹ΠΌΠ΅Π½ΠΎΠ²Π°Π½ΠΈΠ΅ Π΄Π°Π½Π½ΠΎΠ³ΠΎ указатСля Π²Π΅Ρ€Π½Π΅Ρ‚ Ρ‚Π΅ΠΊΡƒΡ‰Π΅Π΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ систСмного счСтчика, Ρ‡Ρ‚ΠΎ ΠΈ Π΄ΠΎΠ»ΠΆΠ½ΠΎ Π±Ρ‹Ρ‚ΡŒ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ΠΎΠΌ Π²Ρ‹Π·ΠΎΠ²Π° этой Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ. + +Для Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΊΠΎΡ€Ρ€Π΅ΠΊΡ‚Π½ΠΎ ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Ρ‚ΡŒ Ρ‚ΠΈΠΊΠΈ систСмного счСтчика Π²ΠΎ врСмя, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ функция [`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): + +```C +#define CLOCKS_PER_SEC 10000000 +``` + +На этом наша Π·Π°Π΄Π°Ρ‡Π° ΠΏΠΎ ΠΈΠ·ΠΌΠ΅Ρ€Π΅Π½ΠΈΡŽ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½Π°. ΠžΡΡ‚Π°Π»ΡŒΠ½Ρ‹Π΅ ΠΏΡ€Π°Π²ΠΊΠΈ Π±ΡƒΠ΄ΡƒΡ‚ Π½Π΅ слоТнСС этих. + +#### РСализация Π²Ρ‹Π²ΠΎΠ΄Π° ΠΎΡ‡Π΅Ρ€Π΅Π΄Π½ΠΎΠ³ΠΎ символа сообщСния + +Для Π²Ρ‹Π²ΠΎΠ΄Π° ΠΎΡ‡Π΅Ρ€Π΅Π΄Π½ΠΎΠ³ΠΎ символа Π²ΠΎ встраиваСмых систСмах ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ (ΠΊΠ°ΠΊΠΎΠ΅ совпадСниС!) функция [`uart_send_char`](https://github.com/eembc/coremark/blob/d5fad6bd094899101a4e5fd53af7298160ced6ab/barebones/ee_printf.c#L663), располоТСнная Π² Ρ„Π°ΠΉΠ»Π΅ [`ee_printf.c`](https://github.com/eembc/coremark/blob/d5fad6bd094899101a4e5fd53af7298160ced6ab/barebones/ee_printf.c). + +Π’ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ Π΄Π°Π½Π½ΠΎΠΉ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π²Π°ΠΌ ΡƒΠΆΠ΅ ΠΏΡ€Π΅Π΄Π»Π°Π³Π°ΡŽΡ‚ Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌ, ΠΏΠΎ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌΡƒ Ρ‚Π° Π΄ΠΎΠ»ΠΆΠ½Π° Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ, Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ: + +1. Π΄ΠΎΠΆΠ΄Π°Ρ‚ΡŒΡΡ готовности UART ΠΊ ΠΎΡ‚ΠΏΡ€Π°Π²ΠΊΠ΅ +2. ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‚ΡŒ отправляСмый символ +3. Π΄ΠΎΠΆΠ΄Π°Ρ‚ΡŒΡΡ готовности UART ΠΊ ΠΎΡ‚ΠΏΡ€Π°Π²ΠΊΠ΅ (Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΡ ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡ΠΈ) + +Π”Π°Π²Π°ΠΉΡ‚Π΅ Ρ‚Π°ΠΊ ΠΈ Ρ€Π΅Π°Π»ΠΈΠ·ΡƒΠ΅ΠΌ эту Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ: + +```C +uart_send_char(char c) +{ + volatile ee_u8 *uart_ptr = (ee_u8 *)0x06000000; + while(*(uart_ptr+0x08)); + *uart_ptr = c; + while(*(uart_ptr+0x08)); +} +``` + +`0x06000000` β€” Π±Π°Π·ΠΎΠ²Ρ‹ΠΉ адрСс ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»Π»Π΅Ρ€Π° UART TX ΠΈΠ· Π›Π 12 (ΠΈ адрСс ΠΏΠ΅Ρ€Π΅Π΄Π°Π²Π°Π΅ΠΌΡ‹Ρ… этим ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»Π»Π΅Ρ€ΠΎΠΌ Π΄Π°Π½Π½Ρ‹Ρ…). +`0x08` β€” адрСс рСгистра `busy` Π² адрСсном пространствС этого ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»Π»Π΅Ρ€Π°. + +#### РСализация Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΏΠ΅Ρ€Π²ΠΈΡ‡Π½ΠΎΠΉ настройки + +Π­Ρ‚ΠΎ функция [`portable_init`](https://github.com/eembc/coremark/blob/d5fad6bd094899101a4e5fd53af7298160ced6ab/barebones/core_portme.c#L130), располоТСнная Π² ΡƒΠΆΠ΅ извСстном Ρ€Π°Π½Π΅Π΅ Ρ„Π°ΠΉΠ»Π΅ [`core_portme`.c]. Данная функция выполняСт Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΡ‹Π΅ Π½Π°ΠΌ настройки ΠΏΠ΅Ρ€Π΅Π΄ Π½Π°Ρ‡Π°Π»ΠΎΠΌ тСста. Для нас Π³Π»Π°Π²Π½ΠΎΠ΅ β€” Π½Π°ΡΡ‚Ρ€ΠΎΠΈΡ‚ΡŒ Π½ΡƒΠΆΠ½Ρ‹ΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»Π»Π΅Ρ€ UART. +Допустим, ΠΌΡ‹ Ρ…ΠΎΡ‚ΠΈΠΌ Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π΄Π°Π½Π½Ρ‹Π΅ ΠΏΠ΅Ρ€Π΅Π΄Π°Π²Π°Π»ΠΈΡΡŒ Π½Π° скорости `115200`, c ΠΎΠ΄Π½ΠΈΠΌ стоповым Π±ΠΈΡ‚ΠΎΠΌ ΠΈ ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»Π΅ΠΌ Π±ΠΈΡ‚Π° чСтности. Π’ этом случаС, ΠΌΡ‹ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ Π² Π½Π°Ρ‡Π°Π»ΠΎ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ ΠΊΠΎΠ΄: + +```C +portable_init(core_portable *p, int *argc, char *argv[]) +{ + volatile ee_u32 *uart_tx_ptr = (ee_u32 *)0x06000000; + *(uart_tx_ptr + 3) = 115200; + *(uart_tx_ptr + 4) = 1; + *(uart_tx_ptr + 5) = 1; + + //... +} +``` + +#### Π”ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ настройки + +Для Ρ‚ΠΎΠ½ΠΊΠΈΡ… настроСк ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΡ‡Π½Ρ‹ΠΉ Ρ„Π°ΠΉΠ» [`core_portme.h`](https://github.com/eembc/coremark/blob/d5fad6bd094899101a4e5fd53af7298160ced6ab/barebones/core_portme.h). Нам Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ: + +1. ΠžΠ±ΡŠΡΠ²ΠΈΡ‚ΡŒ Π² Π½Π°Ρ‡Π°Π»Π΅ Ρ„Π°ΠΉΠ»Π° макрос `ITERATIONS`, Π²Π»ΠΈΡΡŽΡ‰ΠΈΠΉ Π½Π° количСство ΠΏΡ€ΠΎΠ³ΠΎΠ½ΠΎΠ² тСста. Нам достаточно Π²Ρ‹ΡΡ‚Π°Π²ΠΈΡ‚ΡŒ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ 1. +2. ΠžΠ±Π½ΠΎΠ²ΠΈΡ‚ΡŒ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ макроса `COMPILER_FLAGS`, Π·Π°ΠΌΠ΅Π½ΠΈΠ² Π΅Π³ΠΎ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ `FLAGS_STR` Π½Π°`"-march=rv32i_zicsr -mabi=ilp32"`, ΠΈΠΌΠ΅Π½Π½ΠΎ с этими Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π°ΠΌΠΈ ΠΌΡ‹ Π±ΡƒΠ΄Π΅ΠΌ ΡΠΎΠ±ΠΈΡ€Π°Ρ‚ΡŒ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ. Π­Ρ‚ΠΎ ΠΎΠΏΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½Π°Ρ настройка, которая ΠΏΠΎΠ·Π²ΠΎΠ»ΠΈΡ‚ вывСсти Ρ„Π»Π°Π³ΠΈ компиляции Π² ΠΈΡ‚ΠΎΠ³ΠΎΠ²ΠΎΠΌ сообщСнии. +3. Π”ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΡ‡Π½ΠΎΠ³ΠΎ Ρ„Π°ΠΉΠ»Π° `#include `. + +### ΠšΠΎΠΌΠΏΠΈΠ»ΡΡ†ΠΈΡ + +Для компиляции ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹, Π²Π°ΠΌ ΠΏΠΎΡ‚Ρ€Π΅Π±ΡƒΡŽΡ‚ΡΡ прСдоставлСнныС Ρ„Π°ΠΉΠ»Ρ‹ [Makefile](Makefile) ΠΈ [linker_script.ld](linker_script.ld), Π° Ρ‚Π°ΠΊ ΠΆΠ΅ Ρ„Π°ΠΉΠ» [startup.S](../13.%20Programming/startup.S) ΠΈΠ· Π›Π 13. Π­Ρ‚ΠΈ Ρ„Π°ΠΉΠ»Ρ‹ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΡΠΊΠΎΠΏΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ с Π·Π°ΠΌΠ΅Π½ΠΎΠΉ Π² ΠΊΠΎΡ€Π΅Π½ΡŒ ΠΏΠ°ΠΏΠΊΠΈ с ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΎΠΉ. + +`Makefile` написан ΠΈΠ· рассчСта, Ρ‡Ρ‚ΠΎ кросс-компилятор располоТСн ΠΏΠΎ ΠΏΡƒΡ‚ΠΈ `C:/riscv_cc/`. Π’ случаС, Ссли это Π½Π΅ Ρ‚Π°ΠΊ, ΠΈΠ·ΠΌΠ΅Π½ΠΈΡ‚Π΅ ΠΏΠ΅Ρ€Π²ΡƒΡŽ строчку Π΄Π°Π½Π½ΠΎΠ³ΠΎ Ρ„Π°ΠΉΠ»Π° Π² соотвСтствии с располоТСниСм кросс-компилятора. + +Для запуска компиляции, Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΡƒΡŽ ΠΊΠΎΠΌΠ°Π½Π΄Ρƒ, Π½Π°Ρ…ΠΎΠ΄ΡΡΡŒ Π² ΠΊΠΎΡ€Π½Π΅ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ coremark: + +```bash +make +``` + +Π’ случаС, Ссли Π½Π° вашСм Ρ€Π°Π±ΠΎΡ‡Π΅ΠΌ ΠΊΠΎΠΌΠΏΡŒΡŽΡ‚Π΅Ρ€Π΅ Π½Π΅ установлСна эта ΡƒΡ‚ΠΈΠ»ΠΈΡ‚Π°, Π²Ρ‹ ΡΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ Π²Ρ€ΡƒΡ‡Π½ΡƒΡŽ, Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΠ² ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΡƒΡŽ ΡΠ΅Ρ€ΠΈΡŽ ΠΊΠΎΠΌΠ°Π½Π΄: + +```bash +cp barebones/*.c barebones/*.h ./ +/c/riscv_cc/bin/riscv-none-elf-gcc -c -march=rv32i_zicsr -mabi=ilp32 -I"./" core_main.c -o core_main.o +/c/riscv_cc/bin/riscv-none-elf-gcc -c -march=rv32i_zicsr -mabi=ilp32 -I"./" startup.S -o startup.o +/c/riscv_cc/bin/riscv-none-elf-gcc -c -march=rv32i_zicsr -mabi=ilp32 -I"./" core_list_join.c -o core_list_join.o +/c/riscv_cc/bin/riscv-none-elf-gcc -c -march=rv32i_zicsr -mabi=ilp32 -I"./" core_matrix.c -o core_matrix.o +/c/riscv_cc/bin/riscv-none-elf-gcc -c -march=rv32i_zicsr -mabi=ilp32 -I"./" core_portme.c -o core_portme.o +/c/riscv_cc/bin/riscv-none-elf-gcc -c -march=rv32i_zicsr -mabi=ilp32 -I"./" core_state.c -o core_state.o +/c/riscv_cc/bin/riscv-none-elf-gcc -c -march=rv32i_zicsr -mabi=ilp32 -I"./" core_util.c -o core_util.o +/c/riscv_cc/bin/riscv-none-elf-gcc -c -march=rv32i_zicsr -mabi=ilp32 -I"./" cvt.c -o cvt.o +/c/riscv_cc/bin/riscv-none-elf-gcc -c -march=rv32i_zicsr -mabi=ilp32 -I"./" ee_printf.c -o ee_printf.o +/c/riscv_cc/bin/riscv-none-elf-gcc core_main.o startup.o core_list_join.o core_matrix.o core_portme.o core_state.o core_util.o cvt.o ee_printf.o -Wl,--gc-sections -nostartfiles -T linker_script.ld -march=rv32i_zicsr -mabi=ilp32 -I"./" -o coremark.elf +/c/riscv_cc/bin/riscv-none-elf-objdump -D coremark.elf > coremark_disasm.S +/c/riscv_cc/bin/riscv-none-elf-objcopy -O verilog --verilog-data-width=4 -j .data -j .sdata -j .bss coremark.elf coremark_data.mem +/c/riscv_cc/bin/riscv-none-elf-objcopy -O verilog --verilog-data-width=4 -j .text coremark.elf coremark_instr.mem +/c/riscv_cc/bin/riscv-none-elf-size coremark.elf +sed -i '1d' coremark_data.mem +``` + +Π’ случаС ΡƒΡΠΏΠ΅ΡˆΠ½ΠΎΠΉ компиляции, Π²Π°ΠΌ Π±ΡƒΠ΄Π΅Ρ‚ Π²Ρ‹Π²Π΅Π΄Π΅Π½ΠΎ сообщСниС ΠΎΠ± ΠΈΡ‚ΠΎΠ³ΠΎΠ²ΠΎΠΌ Ρ€Π°Π·ΠΌΠ΅Ρ€Π΅ сСкций инструкций ΠΈ Π΄Π°Π½Π½Ρ‹Ρ…: + +```text + text data bss dec hex filename + 34324 2268 100 36692 8f54 coremark.elf +``` + +### ИзмСнСниС Ρ€Π°Π·ΠΌΠ΅Ρ€Π° памяти инструкций + +Как Π²ΠΈΠ΄ΠΈΡ‚Π΅, Ρ€Π°Π·ΠΌΠ΅Ρ€ сСкции инструкций ΠΏΡ€Π΅Π²Ρ‹ΡˆΠ°Π΅Ρ‚ 32KiB Π½Π° 1556 Π±Π°ΠΉΡ‚. ΠŸΠΎΡΡ‚ΠΎΠΌΡƒ Π½Π° врСмя ΠΎΡ†Π΅Π½ΠΊΠΈ модСлирования, Π½Π°ΠΌ придСтся ΡƒΠ²Π΅Π»ΠΈΡ‡ΠΈΡ‚ΡŒ Ρ€Π°Π·ΠΌΠ΅Ρ€ памяти инструкций Π΄ΠΎ 64KiB, ΠΈΠ·ΠΌΠ΅Π½ΠΈΠ² число слов памяти инструкций Π΄ΠΎ 16384. ΠŸΡ€ΠΈ этом Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΠΈΠ·ΠΌΠ΅Π½ΠΈΡ‚ΡŒ Π΄ΠΈΠ°ΠΏΠ°Π·ΠΎΠ½ Π±ΠΈΡ‚ адрСса, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡ‹Ρ… для чтСния инструкции ΠΈΠ· памяти с `[11:2]` Π½Π° `[15:2]`. + +ΠžΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅, Ρ‡Ρ‚ΠΎ ΡƒΠ²Π΅Π»ΠΈΡ‡Π΅Π½ΠΈΠ΅ Ρ€Π°Π·ΠΌΠ΅Ρ€Π° памяти Π² 16 Ρ€Π°Π· ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Ρ‚ ΠΊ Π·Π½Π°Ρ‡ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠΌΡƒ ΡƒΠ²Π΅Π»ΠΈΡ‡Π΅Π½ΠΈΡŽ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ синтСза устройства, поэтому Π΄Π°Π½Π½ΠΎΠ΅ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ ΠΌΡ‹ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΠΌ ΠΈΡΠΊΠ»ΡŽΡ‡ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ Π½Π° врСмя повСдСнчСского модСлирования. + +### Запуск модСлирования + +ΠŸΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ 32KiB ΠΏΠΎ UART Π·Π°ΠΉΠΌΠ΅Ρ‚ ΠΏΡ€ΠΎΠ΄ΠΎΠ»ΠΆΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠ΅ врСмя, поэтому Π²Π°ΠΌ прСдлагаСтся ΠΏΡ€ΠΎΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΏΠ°ΠΌΡΡ‚ΡŒ инструкций ΠΈ Π΄Π°Π½Π½Ρ‹Ρ… "ΠΏΠΎ-старинкС" Ρ‡Π΅Ρ€Π΅Π· систСмныС Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ `$readmemh`. + +Если всС Π±Ρ‹Π»ΠΎ сдСлано Π±Π΅Π· ошибок, Ρ‚ΠΎ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π½ΠΎ Π½Π° `276ms` Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ модСлирования Π²Π°ΠΌ начнСтся Π²Ρ‹Π²ΠΎΠ΄ΠΈΡ‚ΡŒΡΡ сообщСниС Π²ΠΈΠ΄Π°: + +```text +CoreMark Size : 666 +Total ticks : 2574834 +Total time (secs): <скрыто Ρ‚ΠΎ получСния Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ΠΎΠ² модСлирования> +Iterations/Sec : <скрыто Ρ‚ΠΎ получСния Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ΠΎΠ² модСлирования> +ERROR! Must execute for at least 10 secs for a valid result! +Iterations : 1 +Compiler version : GCC13.2.0 +Compiler flags : -march=rv32i_zicsr -mabi=ilp32 +Memory location : STACK +seedcrc : 0x29f4 +[0]crclist : 0x7704 +[0]crcmatrix : 0x1fd7 +[0]crcstate : 0x8e3a +[0]crcfinal : 0x7704 +Correct operation validated. See README.md for run and reporting rules. +``` + +(Π²Ρ‹Π²ΠΎΠ΄ сообщСния Π±ΡƒΠ΄Π΅Ρ‚ Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ ΠΏΡ€ΠΈΠ±Π»ΠΈΠ·ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ Π½Π° `335ms` Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ модСлирования). + +## ΠŸΠΎΡ€ΡΠ΄ΠΎΠΊ выполнСния задания + +1. [ΠžΠΏΠΈΡˆΠΈΡ‚Π΅](#Ρ‚Π°ΠΉΠΌΠ΅Ρ€) Ρ‚Π°ΠΉΠΌΠ΅Ρ€ Π² Π²ΠΈΠ΄Π΅ модуля `timer_sb_ctrl`. +2. ΠŸΠΎΠ΄ΠΊΠ»ΡŽΡ‡ΠΈΡ‚Π΅ Π΄Π°Π½Π½Ρ‹ΠΉ ΠΌΠΎΠ΄ΡƒΠ»ΡŒ ΠΊ систСмной шинС. Π‘ΠΈΠ³Π½Π°Π» прСрывания этого модуля ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π°Ρ‚ΡŒ Π½Π΅ Π½ΡƒΠΆΠ½ΠΎ. + 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` Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ: + 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`. + 1. Если кросскомпилятор располоТСн Π½Π΅ Π² Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΎΡ€ΠΈΠΈ `C:/riscv_cc`, ΠΏΠ΅Ρ€Π΅Π΄ Π²Ρ‹Π·ΠΎΠ²ΠΎΠΌ `make` Π²Π°ΠΌ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ ΠΎΡ‚Ρ€Π΅Π΄Π°ΠΊΡ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΏΠ΅Ρ€Π²ΡƒΡŽ строчку Π² `Makefile`. + 2. Π’ случаС отсутствия Π½Π° ΠΊΠΎΠΌΠΏΡŒΡŽΡ‚Π΅Ρ€Π΅ ΡƒΡ‚ΠΈΠ»ΠΈΡ‚Ρ‹ `make`, Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΡΠ°ΠΌΠΎΡΡ‚ΠΎΡΡ‚Π΅Π»ΡŒΠ½ΠΎ ΡΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ Π²Ρ‹Π·ΠΎΠ²ΠΎΠΌ ΠΊΠΎΠΌΠ°Π½Π΄, прСдставлСнных Π² Ρ€Π°Π·Π΄Π΅Π»Π΅ ["ΠšΠΎΠΌΠΏΠΈΠ»ΡΡ†ΠΈΡ"](#компиляция). +7. Π’Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎ ΠΈΠ·ΠΌΠ΅Π½ΠΈΡ‚Π΅ Ρ€Π°Π·ΠΌΠ΅Ρ€ памяти инструкций Π΄ΠΎ 64KiB. + 1. Для этого Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΠΈΠ·ΠΌΠ΅Π½ΠΈΡ‚ΡŒ Ρ€Π°Π·ΠΌΠ΅Ρ€ памяти инструкций с 1024 слов Π΄ΠΎ 16384 слов. + 2. ΠšΡ€ΠΎΠΌΠ΅ Ρ‚ΠΎΠ³ΠΎ, Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΠΈΠ·ΠΌΠ΅Π½ΠΈΡ‚ΡŒ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡ‹Π΅ индСксы адрСса с `[11:2]` Π½Π° `[15:2]`. +8. ΠŸΡ€ΠΎΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΡƒΠΉΡ‚Π΅ ΠΏΠ°ΠΌΡΡ‚ΡŒ инструкций ΠΈ ΠΏΠ°ΠΌΡΡ‚ΡŒ Π΄Π°Π½Π½Ρ‹Ρ… Ρ„Π°ΠΉΠ»Π°ΠΌΠΈ "coremark_instr.mem" ΠΈ "coremark_data.mem", ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½Π½Ρ‹ΠΌΠΈ Π² Ρ…ΠΎΠ΄Π΅ компиляции ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹. +9. Π’Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚Π΅ ΠΌΠΎΠ΄Π΅Π»ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ систСмы с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ модуля [tb_coremark](tb_coremark). + 1. Π Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Ρ‹ тСста Π±ΡƒΠ΄ΡƒΡ‚ Π²Ρ‹Π²Π΅Π΄Π΅Π½Ρ‹ ΠΏΡ€ΠΈΠ±Π»ΠΈΠ·ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ Π½Π° `335ms` Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ модСлирования. + +
+ 10. ΠŸΡ€ΠΎΡ‡Ρ‚ΠΈ мСня послС ΡƒΡΠΏΠ΅ΡˆΠ½ΠΎΠ³ΠΎ Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΡ модСлирования + +Π˜Ρ‚Π°ΠΊ, Π²Ρ‹ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠ»ΠΈ сообщСниС Π²ΠΈΠ΄Π°: + +```text +CoreMark Size : 666 +Total ticks : 2574834 +Total time (secs): 0.257483 +Iterations/Sec : 3.883746 +ERROR! Must execute for at least 10 secs for a valid result! +Iterations : 1 +Compiler version : GCC13.2.0 +Compiler flags : -march=rv32i_zicsr -mabi=ilp32 +Memory location : STACK +seedcrc : 0x29f4 +[0]crclist : 0x7704 +[0]crcmatrix : 0x1fd7 +[0]crcstate : 0x8e3a +[0]crcfinal : 0x7704 +Correct operation validated. See README.md for run and reporting rules. +``` + +НС ΠΎΠ±Ρ€Π°Ρ‰Π°ΠΉΡ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅ Π½Π° строчку "ERROR! Must execute for at least 10 secs for a valid result!". ΠŸΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° считаСт, Ρ‡Ρ‚ΠΎ для ΠΊΠΎΡ€Ρ€Π΅ΠΊΡ‚Π½Ρ‹Ρ… Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ΠΎΠ², Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΠΊΡ€ΡƒΡ‚ΠΈΡ‚ΡŒ Π΅Π΅ ΠΏΠΎ ΠΊΡ€ΡƒΠ³Ρƒ Π² Ρ‚Π΅Ρ‡Π΅Π½ΠΈΠΈ ΠΌΠΈΠ½ΠΈΠΌΡƒΠΌ 10 сСкунд, ΠΎΠ΄Π½Π°ΠΊΠΎ ΠΏΠΎ большСй части это Ρ‚Ρ€Π΅Π±ΠΎΠ²Π°Π½ΠΈΠ΅ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ для Π±ΠΎΠ»Π΅Π΅ достовСрного Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π° Ρƒ ΠΊΠΎΠ½Π²Π΅ΠΉΠ΅Ρ€Π½Ρ‹Ρ… систСм ΠΈΠ»ΠΈ систСмах с Π·Π°ΠΏΡƒΡ‰Π΅Π½Π½ΠΎΠΉ ОБ. Наш ΠΎΠ΄Π½ΠΎΡ‚Π°ΠΊΡ‚Π½Ρ‹ΠΉ процСссор Π±ΡƒΠ΄Π΅Ρ‚ вСсти сСбя ΠΎΠ΄ΠΈΠ½Π°ΠΊΠΎΠ²ΠΎ Π½Π° ΠΊΠ°ΠΆΠ΄ΠΎΠΌ ΠΊΡ€ΡƒΠ³Π΅, поэтому Π½Π΅Ρ‚ смысла Π² Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠΌ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ модСлирования. + +Нас интСрСсуСт строка: + +```text +Iterations/Sec : <скрыто Ρ‚ΠΎ получСния Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ΠΎΠ² модСлирования> +``` + +Π­Ρ‚ΠΎ ΠΈ Π΅ΡΡ‚ΡŒ Ρ‚Π°ΠΊ Π½Π°Π·Ρ‹Π²Π°Π΅ΠΌΡ‹ΠΉ "ΠΊΠΎΡ€ΠΌΠ°Ρ€ΠΊ" β€” ΠΌΠ΅Ρ‚Ρ€ΠΈΠΊΠ° Π΄Π°Π½Π½ΠΎΠΉ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹. Π Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ нашСго процСссора: 3.88 ΠΊΠΎΡ€ΠΌΠ°Ρ€ΠΊΠ°. + +ΠžΠ±Ρ‹Ρ‡Π½ΠΎ, для сравнСния ΠΌΠ΅ΠΆΠ΄Ρƒ собой Π½Π΅ΡΠΊΠΎΠ»ΡŒΠΊΠΈΡ… Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΉ ΠΌΠΈΠΊΡ€ΠΎΠ°Ρ€Ρ…ΠΈΡ‚Π΅ΠΊΡ‚ΡƒΡ€, Π±ΠΎΠ»Π΅Π΅ достовСрной считаСтся Π²Π΅Π»ΠΈΡ‡ΠΈΠ½Π° "ΠΊΠΎΡ€ΠΌΠ°Ρ€ΠΊ / ΠœΠ“Ρ†", Ρ‚.Π΅. Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΊΠΎΡ€ΠΌΠ°Ρ€ΠΊΠ° ΠΏΠΎΠ΄Π΅Π»Π΅Π½ΠΎΠ΅ Π½Π° Ρ‚Π°ΠΊΡ‚ΠΎΠ²ΡƒΡŽ частоту процСссора. Π”Π΅Π»ΠΎ Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ ΠΌΠΎΠΆΠ½ΠΎ Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΊΠ°ΠΊΡƒΡŽ-Π½ΠΈΠ±ΡƒΠ΄ΡŒ ΠΎΡ‡Π΅Π½ΡŒ ΡΠ»ΠΎΠΆΠ½ΡƒΡŽ Π°Ρ€Ρ…ΠΈΡ‚Π΅ΠΊΡ‚ΡƒΡ€Ρƒ, которая Π±ΡƒΠ΄Π΅Ρ‚ Π²Ρ‹Π΄Π°Π²Π°Ρ‚ΡŒ ΠΎΡ‡Π΅Π½ΡŒ Ρ…ΠΎΡ€ΠΎΡˆΠΈΠΉ ΠΊΠΎΡ€ΠΌΠ°Ρ€ΠΊ, Π½ΠΎ ΠΏΡ€ΠΈ этом Π±ΡƒΠ΄Π΅Ρ‚ ΠΈΠΌΠ΅Ρ‚ΡŒ ΠΎΡ‡Π΅Π½ΡŒ Π½ΠΈΠ·ΠΊΡƒΡŽ частоту. Π‘ΠΎΠ»Π΅Π΅ Ρ‚ΠΎΠ³ΠΎ, ΠΏΡ€ΠΈ сравнСнии с Π΄Ρ€ΡƒΠ³ΠΈΠΌΠΈ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π°ΠΌΠΈ, Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΡƒΡ‡ΠΈΡ‚Ρ‹Π²Π°Ρ‚ΡŒ Ρ„Π»Π°Π³ΠΈ ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·Π°Ρ†ΠΈΠΈ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ использовались ΠΏΡ€ΠΈ компиляции ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ ΠΎΠ½ΠΈ Ρ‚Π°ΠΊΠΆΠ΅ Π²Π»ΠΈΡΡŽΡ‚ Π½Π° Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚. + +ΠœΡ‹ Π½Π΅ Π±ΡƒΠ΄Π΅ΠΌ ΡƒΡ…ΠΎΠ΄ΠΈΡ‚ΡŒ Π² Π΄Π΅Π±Ρ€ΠΈ Ρ‚Π΅ΠΌΠ½Ρ‹Ρ… ΠΏΠ°Ρ‚Ρ‚Π΅Ρ€Π½ΠΎΠ² ΠΌΠ°Ρ€ΠΊΠ΅Ρ‚ΠΈΠ½Π³Π° ΠΈ вмСсто этого Π±ΡƒΠ΄Π΅Ρ‚ ΠΎΡ†Π΅Π½ΠΈΠ²Π°Ρ‚ΡŒ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ Π² Π»ΠΎΠ±: сколько ΠΊΠΎΡ€ΠΌΠ°Ρ€ΠΊΠΎΠ² Π² сСкунду смог ΠΏΡ€ΠΎΠ³Π½Π°Ρ‚ΡŒ наш ΠΏΡ€ΠΎΡ† Π² сравнСнии с прСдставлСнными Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π°ΠΌΠΈ Π΄Ρ€ΡƒΠ³ΠΈΡ… систСм Π²Π½Π΅ зависимости ΠΎΡ‚ ΠΈΡ… ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·Π°Ρ†ΠΈΠΉ. + +Π’Π°Π±Π»ΠΈΡ†Π° ΠΎΠΏΡƒΠ±Π»ΠΈΠΊΠΎΠ²Π°Π½Π½Ρ‹Ρ… Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ΠΎΠ² находится ΠΏΠΎ адрСсу: [https://www.eembc.org/coremark/scores.php](https://www.eembc.org/coremark/scores.php). Нам Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΠΎΡ‚ΡΠΎΡ€Ρ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ эту Ρ‚Π°Π±Π»ΠΈΡ†Ρƒ ΠΏΠΎ столбцу `CoreMark`, ΠΊΠ»ΠΈΠΊΠ½ΡƒΠ² ΠΏΠΎ Π½Π΅ΠΌΡƒ. + +ΠœΡ‹ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠΌ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ расклад: + +![../../.pic/Labs/lab_15_coremark/fig_01.png](../../.pic/Labs/lab_15_coremark/fig_01.png) + +На Ρ‡Ρ‚ΠΎ ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ ΠΎΠ±Ρ€Π°Ρ‚ΠΈΡ‚ΡŒ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅? Ну, Π²ΠΎ-ΠΏΠ΅Ρ€Π²Ρ‹Ρ… ΠΌΡ‹ Π²ΠΈΠ΄ΠΈΠΌ, Ρ‡Ρ‚ΠΎ блиТайший ΠΊ Π½Π°ΠΌ ΠΌΠΈΠΊΡ€ΠΎΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»Π»Π΅Ρ€ ΠΏΠΎ ΠΊΠΎΡ€ΠΌΠ°Ρ€ΠΊΡƒ β€” это `ATmega2560` с Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ΠΎΠΌ `4.25` ΠΊΠΎΡ€ΠΌΠ°Ρ€ΠΊΠ°. Π’.Π΅. наш процСссор ΠΏΠΎ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ схоТ с ΠΌΠΈΠΊΡ€ΠΎΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»Π»Π΅Ρ€Π°ΠΌΠΈ Arduino. + +Π•ΡΡ‚ΡŒ Π»ΠΈ здСсь Π΅Ρ‰Π΅ Ρ‡Ρ‚ΠΎ-Π½ΠΈΠ±ΡƒΠ΄ΡŒ интСрСсноС? ΠŸΠΎΡΠΌΠΎΡ‚Ρ€Π΅ΠΌ Π² Π²Π΅Ρ€Ρ… Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹, ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ ΡƒΠ²ΠΈΠ΄Π΅Ρ‚ΡŒ производитСля Intel с ΠΈΡ… микропроцСссором [Intel 80286](https://ru.wikipedia.org/wiki/Intel_80286). Как написано Π½Π° Π²ΠΈΠΊΠΈ, Π΄Π°Π½Π½Ρ‹ΠΉ микропроцСссор Π±Ρ‹Π» Π² 3-6 Ρ€Π°Π· ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½Π΅ΠΉ [Intel 8086](https://ru.wikipedia.org/wiki/Intel_8086), ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ сопСрничал ΠΏΠΎ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ с процСссором [Zilog Z80](https://en.wikipedia.org/wiki/Zilog_Z80), ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ устанавливался Π² домашний ΠΊΠΎΠΌΠΏΡŒΡŽΡ‚Π΅Ρ€ [TRS-80](https://en.wikipedia.org/wiki/TRS-80). + +А Π·Π½Π°Π΅Ρ‚Π΅ с Ρ‡Π΅ΠΌ Π±Ρ‹Π» сопоставим ΠΏΠΎ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ ΠΊΠΎΠΌΠΏΡŒΡŽΡ‚Π΅Ρ€ TRS-80? Π‘ Π±ΠΎΡ€Ρ‚ΠΎΠ²Ρ‹ΠΌ ΠΊΠΎΠΌΠΏΡŒΡŽΡ‚Π΅Ρ€ΠΎΠΌ [Apollo Guidance Computer](https://en.wikipedia.org/wiki/Apollo_Guidance_Computer), ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΏΡ€ΠΎΠ²ΠΎΠ΄ΠΈΠ» вычислСния ΠΈ ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»ΠΈΡ€ΠΎΠ²Π°Π» Π΄Π²ΠΈΠΆΠ΅Π½ΠΈΠ΅, Π½Π°Π²ΠΈΠ³Π°Ρ†ΠΈΡŽ, ΠΈ управлял ΠΊΠΎΠΌΠ°Π½Π΄Π½Ρ‹ΠΌ ΠΈ Π»ΡƒΠ½Π½Ρ‹ΠΌ модулями Π² Ρ…ΠΎΠ΄Π΅ ΠΏΠΎΠ»Ρ‘Ρ‚ΠΎΠ² ΠΏΠΎ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ΅ Аполлон. + +Π˜Π½Ρ‹ΠΌΠΈ словами, ΠΌΡ‹ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Π°Π»ΠΈ процСссор, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΏΡ€ΠΈΠ±Π»ΠΈΠ·ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ Π² 7-14 Ρ€Π°Π· ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½Π΅Π΅ ΠΊΠΎΠΌΠΏΡŒΡŽΡ‚Π΅Ρ€Π°, ΡƒΠΏΡ€Π°Π²Π»ΡΠ²ΡˆΠ΅Π³ΠΎ ΠΏΠΎΠ»Π΅Ρ‚ΠΎΠΌ космичСского корабля, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π΄ΠΎΡΡ‚Π°Π²ΠΈΠ²ΡˆΠ΅ΠΌ Ρ‡Π΅Π»ΠΎΠ²Π΅ΠΊΠ° Π½Π° Π»ΡƒΠ½Ρƒ! + +МоТно Π»ΠΈ ΠΊΠ°ΠΊ-Ρ‚ΠΎ ΡƒΠ»ΡƒΡ‡ΡˆΠΈΡ‚ΡŒ наш Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚? БСзусловно. ΠœΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ ΡƒΠ»ΡƒΡ‡ΡˆΠΈΡ‚ΡŒ Π΅Π³ΠΎ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π½ΠΎ Π½Π° 5% ΠΈΠ·ΠΌΠ΅Π½ΠΈΠ² Π±ΡƒΠΊΠ²Π°Π»ΡŒΠ½ΠΎ ΠΎΠ΄Π½Ρƒ строчку. Π”Π΅Π»ΠΎ Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ для простоты Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ, ΠΌΡ‹ Π³Π΅Π½Π΅Ρ€ΠΈΡ€ΠΎΠ²Π°Π»ΠΈ сигнал `stall` для ΠΊΠ°ΠΆΠ΄ΠΎΠΉ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ обращСния Π² ΠΏΠ°ΠΌΡΡ‚ΡŒ. Однако ΠΏΡ€ΠΈΠΎΡΡ‚Π°Π½Π°Π²Π»ΠΈΠ²Π°Ρ‚ΡŒ Ρ€Π°Π±ΠΎΡ‚Ρƒ процСссора Π±Ρ‹Π»ΠΎ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ для ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΉ чтСния ΠΈΠ· памяти. Если Π½Π΅ Π³Π΅Π½Π΅Ρ€ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ сигнал `stall` для ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΉ Ρ‚ΠΈΠΏΠ° `store`, ΠΌΡ‹ ΡƒΠΌΠ΅Π½ΡŒΡˆΠΈΠΌ врСмя, Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎΠ΅ Π½Π° исполнСниС Π±Π΅Π½Ρ‡ΠΌΠ°Ρ€ΠΊΠ°. + +Π”ΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΠ΅ ΡƒΠΌΠ½ΠΎΠΆΠΈΡ‚Π΅Π»Π΅ΠΉ, конвСйСризация ΠΈ мноТСство Π΄Ρ€ΡƒΠ³ΠΈΡ… ΠΏΠΎΡ‚Π΅Π½Ρ†ΠΈΠ°Π»ΡŒΠ½Ρ‹Ρ… ΡƒΠ»ΡƒΡ‡ΡˆΠ΅Π½ΠΈΠΉ ΡƒΠ²Π΅Π»ΠΈΡ‡Π°Ρ‚ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ Π² Ρ€Π°Π·Ρ‹. + +Но это, ΠΊΠ°ΠΊ говорится, ΡƒΠΆΠ΅ другая история. + +
diff --git a/Labs/15. Coremark/linker_script.ld b/Labs/15. Coremark/linker_script.ld new file mode 100644 index 0000000..3e6de77 --- /dev/null +++ b/Labs/15. Coremark/linker_script.ld @@ -0,0 +1,197 @@ +OUTPUT_FORMAT("elf32-littleriscv") /* Π£ΠΊΠ°Π·Ρ‹Π²Π°Π΅ΠΌ порядок слСдования Π±Π°ΠΉΡ‚ */ + +ENTRY(_start) /* ΠΌΡ‹ сообщаСм ΠΊΠΎΠΌΠΏΠΎΠ½ΠΎΠ²Ρ‰ΠΈΠΊΡƒ, Ρ‡Ρ‚ΠΎ пСрвая + исполняСмая процСссором инструкция + находится Ρƒ ΠΌΠ΅Ρ‚ΠΊΠΈ "start" + */ + +_text_size = 0x10000; /* Π Π°Π·ΠΌΠ΅Ρ€ памяти инстр.: 16KiB */ +_data_base_addr = _text_size; /* Π‘Ρ‚Π°Ρ€Ρ‚ΠΎΠ²Ρ‹ΠΉ адрСс сСкции Π΄Π°Π½Π½Ρ‹Ρ… */ +_data_size = 0x04000; /* Π Π°Π·ΠΌΠ΅Ρ€ памяти Π΄Π°Π½Π½Ρ‹Ρ…: 16KiB */ + +_data_end = _data_base_addr + _data_size; + +_trap_stack_size = 2560; /* Π Π°Π·ΠΌΠ΅Ρ€ стСка ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠ° ΠΏΠ΅Ρ€Π΅Ρ…Π²Π°Ρ‚ΠΎΠ². + Π”Π°Π½Π½Ρ‹ΠΉ Ρ€Π°Π·ΠΌΠ΅Ρ€ позволяСт Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ + Π΄ΠΎ 32 Π²Π»ΠΎΠΆΠ΅Π½Π½Ρ‹Ρ… Π²Ρ‹Π·ΠΎΠ²ΠΎΠ² ΠΏΡ€ΠΈ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ΅ + ΠΏΠ΅Ρ€Π΅Ρ…Π²Π°Ρ‚ΠΎΠ². + */ + +_stack_size = 1280; /* Π Π°Π·ΠΌΠ΅Ρ€ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½ΠΎΠ³ΠΎ стСка. + Π”Π°Π½Π½Ρ‹ΠΉ Ρ€Π°Π·ΠΌΠ΅Ρ€ позволяСт Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ + Π΄ΠΎ 16 Π²Π»ΠΎΠΆΠ΅Π½Π½Ρ‹Ρ… Π²Ρ‹Π·ΠΎΠ²ΠΎΠ². + */ + +/* + Π’ Π΄Π°Π½Π½ΠΎΠΌ Ρ€Π°Π·Π΄Π΅Π»Π΅ указываСтся структура памяти: + Π‘ΠΏΠ΅Ρ€Π²Π° ΠΈΠ΄Π΅Ρ‚ Ρ€Π΅Π³ΠΈΠΎΠ½ "rom", ΡΠ²Π»ΡΡŽΡ‰ΠΈΠΉΡΡ read-only ΠΏΠ°ΠΌΡΡ‚ΡŒΡŽ с исполняСмым ΠΊΠΎΠ΄ΠΎΠΌ + (ΠΎΠ± этом говорят Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚Ρ‹ 'r' ΠΈ 'x' соотвСтствСнно). Π­Ρ‚ΠΎΡ‚ Ρ€Π΅Π³ΠΈΠΎΠ½ начинаСтся + с адрСса 0x00000000 ΠΈ Π·Π°Π½ΠΈΠΌΠ°Π΅Ρ‚ _text_size Π±Π°ΠΉΡ‚. + Π”Π°Π»Π΅Π΅ ΠΈΠ΄Π΅Ρ‚ Ρ€Π΅Π³ΠΈΠΎΠ½ "ram", Π½Π°Ρ‡ΠΈΠ½Π°ΡŽΡ‰ΠΈΠΉΡΡ с адрСса _data_base_addr ΠΈ Π·Π°Π½ΠΈΠΌΠ°ΡŽΡ‰ΠΈΠΉ + _data_size Π±Π°ΠΉΡ‚. Π­Ρ‚ΠΎΡ‚ Ρ€Π΅Π³ΠΈΠΎΠ½ являСтся ΠΏΠ°ΠΌΡΡ‚ΡŒΡŽ, ΠΏΡ€ΠΎΡ‚ΠΈΠ²ΠΎΠΏΠΎΠ»ΠΎΠΆΠ½ΠΎΠΉ Ρ€Π΅Π³ΠΈΠΎΠ½Ρƒ "ram" + (Π² Ρ‚ΠΎΠΌ смыслС, Ρ‡Ρ‚ΠΎ это Π½Π΅ read-only ΠΏΠ°ΠΌΡΡ‚ΡŒ с исполняСмым ΠΊΠΎΠ΄ΠΎΠΌ). +*/ +MEMORY +{ + rom (x) : ORIGIN = 0x00000000, LENGTH = _text_size + ram (!x) : ORIGIN = _data_base_addr, LENGTH = _data_size +} + + +/* + Π’ Π΄Π°Π½Π½ΠΎΠΌ Ρ€Π°Π·Π΄Π΅Π»Π΅ описываСтся Ρ€Π°Π·ΠΌΠ΅Ρ‰Π΅Π½ΠΈΠ΅ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ Π² памяти. + ΠŸΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° раздСляСтся Π½Π° Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Π΅ сСкции: + - сСкции исполняСмого ΠΊΠΎΠ΄Π° ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ°; + - сСкции статичСских ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ… ΠΈ массивов, Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… Π΄ΠΎΠ»ΠΆΠ½ΠΎ Π±Ρ‹Ρ‚ΡŒ + "Π²ΡˆΠΈΡ‚ΠΎ" Π² ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ; + ΠΈ Ρ‚.ΠΏ. +*/ + +SECTIONS +{ + PROVIDE( _start = 0x00000000 ); /* ΠŸΠΎΠ·ΠΈΡ†ΠΈΡ start Π² памяти + /* + Π’ скриптах ΠΊΠΎΠΌΠΏΠΎΠ½ΠΎΠ²Ρ‰ΠΈΠΊΠ° Π΅ΡΡ‚ΡŒ внутрСнняя пСрСмСнная, записываСмая ΠΊΠ°ΠΊ '.' + Π­Ρ‚Π° пСрСмСнная называСтся "счСтчиком адрСсов". Она Ρ…Ρ€Π°Π½ΠΈΡ‚ Ρ‚Π΅ΠΊΡƒΡ‰ΠΈΠΉ адрСс Π² + памяти. + Π’ Π½Π°Ρ‡Π°Π»Π΅ Ρ„Π°ΠΉΠ»Π° ΠΎΠ½Π° инициализируСтся Π½ΡƒΠ»Π΅ΠΌ. Добавляя Π½ΠΎΠ²Ρ‹Π΅ сСкции, эта + пСрСмСнная Π±ΡƒΠ΄Π΅Ρ‚ ΡƒΠ²Π΅Π»ΠΈΡ‡ΠΈΠ²Π°Ρ‚ΡŒΡΡ Π½Π° Ρ€Π°Π·ΠΌΠ΅Ρ€ ΠΊΠ°ΠΆΠ΄ΠΎΠΉ Π½ΠΎΠ²ΠΎΠΉ сСкции. + Если ΠΏΡ€ΠΈ Ρ€Π°Π·ΠΌΠ΅Ρ‰Π΅Π½ΠΈΠΈ сСкций Π½Π΅ указываСтся Π½ΠΈΠΊΠ°ΠΊΠΎΠΉ адрСс, ΠΎΠ½ΠΈ Π±ΡƒΠ΄ΡƒΡ‚ Ρ€Π°Π·ΠΌΠ΅Ρ‰Π΅Π½Ρ‹ + ΠΏΠΎ Ρ‚Π΅ΠΊΡƒΡ‰Π΅ΠΌΡƒ Π·Π½Π°Ρ‡Π΅Π½ΠΈΡŽ счСтчика адрСсов. + Π­Ρ‚ΠΎΠΉ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΡ€ΠΈΡΠ²Π°ΠΈΠ²Π°Ρ‚ΡŒ значСния, послС этого, ΠΎΠ½Π° Π±ΡƒΠ΄Π΅Ρ‚ + ΡƒΠ²Π΅Π»ΠΈΡ‡ΠΈΠ²Π°Ρ‚ΡŒΡΡ с этого значСния. + ΠŸΠΎΠ΄Ρ€ΠΎΠ±Π½Π΅Π΅: + https://home.cs.colorado.edu/~main/cs1300/doc/gnu/ld_3.html#IDX338 + */ + + /* + Π‘Π»Π΅Π΄ΡƒΡŽΡ‰Π°Ρ ΠΊΠΎΠΌΠ°Π½Π΄Π° сообщаСт, Ρ‡Ρ‚ΠΎ начиная с адрСса, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌΡƒ Π² Π΄Π°Π½Π½Ρ‹Ρ… ΠΌΠΎΠΌΠ΅Π½Ρ‚ + Ρ€Π°Π²Π΅Π½ счСтчик адрСсов (Π² Π΄Π°Π½Π½Ρ‹ΠΉ ΠΌΠΎΠΌΠ΅Π½Ρ‚, начиная с нуля) Π±ΡƒΠ΄Π΅Ρ‚ Π½Π°Ρ…ΠΎΠ΄ΠΈΡ‚ΡŒΡΡ + сСкция .text ΠΈΡ‚ΠΎΠ³ΠΎΠ²ΠΎΠ³ΠΎ Ρ„Π°ΠΉΠ»Π°, которая состоит ΠΈΠ· сСкций .boot, Π° Ρ‚Π°ΠΊΠΆΠ΅ всСх + сСкций, Π½Π°Ρ‡ΠΈΠ½Π°ΡŽΡ‰ΠΈΡ…ΡΡ Π½Π° .text Π²ΠΎ всСх ΠΏΠ΅Ρ€Π΅Π΄Π°Π½Π½Ρ‹Ρ… ΠΊΠΎΠΌΠΏΠΎΠ½ΠΎΠ²Ρ‰ΠΈΠΊΡƒ Π΄Π²ΠΎΠΈΡ‡Π½Ρ‹Ρ… + Ρ„Π°ΠΉΠ»Π°Ρ…. + Π”ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ ΠΌΡ‹ ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π΅ΠΌ, Ρ‡Ρ‚ΠΎ данная сСкция Π΄ΠΎΠ»ΠΆΠ½Π° Π±Ρ‹Ρ‚ΡŒ Ρ€Π°Π·ΠΌΠ΅Ρ‰Π΅Π½Π° Π² + Ρ€Π΅Π³ΠΈΠΎΠ½Π΅ "rom". + */ + .text : {*(.boot) *(.text*)} >rom + + + /* + ΠŸΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ ΠΌΡ‹ Π½Π΅ Π·Π½Π°Π΅ΠΌ суммарного Ρ€Π°Π·ΠΌΠ΅Ρ€Π° ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠ²ΡˆΠ΅ΠΉΡΡ сСкции, ΠΌΡ‹ провСряСм + Ρ‡Ρ‚ΠΎ Π½Π΅ Π²Ρ‹ΡˆΠ»ΠΈ Π·Π° Π³Ρ€Π°Π½ΠΈΡ†Ρ‹ памяти инструкций ΠΈ пСрСносим счСтчик адрСсов Π·Π° + ΠΏΡ€Π΅Π΄Π΅Π»Ρ‹ памяти инструкций Π² ΠΎΠ±Π»Π°ΡΡ‚ΡŒ памяти Π΄Π°Π½Π½Ρ‹Ρ…. + Π”ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ ΠΌΡ‹ ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π΅ΠΌ, Ρ‡Ρ‚ΠΎ данная сСкция Π΄ΠΎΠ»ΠΆΠ½Π° Π±Ρ‹Ρ‚ΡŒ Ρ€Π°Π·ΠΌΠ΅Ρ‰Π΅Π½Π° Π² + Ρ€Π΅Π³ΠΈΠΎΠ½Π΅ "ram". + */ + ASSERT(. < _text_size, ".text section exceeds instruction memory size") + . = _data_base_addr; + + /* + Π‘Π»Π΅Π΄ΡƒΡŽΡ‰Π°Ρ ΠΊΠΎΠΌΠ°Π½Π΄Π° сообщаСт, Ρ‡Ρ‚ΠΎ начиная с адрСса, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌΡƒ Π² Π΄Π°Π½Π½Ρ‹Ρ… ΠΌΠΎΠΌΠ΅Π½Ρ‚ + Ρ€Π°Π²Π΅Π½ счСтчик адрСсов (_data_base_addr) Π±ΡƒΠ΄Π΅Ρ‚ Π½Π°Ρ…ΠΎΠ΄ΠΈΡ‚ΡŒΡΡ сСкция .data + ΠΈΡ‚ΠΎΠ³ΠΎΠ²ΠΎΠ³ΠΎ Ρ„Π°ΠΉΠ»Π°, которая состоит ΠΈΠ· сСкций всСх сСкций, Π½Π°Ρ‡ΠΈΠ½Π°ΡŽΡ‰ΠΈΡ…ΡΡ + Π½Π° .data Π²ΠΎ всСх ΠΏΠ΅Ρ€Π΅Π΄Π°Π½Π½Ρ‹Ρ… ΠΊΠΎΠΌΠΏΠΎΠ½ΠΎΠ²Ρ‰ΠΈΠΊΡƒ Π΄Π²ΠΎΠΈΡ‡Π½Ρ‹Ρ… Ρ„Π°ΠΉΠ»Π°Ρ…. + Π”ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ ΠΌΡ‹ ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π΅ΠΌ, Ρ‡Ρ‚ΠΎ данная сСкция Π΄ΠΎΠ»ΠΆΠ½Π° Π±Ρ‹Ρ‚ΡŒ Ρ€Π°Π·ΠΌΠ΅Ρ‰Π΅Π½Π° Π² + Ρ€Π΅Π³ΠΈΠΎΠ½Π΅ "ram". + */ + .data : {*(.*data*)} >ram + + /* + ΠžΠ±Ρ‰Π΅ΠΏΡ€ΠΈΠ½ΡΡ‚ΠΎ ΠΏΡ€ΠΈΡΠ²Π°ΠΈΠ²Π°Ρ‚ΡŒ GP Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Ρ€Π°Π²Π½ΠΎΠ΅ Π½Π°Ρ‡Π°Π»Ρƒ сСкции Π΄Π°Π½Π½Ρ‹Ρ…, смСщСнноС + Π½Π° 2048 Π±Π°ΠΉΡ‚ Π²ΠΏΠ΅Ρ€Π΅Π΄. + Благодаря ΠΎΡ‚Π½ΠΎΡΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠΉ адрСсации со смСщСниСм Π² 12 Π±ΠΈΡ‚, ΠΌΠΎΠΆΠ½ΠΎ Π°Π΄Ρ€Π΅ΡΠΎΠ²Π°Ρ‚ΡŒΡΡ + Π½Π° Π½Π°Ρ‡Π°Π»ΠΎ сСкции Π΄Π°Π½Π½Ρ‹Ρ…, Π° Ρ‚Π°ΠΊ ΠΆΠ΅ ΠΏΠΎ всСму адрСсному пространству Π²ΠΏΠ»ΠΎΡ‚ΡŒ Π΄ΠΎ + 4096 Π±Π°ΠΉΡ‚ ΠΎΡ‚ Π½Π°Ρ‡Π°Π»Π° сСкции Π΄Π°Π½Π½Ρ‹Ρ…, Ρ‡Ρ‚ΠΎ сокращаСт объСм Ρ‚Ρ€Π΅Π±ΡƒΠ΅ΠΌΡ‹Ρ… для + адрСсации инструкций (практичСски Π½Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ LUI, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ GP + ΡƒΠΆΠ΅ Ρ…Ρ€Π°Π½ΠΈΡ‚ Π±Π°Π·ΠΎΠ²Ρ‹ΠΉ адрСс ΠΈ Π½ΡƒΠΆΠ½ΠΎ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ смСщСниС). + ΠŸΠΎΠ΄Ρ€ΠΎΠ±Π½Π΅Π΅: + https://groups.google.com/a/groups.riscv.org/g/sw-dev/c/60IdaZj27dY/m/s1eJMlrUAQAJ + */ + _gbl_ptr = _data_base_addr + 0x800; + + + /* + ΠŸΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ ΠΌΡ‹ Π½Π΅ Π·Π½Π°Π΅ΠΌ суммарный Ρ€Π°Π·ΠΌΠ΅Ρ€ всСх ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡ‹Ρ… сСкций Π΄Π°Π½Π½Ρ‹Ρ…, + ΠΏΠ΅Ρ€Π΅Π΄ Ρ€Π°Π·ΠΌΠ΅Ρ‰Π΅Π½ΠΈΠ΅ΠΌ Π΄Ρ€ΡƒΠ³ΠΈΡ… сСкций, Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ Π²Ρ‹Ρ€Π°Π²Π½ΡΡ‚ΡŒ счСтчик адрСсов ΠΏΠΎ + 4Ρ…-Π±Π°ΠΉΡ‚Π½ΠΎΠΉ Π³Ρ€Π°Π½ΠΈΡ†Π΅. + */ + . = ALIGN(4); + + + /* + BSS (block started by symbol, Π½Π΅ΠΎΡ„ΠΈΡ†ΠΈΠ°Π»ΡŒΠ½ΠΎ Π΅Π³ΠΎ Ρ€Π°ΡΡˆΠΈΡ„Ρ€ΠΎΠ²Ρ‹Π²Π°ΡŽΡ‚ ΠΊΠ°ΠΊ + better save space) β€” это сСгмСнт, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ Ρ€Π°Π·ΠΌΠ΅Ρ‰Π°ΡŽΡ‚ΡΡ Π½Π΅ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹Π΅ + статичСскиС ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅. Π’ стандартС Π‘ΠΈ сказано, Ρ‡Ρ‚ΠΎ Ρ‚Π°ΠΊΠΈΠ΅ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ + ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΡƒΡŽΡ‚ΡΡ Π½ΡƒΠ»Π΅ΠΌ (ΠΈΠ»ΠΈ NULL для ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»Π΅ΠΉ). Когда Π²Ρ‹ создаСтС + статичСский массив β€” ΠΎΠ½ Π΄ΠΎΠ»ΠΆΠ΅Π½ Π±Ρ‹Ρ‚ΡŒ Ρ€Π°Π·ΠΌΠ΅Ρ‰Π΅Π½ Π² исполняСмом Ρ„Π°ΠΉΠ»Π΅. + Π‘Π΅Π· bss-сСкции, этот массив Π΄ΠΎΠ»ΠΆΠ΅Π½ Π±Ρ‹Π» Π±Ρ‹ Π·Π°Π½ΠΈΠΌΠ°Ρ‚ΡŒ Ρ‚Π°ΠΊΠΎΠΉ ΠΆΠ΅ объСм + исполняСмого Ρ„Π°ΠΉΠ»Π°, ΠΊΠ°ΠΊΠΎΠ³ΠΎ объСма ΠΎΠ½ сам. Массив Π½Π° 1000 Π±Π°ΠΉΡ‚ занял Π±Ρ‹ + 1000 Π±Π°ΠΉΡ‚ Π² сСкции .data. + Благодаря сСкции bss, Π½Π°Ρ‡Π°Π»ΡŒΠ½Ρ‹Π΅ значСния массива Π½Π΅ Π·Π°Π΄Π°ΡŽΡ‚ΡΡ, вмСсто этого + здСсь Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π·Π°ΠΏΠΈΡΡ‹Π²Π°ΡŽΡ‚ΡΡ названия ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ… ΠΈ ΠΈΡ… адрСса. + Однако Π½Π° этапС Π·Π°Π³Ρ€ΡƒΠ·ΠΊΠΈ исполняСмого Ρ„Π°ΠΉΠ»Π° Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΠΏΡ€ΠΈΠ½ΡƒΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ + Π·Π°Π½ΡƒΠ»ΠΈΡ‚ΡŒ участок памяти, Π·Π°Π½ΠΈΠΌΠ°Π΅ΠΌΡ‹ΠΉ bss-сСкциСй, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ статичСскиС + ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π±Ρ‹Ρ‚ΡŒ ΠΏΡ€ΠΎΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π½Ρ‹ Π½ΡƒΠ»Π΅ΠΌ. + Π’Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, bss-сСкция Π·Π½Π°Ρ‡ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹ΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ сокращаСт объСм исполняСмого + Ρ„Π°ΠΉΠ»Π° (Π² случаС использования Π½Π΅ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹Ρ… статичСских массивов) + Ρ†Π΅Π½ΠΎΠΉ увСличСния Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ Π·Π°Π³Ρ€ΡƒΠ·ΠΊΠΈ этого Ρ„Π°ΠΉΠ»Π°. + Для Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π·Π°Π½ΡƒΠ»ΠΈΡ‚ΡŒ bss-ΡΠ΅ΠΊΡ†ΠΈΡŽ, Π² скриптС заводятся Π΄Π²Π΅ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅, + ΡƒΠΊΠ°Π·Ρ‹Π²Π°ΡŽΡ‰ΠΈΠ΅ Π½Π° Π½Π°Ρ‡Π°Π»ΠΎ ΠΈ ΠΊΠΎΠ½Π΅Ρ† bss-сСкции посрСдством счСтчика адрСсов. + ΠŸΠΎΠ΄Ρ€ΠΎΠ±Π½Π΅Π΅: + https://en.wikipedia.org/wiki/.bss + + Π”ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ ΠΌΡ‹ ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π΅ΠΌ, Ρ‡Ρ‚ΠΎ данная сСкция Π΄ΠΎΠ»ΠΆΠ½Π° Π±Ρ‹Ρ‚ΡŒ Ρ€Π°Π·ΠΌΠ΅Ρ‰Π΅Π½Π° Π² + Ρ€Π΅Π³ΠΈΠΎΠ½Π΅ "ram". + */ + _bss_start = .; + .bss : {*(.bss*)} >ram + _bss_end = .; + + + /*================================= + БСкция Π°Π»Π»ΠΎΡ†ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹Ρ… Π΄Π°Π½Π½Ρ‹Ρ… Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½Π°, остаток свободной памяти отводится + ΠΏΠΎΠ΄ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½Ρ‹ΠΉ стСк, стСк ΠΏΡ€Π΅Ρ€Ρ‹Π²Π°Π½ΠΈΠΉ ΠΈ (Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ) ΠΊΡƒΡ‡Ρƒ. Π’ соглашСнии ΠΎ + Π²Ρ‹Π·ΠΎΠ²Π°Ρ… Π°Ρ€Ρ…ΠΈΡ‚Π΅ΠΊΡ‚ΡƒΡ€Ρ‹ RISC-V сказано, Ρ‡Ρ‚ΠΎ стСк растСт снизу Π²Π²Π΅Ρ€Ρ…, поэтому + наша Ρ†Π΅Π»ΡŒ Ρ€Π°Π·ΠΌΠ΅ΡΡ‚ΠΈΡ‚ΡŒ Π΅Π³ΠΎ Π² самых послСдних адрСсах памяти. + ΠŸΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ стСков Ρƒ нас Π΄Π²Π°, Π² самом Π½ΠΈΠ·Ρƒ ΠΌΡ‹ размСстим стСк ΠΏΡ€Π΅Ρ€Ρ‹Π²Π°Π½ΠΈΠΉ, Π° + Π½Π°Π΄ Π½ΠΈΠΌ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½Ρ‹ΠΉ стСк. ΠŸΡ€ΠΈ этом Π½Π°Π΄ΠΎ ΠΎΠ±Π΅ΡΠΏΠ΅Ρ‡ΠΈΡ‚ΡŒ Π·Π°Ρ‰ΠΈΡ‚Ρƒ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½ΠΎΠ³ΠΎ + стСка ΠΎΡ‚ налоТСния Π½Π° Π½Π΅Π³ΠΎ стСка ΠΏΡ€Π΅Ρ€Ρ‹Π²Π°Π½ΠΈΠΉ. + Однако ΠΏΠ΅Ρ€Π΅Π΄ этим, ΠΌΡ‹ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΡƒΠ±Π΅Π΄ΠΈΡ‚ΡŒΡΡ, Ρ‡Ρ‚ΠΎ ΠΏΠΎΠ΄ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½Ρ‹ΠΉ стСк останСтся + хотя Π±Ρ‹ 1280 Π±Π°ΠΉΡ‚ (Π½ΠΈΡ‡Π΅ΠΌ Π½Π΅ обоснованноС число, взятоС с ΠΏΠΎΡ‚ΠΎΠ»ΠΊΠ°). + Π’Π°ΠΊΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ обСспСчиваСт Π΄ΠΎ 16 Π²Π»ΠΎΠΆΠ΅Π½Π½Ρ‹Ρ… Π²Ρ‹Π·ΠΎΠ²ΠΎΠ² (Ссли ΡΠΎΡ…Ρ€Π°Π½ΡΡ‚ΡŒ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ + Π½Π΅ΠΎΠ±Π΅Ρ€Π΅Π³Π°Π΅ΠΌΡ‹Π΅ рСгистры). + ================================= + */ + + /* ΠœΡ‹ Ρ…ΠΎΡ‚ΠΈΠΌ Π³Π°Ρ€Π°Π½Ρ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ, Ρ‡Ρ‚ΠΎ ΠΏΠΎΠ΄ стСк останСтся ΠΊΠ°ΠΊ ΠΌΠΈΠ½ΠΈΠΌΡƒΠΌ 1280 Π±Π°ΠΉΡ‚ */ + ASSERT(. < (_data_end - _trap_stack_size - _stack_size), + "Program size is too big") + + /* ΠŸΠ΅Ρ€Π΅ΠΌΠ΅Ρ‰Π°Π΅ΠΌ счСтчик адрСсов Π½Π°Π΄ стСком ΠΏΡ€Π΅Ρ€Ρ‹Π²Π°Π½ΠΈΠΉ (Ρ‡Ρ‚ΠΎΠ±Ρ‹ послС ΠΌΡ‹ ΠΌΠΎΠ³Π»ΠΈ + ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π΅Π³ΠΎ Π² Π²Ρ‹Π·ΠΎΠ²Π΅ ALIGN) */ + . = _data_end - _trap_stack_size; + + /* + Π Π°Π·ΠΌΠ΅Ρ‰Π°Π΅ΠΌ ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½ΠΎΠ³ΠΎ стСка Ρ‚Π°ΠΊ Π±Π»ΠΈΠ·ΠΊΠΎ ΠΊ Π³Ρ€Π°Π½ΠΈΡ†Π΅ стСка + ΠΏΡ€Π΅Ρ€Ρ‹Π²Π°Π½ΠΈΠΉ, насколько ΠΌΠΎΠΆΠ½ΠΎ с ΡƒΡ‡Π΅Ρ‚ΠΎΠΌ трСбования ΠΎ Π²Ρ‹Ρ€Π°Π²Π½ΠΈΠ²Π°Π½ΠΈΠΈ адрСса + стСка Π΄ΠΎ 16 Π±Π°ΠΉΡ‚. + ΠŸΠΎΠ΄Ρ€ΠΎΠ±Π½Π΅Π΅: + https://riscv.org/wp-content/uploads/2015/01/riscv-calling.pdf + */ + _stack_ptr = ALIGN(16) <= _data_end - _trap_stack_size? + ALIGN(16) : ALIGN(16) - 16; + ASSERT(_stack_ptr <= _data_end - _trap_stack_size, "SP exceed memory size") + + /* ΠŸΠ΅Ρ€Π΅ΠΌΠ΅Ρ‰Π°Π΅ΠΌ счСтчик адрСсов Π² ΠΊΠΎΠ½Π΅Ρ† памяти (Ρ‡Ρ‚ΠΎΠ±Ρ‹ послС ΠΌΡ‹ ΠΌΠΎΠ³Π»ΠΈ + ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π΅Π³ΠΎ Π² Π²Ρ‹Π·ΠΎΠ²Π΅ ALIGN) */ + . = _data_end; + + /* + ΠžΠ±Ρ‹Ρ‡Π½ΠΎ ΠΏΠ°ΠΌΡΡ‚ΡŒ ΠΈΠΌΠ΅Π΅Ρ‚ Ρ€Π°Π·ΠΌΠ΅Ρ€, ΠΊΡ€Π°Ρ‚Π½Ρ‹ΠΉ 16, Π½ΠΎ Π½Π° случай, Ссли это Π½Π΅ Ρ‚Π°ΠΊ, ΠΌΡ‹ + Π΄Π΅Π»Π°Π΅ΠΌ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΡƒ, послС ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ ΠΌΡ‹ Π»ΠΈΠ±ΠΎ остаСмся Π² самом ΠΊΠΎΠ½Ρ†Π΅ памяти (Ссли + ΠΊΠΎΠ½Π΅Ρ† ΠΊΡ€Π°Ρ‚Π΅Π½ 16), Π»ΠΈΠ±ΠΎ поднимаСмся Π½Π° 16 Π±Π°ΠΉΡ‚ Π²Π²Π΅Ρ€Ρ… ΠΎΡ‚ края памяти, + ΠΎΠΊΡ€ΡƒΠ³Π»Π΅Π½Π½ΠΎΠ³ΠΎ Π΄ΠΎ 16 Π² сторону большСго значСния + */ + _trap_stack_ptr = ALIGN(16) <= _data_end ? ALIGN(16) : ALIGN(16) - 16; + ASSERT(_trap_stack_ptr <= _data_end, "ISP exceed memory size") +} diff --git a/Labs/15. Coremark/startup.S b/Labs/15. Coremark/startup.S new file mode 100644 index 0000000..74f5509 --- /dev/null +++ b/Labs/15. Coremark/startup.S @@ -0,0 +1,135 @@ + .section .boot + + .global _start +_start: + la gp, _gbl_ptr # Π˜Π½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΡ глобального указатСля + la sp, _stack_ptr # Π˜Π½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΡ указатСля Π½Π° стСк + +# Π˜Π½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΡ (Π·Π°Π½ΡƒΠ»Π΅Π½ΠΈΠ΅) сСгмСнта bss + la t0, _bss_start + la t1, _bss_end +_bss_init_loop: + blt t1, t0, _irq_config + sw zero, 0(t0) + addi t0, t0, 4 + j _bss_init_loop + +# Настройка Π²Π΅ΠΊΡ‚ΠΎΡ€Π° (mtvec) ΠΈ маски (mie) ΠΏΡ€Π΅Ρ€Ρ‹Π²Π°Π½ΠΈΠΉ, Π° Ρ‚Π°ΠΊΠΆΠ΅ указатСля Π½Π° стСк +# ΠΏΡ€Π΅Ρ€Ρ‹Π²Π°Π½ΠΈΠΉ (mscratch). +_irq_config: + la t0, _int_handler + li t1, -1 # -1 (всС Π±ΠΈΡ‚Ρ‹ Ρ€Π°Π²Π½Ρ‹ 1) ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ Ρ€Π°Π·Ρ€Π΅ΡˆΠ΅Π½Ρ‹ всС прСрывания + la t2, _trap_stack_ptr + csrw mtvec, t0 + csrw mie, t1 + csrw mscratch, t2 + +# Π’Ρ‹Π·ΠΎΠ² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ main +_main_call: + li a0, 0 # ΠŸΠ΅Ρ€Π΅Π΄Π°Ρ‡Π° Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠ² argc ΠΈ argv Π² main. Π€ΠΎΡ€ΠΌΠ°Π»ΡŒΠ½ΠΎ, argc Π΄ΠΎΠ»ΠΆΠ΅Π½ + li a1, 0 # Π±Ρ‹Ρ‚ΡŒ большС нуля, Π° argv Π΄ΠΎΠ»ΠΆΠ΅Π½ ΡƒΠΊΠ°Π·Ρ‹Π²Π°Ρ‚ΡŒ Π½Π° массив строк, + # Π½ΡƒΠ»Π΅Π²ΠΎΠΉ элСмСнт ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ являСтся ΠΈΠΌΠ΅Π½Π΅ΠΌ исполняСмого Ρ„Π°ΠΉΠ»Π°, + # Но для простоты Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ ΠΎΠ±Π° Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π° всСго лишь ΠΎΠ±Π½ΡƒΠ»Π΅Π½Ρ‹. + # Π­Ρ‚ΠΎ сдСлано для Π΄Π΅Ρ‚Π΅Ρ€ΠΌΠΈΠ½ΠΈΡ€ΠΎΠ²Π°Π½Π½ΠΎΠ³ΠΎ повСдСния ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ Π² случаС, + # Ссли Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΡ‹Ρ‚Π°Ρ‚ΡŒΡΡ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ эти Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Ρ‹. + call main +# Π—Π°Ρ†ΠΈΠΊΠ»ΠΈΠ²Π°Π½ΠΈΠ΅ послС Π²Ρ‹Ρ…ΠΎΠ΄Π° ΠΈΠ· Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ main +_endless_loop: + j _endless_loop + +# НизкоуровнСвый ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊ прСрывания ΠΎΡ‚Π²Π΅Ρ‡Π°Π΅Ρ‚ Π·Π°: +# * Π‘ΠΎΡ…Ρ€Π°Π½Π΅Π½ΠΈΠ΅ ΠΈ восстановлСниС контСкста; +# * Π’Ρ‹Π·ΠΎΠ² высокоуровнСвого ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠ° с ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡Π΅ΠΉ id источника прСрывания Π² +# качСствС Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π°. +# Π’ основС ΠΊΠΎΠ΄Π° Π»Π΅ΠΆΠΈΡ‚ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊ ΠΈΠ· рСпозитория urv-core: +# https://github.com/twlostow/urv-core/blob/master/sw/common/irq.S +# Из Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ ΡƒΠ±Ρ€Π°Π½Ρ‹ сохранСния Π½Π΅Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½Π½Ρ‹Ρ… CS-рСгистров. ΠšΡ€ΠΎΠΌΠ΅ Ρ‚ΠΎΠ³ΠΎ, +# судя ΠΏΠΎ Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Ρƒ ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π½ΠΎΠΌΡƒ Π½ΠΈΠΆΠ΅, ΠΎΠ±Ρ‹Ρ‡Π½ΠΎΠ΅ ABI ΠΏΠΎΠ΄Ρ€Π°Π·ΡƒΠΌΠ΅Π²Π°Π΅Ρ‚ Ρ‚Π°ΠΊΠΎΠ΅ ΠΆΠ΅ +# сохранСниС контСкста, Ρ‡Ρ‚ΠΎ ΠΈ ΠΏΡ€ΠΈ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½ΠΎΠΌ Π²Ρ‹Π·ΠΎΠ²Π΅ (EABI ΠΏΠΎΠ΄Ρ€Π°Π·ΡƒΠΌΠ΅Π²Π°Π΅Ρ‚ Π΅Ρ‰Π΅ +# мСньшСС сохранСниС контСкста), поэтому Π½Π΅Ρ‚ Π½ΡƒΠΆΠ΄Ρ‹ ΡΠΎΡ…Ρ€Π°Π½ΡΡ‚ΡŒ вСсь рСгистровый +# Ρ„Π°ΠΉΠ». +# Π”ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚: +# https://github.com/riscv-non-isa/riscv-eabi-spec/blob/master/EABI.adoc +_int_handler: + # Данная опСрация мСняСт мСстами рСгистры sp ΠΈ mscratch. + # Π’ ΠΈΡ‚ΠΎΠ³Π΅ ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ Π½Π° стСк ΠΏΡ€Π΅Ρ€Ρ‹Π²Π°Π½ΠΈΠΉ оказываСтся Π² рСгистрС sp, Π° Π²Π΅Ρ€ΡˆΠΈΠ½Π° + # ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½ΠΎΠ³ΠΎ стСка оказываСтся Π² рСгистрС mscratch. + csrrw sp,mscratch,sp + + # Π”Π°Π»Π΅Π΅ ΠΌΡ‹ поднимаСмся ΠΏΠΎ стСку ΠΏΡ€Π΅Ρ€Ρ‹Π²Π°Π½ΠΈΠΉ ΠΈ сохраняСм всС рСгистры. + addi sp,sp,-80 # Π£ΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ Π½Π° стСк Π΄ΠΎΠ»ΠΆΠ΅Π½ Π±Ρ‹Ρ‚ΡŒ Π²Ρ‹Ρ€ΠΎΠ²Π½Π΅Π½ Π΄ΠΎ 16 Π±Π°ΠΉΡ‚, поэтому + # поднимаСмся Π²Π²Π΅Ρ€Ρ… Π½Π΅ Π½Π° 76, Π° Π½Π° 80. + sw ra,4(sp) + # ΠœΡ‹ Ρ…ΠΎΡ‚ΠΈΠΌ ΡƒΠ±Π΅Π΄ΠΈΡ‚ΡŒΡΡ, Ρ‡Ρ‚ΠΎ ΠΎΡ‡Π΅Ρ€Π΅Π΄Π½ΠΎΠ΅ ΠΏΡ€Π΅Ρ€Ρ‹Π²Π°Π½ΠΈΠ΅ Π½Π΅ Π½Π°Π»ΠΎΠΆΠΈΡ‚ стСк ΠΏΡ€Π΅Ρ€Ρ‹Π²Π°Π½ΠΈΠΉ Π½Π° + # ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½Ρ‹ΠΉ стСк, поэтому записываСм Π² освободившийся рСгистр Π½ΠΈΠ· + # ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½ΠΎΠ³ΠΎ стСка, ΠΈ провСряСм Ρ‡Ρ‚ΠΎ приподнятый ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ Π½Π° Π²Π΅Ρ€Ρ…ΡƒΡˆΠΊΡƒ + # стСка ΠΏΡ€Π΅Ρ€Ρ‹Π²Π°Π½ΠΈΠΉ Π½Π΅ Π·Π°Π»Π΅Π· Π² ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½Ρ‹ΠΉ стСк. + # Π’ случаС, Ссли это ΠΏΡ€ΠΎΠΈΠ·ΠΎΡˆΠ»ΠΎ (ΠΏΡ€ΠΎΠΈΠ·ΠΎΡˆΠ»ΠΎ ΠΏΠ΅Ρ€Π΅ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ стСка ΠΏΡ€Π΅Ρ€Ρ‹Π²Π°Π½ΠΈΠΉ), + # ΠΌΡ‹ Ρ…ΠΎΡ‚ΠΈΠΌ ΠΎΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ Ρ€Π°Π±ΠΎΡ‚Ρƒ процСссора, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π½Π΅ ΠΏΠΎΡ‚Π΅Ρ€ΡΡ‚ΡŒ Π΄Π°Π½Π½Ρ‹Π΅, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ + # ΠΌΠΎΠ³ΡƒΡ‚ ΠΏΠΎΠΌΠΎΡ‡ΡŒ Π½Π°ΠΌ Π² ΠΎΡ‚Π»Π°Π΄ΠΊΠ΅ этой ситуации. + la ra, _stack_ptr + blt sp, ra, _endless_loop + + sw t0,12(sp) # ΠœΡ‹ ΠΏΠ΅Ρ€Π΅ΠΏΡ€Ρ‹Π³Π½ΡƒΠ»ΠΈ Ρ‡Π΅Ρ€Π΅Π· смСщСниС 8, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ Ρ‚Π°ΠΌ Π΄ΠΎΠ»ΠΆΠ΅Π½ + # Π»Π΅ΠΆΠ°Ρ‚ΡŒ рСгистр sp, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Ρ€Π°Π½Π΅Π΅ сохранили Π² mscratch. + # ΠœΡ‹ запишСм Π΅Π³ΠΎ Π½Π° стСк Ρ‡ΡƒΡ‚ΡŒ ΠΏΠΎΠ·ΠΆΠ΅. + sw t1,16(sp) + sw t2,20(sp) + sw a0,24(sp) + sw a1,28(sp) + sw a2,32(sp) + sw a3,36(sp) + sw a4,40(sp) + sw a5,44(sp) + sw a6,48(sp) + sw a7,52(sp) + sw t3,56(sp) + sw t4,60(sp) + sw t5,64(sp) + sw t6,68(sp) + + # ΠšΡ€ΠΎΠΌΠ΅ Ρ‚ΠΎΠ³ΠΎ, ΠΌΡ‹ сохраняСм состояниС рСгистров ΠΏΡ€Π΅Ρ€Ρ‹Π²Π°Π½ΠΈΠΉ Π½Π° случай, Ссли + # ΠΏΡ€ΠΎΠΈΠ·ΠΎΠΉΠ΄Π΅Ρ‚ Π΅Ρ‰Π΅ ΠΎΠ΄Π½ΠΎ ΠΏΡ€Π΅Ρ€Ρ‹Π²Π°Π½ΠΈΠ΅. + csrr t0,mscratch + csrr t1,mepc + csrr a0,mcause + sw t0,8(sp) + sw t1,72(sp) + sw a0,76(sp) + + # Π’Ρ‹Π·ΠΎΠ² высокоуровнСвого ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠ° ΠΏΡ€Π΅Ρ€Ρ‹Π²Π°Π½ΠΈΠΉ + # call int_handler + + # ВосстановлСниС контСкста. Π’ ΠΏΠ΅Ρ€Π²ΡƒΡŽ ΠΎΡ‡Π΅Ρ€Π΅Π΄ΡŒ ΠΌΡ‹ Ρ…ΠΎΡ‚ΠΈΠΌ Π²ΠΎΡΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ CS-рСгистры, + # Π½Π° случай, Ссли происходило Π²Π»ΠΎΠΆΠ΅Π½Π½ΠΎΠ΅ ΠΏΡ€Π΅Ρ€Ρ‹Π²Π°Π½ΠΈΠ΅. Для этого, ΠΌΡ‹ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ + # Π²Π΅Ρ€Π½ΡƒΡ‚ΡŒ исходноС Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ указатСля стСка ΠΏΡ€Π΅Ρ€Ρ‹Π²Π°Π½ΠΈΠΉ. Однако Π΅Π³ΠΎ Π½Ρ‹Π½Π΅ΡˆΠ½Π΅Π΅ + # Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Π½Π°ΠΌ Π΅Ρ‰Π΅ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ для восстановлСния контСкста, поэтому ΠΌΡ‹ + # сохраним Π΅Π³ΠΎ Π² рСгистр a0, ΠΈ Π±ΡƒΠ΄Π΅ΠΌ Π²ΠΎΡΡΡ‚Π°Π½Π°Π²Π»ΠΈΠ²Π°Ρ‚ΡŒΡΡ ΠΈΠ· Π½Π΅Π³ΠΎ. + mv a0,sp + + lw t1,72(a0) + addi sp,sp,80 + csrw mscratch,sp + csrw mepc,t1 + lw ra,4(a0) + lw sp,8(a0) + lw t0,12(a0) + lw t1,16(a0) + lw t2,20(a0) + lw a1,28(a0) # ΠœΡ‹ пропустили a0, ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ сСйчас ΠΎΠ½ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ Π² + # качСствС указатСля Π½Π° Π²Π΅Ρ€Ρ…ΡƒΡˆΠΊΡƒ стСка ΠΈ Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ + # восстановлСн. + lw a2,32(a0) + lw a3,36(a0) + lw a4,40(a0) + lw a5,44(a0) + lw a6,48(a0) + lw a7,52(a0) + lw t3,56(a0) + lw t4,60(a0) + lw t5,64(a0) + lw t6,68(a0) + lw a0,40(a0) + + # Π’Ρ‹Ρ…ΠΎΠ΄ ΠΈΠ· ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠ° прСрывания + mret diff --git a/Labs/15. Coremark/tb_coremark.sv b/Labs/15. Coremark/tb_coremark.sv new file mode 100644 index 0000000..a88e95d --- /dev/null +++ b/Labs/15. Coremark/tb_coremark.sv @@ -0,0 +1,132 @@ +module tb_coremark(); + + logic clk10mhz_i; + logic aresetn_i; + logic rx_i; + logic tx_o; + logic clk_i; + logic rst_i; + + assign aresetn_i = !rst_i; + assign clk10mhz_i = clk_i; + + logic rx_busy, rx_valid, tx_busy, tx_valid; + logic [7:0] rx_data, tx_data; + + always #50ns clk_i = !clk_i; + + byte coremark_msg[103]; + integer coremark_cntr; + + initial begin + $timeformat(-9, 2, " ns", 3); + clk_i = 0; + rst_i <= 0; + @(posedge clk_i); + rst_i <= 1; + repeat(2) @(posedge clk_i); + rst_i <= 0; + + dummy_programming(); + + coremark_cntr = 0; + coremark_msg = {32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32}; + forever begin + @(posedge clk_i); + if(rx_valid) begin + if((rx_data == 10) | (rx_data == 13)) begin + $display("%s", coremark_msg); + coremark_cntr = 0; + coremark_msg = {32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32}; + end + else begin + coremark_msg[coremark_cntr] = rx_data; + coremark_cntr++; + end + end + end + end + + initial #500ms $finish(); + riscv_top_asic DUT(.clk10mhz_i, .aresetn_i, .rx_i, .tx_o); + + uart_rx rx( + .clk_i (clk_i ), + .rst_i (rst_i ), + .rx_i (tx_o ), + .busy_o (rx_busy ), + .baudrate_i (17'd115200 ), + .parity_en_i(1'b1 ), + .stopbit_i (1'b1 ), + .rx_data_o (rx_data ), + .rx_valid_o (rx_valid ) +); + +uart_tx tx( + .clk_i (clk_i ), + .rst_i (rst_i ), + .tx_o (rx_i ), + .busy_o (tx_busy ), + .baudrate_i (17'd115200 ), + .parity_en_i(1'b1 ), + .stopbit_i (1'b1 ), + .tx_data_i (tx_data ), + .tx_valid_i (tx_valid ) +); + +task send_data(input byte mem[$]); + for(int i = mem.size()-1; i >=0; i--) begin + tx_data = mem[i]; + tx_valid = 1'b1; + @(posedge clk_i); + tx_valid = 1'b0; + @(posedge clk_i); + while(tx_busy) @(posedge clk_i); + end +endtask + +task rcv_data(input int size); + byte str[57]; + logic [3:0][7:0] size_val; + for(int i = 0; i < size; i++) begin + @(posedge clk_i); + while(!rx_valid)@(posedge clk_i); + str[i] = rx_data; + size_val[3-i] = rx_data; + end + if(size!=4)$display("%s", str); + else $display("%d", size_val); + wait(tx_o); +endtask + +task program_region(input byte mem[$], input logic [3:0][7:0] start_addr); + byte str [4]; + logic [3:0][7:0] size; + size = mem.size(); + if(start_addr) begin + str = {start_addr[0],start_addr[1],start_addr[2],start_addr[3]}; + send_data(str); + end + rcv_data(40); + str = {size[0],size[1],size[2],size[3]}; + send_data(str); + rcv_data(4); + send_data(mem); + rcv_data(57); + +endtask + +task finish_programming(); + send_data({8'd0, 8'd0, 8'd0, 8'd0}); +endtask + +task dummy_programming(); + byte str [4] = {8'd0, 8'd0, 8'd0, 8'd0}; + rcv_data(40); + send_data(str); + rcv_data(4); + rcv_data(57); + send_data(str); +endtask + +endmodule diff --git a/Labs/Made-up modules/lab_12.uart_tx_sb_ctrl.sv b/Labs/Made-up modules/lab_12.uart_tx_sb_ctrl.sv new file mode 100644 index 0000000..9bd0d0f --- /dev/null +++ b/Labs/Made-up modules/lab_12.uart_tx_sb_ctrl.sv @@ -0,0 +1,4 @@ +module uart_tx_sb_ctrl(); + + +endmodule diff --git a/Labs/README.md b/Labs/README.md index 4b706b4..e1c49be 100644 --- a/Labs/README.md +++ b/Labs/README.md @@ -24,6 +24,7 @@ - [12. ΠŸΠ΅Ρ€ΠΈΡ„Π΅Ρ€ΠΈΠΉΠ½Ρ‹Π΅ устройства (PU)](#12-ΠΏΠ΅Ρ€ΠΈΡ„Π΅Ρ€ΠΈΠΉΠ½Ρ‹Π΅-устройства-pu) - [13. ΠŸΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ Π½Π° языкС высокого уровня](#13-ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅-Π½Π°-языкС-высокого-уровня) - [14. ΠŸΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ°Ρ‚ΠΎΡ€](#14-ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ°Ρ‚ΠΎΡ€) + - [15. ΠžΡ†Π΅Π½ΠΊΠ° ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ](#15-ΠΎΡ†Π΅Π½ΠΊΠ°-ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ) ## ПолСзноС @@ -78,7 +79,7 @@ ![../.pic/Labs/labs.png](../.pic/Labs/labs.png) -ΠšΡƒΡ€Ρ *АрхитСктур процСссорных систСм* Π²ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ Π² сСбя Ρ†ΠΈΠΊΠ» ΠΈΠ· 13 Π»Π°Π±ΠΎΡ€Π°Ρ‚ΠΎΡ€Π½Ρ‹Ρ… Ρ€Π°Π±ΠΎΡ‚ (10 основных + 3 Π²ΡΠΏΠΎΠΌΠΎΠ³Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹Ρ…), Π² Ρ‚Π΅Ρ‡Π΅Π½ΠΈΠ΅ ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ язык описания Π°ΠΏΠΏΠ°Ρ€Π°Ρ‚ΡƒΡ€Ρ‹ **SystemVerilog** Π½Π° основС **FPGA** (ΠŸΠ›Π˜Π‘, программируСмая логичСская ΠΈΠ½Ρ‚Π΅Π³Ρ€Π°Π»ΡŒΠ½Π°Ρ схСма), с нуля, ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ, создаСтся систСма, ΠΏΠΎΠ΄ ΡƒΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅ΠΌ процСссора с Π°Ρ€Ρ…ΠΈΡ‚Π΅ΠΊΡ‚ΡƒΡ€ΠΎΠΉ **RISC-V**, ΡƒΠΏΡ€Π°Π²Π»ΡΡŽΡ‰Π΅Π³ΠΎ ΠΏΠ΅Ρ€ΠΈΡ„Π΅Ρ€ΠΈΠΉΠ½Ρ‹ΠΌΠΈ устройствами ΠΈ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΡƒΠ΅ΠΌΠΎΠ³ΠΎ Π½Π° языкС высокого уровня **C++**. +ΠšΡƒΡ€Ρ *АрхитСктур процСссорных систСм* Π²ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ Π² сСбя Ρ†ΠΈΠΊΠ» ΠΈΠ· 15 Π»Π°Π±ΠΎΡ€Π°Ρ‚ΠΎΡ€Π½Ρ‹Ρ… Ρ€Π°Π±ΠΎΡ‚ (10 основных + 5 Π²ΡΠΏΠΎΠΌΠΎΠ³Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹Ρ…), Π² Ρ‚Π΅Ρ‡Π΅Π½ΠΈΠ΅ ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ язык описания Π°ΠΏΠΏΠ°Ρ€Π°Ρ‚ΡƒΡ€Ρ‹ **SystemVerilog** Π½Π° основС **FPGA** (ΠŸΠ›Π˜Π‘, программируСмая логичСская ΠΈΠ½Ρ‚Π΅Π³Ρ€Π°Π»ΡŒΠ½Π°Ρ схСма), с нуля, ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ, создаСтся систСма, ΠΏΠΎΠ΄ ΡƒΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅ΠΌ процСссора с Π°Ρ€Ρ…ΠΈΡ‚Π΅ΠΊΡ‚ΡƒΡ€ΠΎΠΉ **RISC-V**, ΡƒΠΏΡ€Π°Π²Π»ΡΡŽΡ‰Π΅Π³ΠΎ ΠΏΠ΅Ρ€ΠΈΡ„Π΅Ρ€ΠΈΠΉΠ½Ρ‹ΠΌΠΈ устройствами ΠΈ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΡƒΠ΅ΠΌΠΎΠ³ΠΎ Π½Π° языкС высокого уровня **C++**. БоздаваСмая систСма Π½Π° ΠŸΠ›Π˜Π‘ состоит ΠΈΠ·: процСссора, памяти, ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»Π»Π΅Ρ€Π° ΠΏΡ€Π΅Ρ€Ρ‹Π²Π°Π½ΠΈΠΉ ΠΈ ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»Π»Π΅Ρ€ΠΎΠ² ΠΏΠ΅Ρ€ΠΈΡ„Π΅Ρ€ΠΈΠΉΠ½Ρ‹Ρ… устройств. @@ -181,3 +182,9 @@ Π’ Ρ€Π°ΠΌΠΊΠ°Ρ… Π΄Π°Π½Π½ΠΎΠΉ Π»Π°Π±ΠΎΡ€Π°Ρ‚ΠΎΡ€Π½ΠΎΠΉ Ρ€Π°Π±ΠΎΡ‚Ρ‹ ΠΌΡ‹ Π½Π΅ΠΌΠ½ΠΎΠ³ΠΎ упростим процСсс ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡ΠΈ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹: вмСсто записи Π² ΠŸΠ—Π£, ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ°Ρ‚ΠΎΡ€ Π±ΡƒΠ΄Π΅Ρ‚ Π·Π°ΠΏΠΈΡΡ‹Π²Π°Ρ‚ΡŒ Π΅Ρ‘ сразу Π² ΠΏΠ°ΠΌΡΡ‚ΡŒ инструкций, минуя Π·Π°Π³Ρ€ΡƒΠ·Ρ‡ΠΈΠΊ. ![../.pic/Labs/lab_14_programming_device/fig_04.drawio.png](../.pic/Labs/lab_14_programming_device.drawio.png) + +## 15. ΠžΡ†Π΅Π½ΠΊΠ° ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ + +На Ρ‚Π΅ΠΊΡƒΡ‰ΠΈΠΉ ΠΌΠΎΠΌΠ΅Π½Ρ‚ ΠΌΡ‹ создали ΠΏΡ€ΠΎΡ†Π΅ΡΡΠΎΡ€Π½ΡƒΡŽ систСму, которая способна Π²Π·Π°ΠΈΠΌΠΎΠ΄Π΅ΠΉΡΡ‚Π²ΠΎΠ²Π°Ρ‚ΡŒ с внСшним ΠΌΠΈΡ€ΠΎΠΌ посрСдством ΠΏΠ΅Ρ€ΠΈΡ„Π΅Ρ€ΠΈΠΉΠ½Ρ‹Ρ… устройств Π²Π²ΠΎΠ΄Π°-Π²Ρ‹Π²ΠΎΠ΄Π° ΠΈ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ°Ρ‚ΠΎΡ€Π°. Однако слоТно ΠΏΠΎΠ½ΡΡ‚ΡŒ, ΠΊΠ°ΠΊΠΎΠ΅ мСсто данная систСма Π·Π°Π½ΠΈΠΌΠ°Π΅Ρ‚ Π² ряду ΡƒΠΆΠ΅ ΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΡ… Π²Ρ‹Ρ‡ΠΈΡΠ»ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Ρ… систСм. + +Для ΠΎΡ†Π΅Π½ΠΊΠΈ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ ΠΌΡ‹ ΠΌΠΎΠ΄ΠΈΡ„ΠΈΡ†ΠΈΡ€ΡƒΠ΅ΠΌ ΠΏΡ€ΠΎΡ†Π΅ΡΡΠΎΡ€Π½ΡƒΡŽ систСму, собСрСм ΠΈ запустим спСциализированноС ПО, ΠΎΡ‚Π²Π΅Ρ‡Π°ΡŽΡ‰Π΅Π΅ Π·Π° ΠΈΠ·ΠΌΠ΅Ρ€Π΅Π½ΠΈΠ΅ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ (ΠΌΡ‹ Π±ΡƒΠ΄Π΅ΠΌ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ Coremark). ΠŸΠΎΠ»ΡƒΡ‡ΠΈΠ² Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Ρ‹, сравним наш процСссор, с ΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠΌΠΈ.