Выпуск #9/2024
А.В. Строгонов, А. Винокуров, А.И. Строгонов
ПРИМЕР РЕАЛИЗАЦИИ ОДНОТАКТНОГО ПРОЦЕССОРНОГО ЯДРА RISC-V В САПР ALTERA QUARTUS II
ПРИМЕР РЕАЛИЗАЦИИ ОДНОТАКТНОГО ПРОЦЕССОРНОГО ЯДРА RISC-V В САПР ALTERA QUARTUS II
Просмотры: 641
DOI: 10.22184/1992-4178.2024.240.9.70.79
Одним из направлений работ в области создания проектов на базе архитектуры RISC-V является отработка прототипов процессоров на платформе ПЛИС. В статье рассмотрен пример реализации однотактного процессорного ядра RISC-V в базисе ПЛИС Cyclone V с применением САПР Altera Quartus II.
Одним из направлений работ в области создания проектов на базе архитектуры RISC-V является отработка прототипов процессоров на платформе ПЛИС. В статье рассмотрен пример реализации однотактного процессорного ядра RISC-V в базисе ПЛИС Cyclone V с применением САПР Altera Quartus II.
Теги: altera quartus ii cad fpga risc-v architecture rtl representation rtl-представление vhdl code vhdl-код архитектура risc-v плис сапр altera quartus ii
Пример реализации однотактного процессорного ядра RISC-V в САПР
Altera Quartus II
А.В. Строгонов, д.т.н., А. Винокуров, к.т.н., А.И. Строгонов
В России продолжается популяризация и развитие открытой архитектуры RISC-V. Сегодня разработкой проектов на базе открытой архитектуры RISC-V занимается ряд российских компаний и ведущих университетов. Например, микроконтроллер Hackee на базе ядра SCR1 (от российского разработчика Syntacore) был спроектирован совместно магистрантами НИУ «МИЭТ» и специалистами компании Yadro. «Микрон» представил микроконтроллер «MIK32 Амур» (К1948ВК018) на базе RISC-V и отладочную плату на его основе. Есть проекты и других российских компаний, действующих в рамках «Альянса RISC-V» [1]. Одним из направлений исследований в этой области является отработка прототипов процессоров на платформе ПЛИС. В статье рассмотрен пример реализации однотактного процессорного ядра RISC-V в базисе ПЛИС Cyclone V с применением САПР Altera Quartus II.
Для реализации процессора RISC-V в данной работе была выбрана однотактная микроархитектура, которая выполняет всю команду за один такт. Из-за того, что все действия выполняются за один такт, эта микроархитектура не требует никаких дополнительных регистров, недоступных для программиста. Основным преимуществом однотактной микроархитектуры является простой принцип ее работы.
В данной разработке в качестве основного языка был выбран VHDL, хотя процессор можно реализовать на двух языках: SystemVerilog и VHDL. Коды SystemVerilog/VHDL основных функциональных блоков RISC-V приведены в разделе 7.6.1 работы [2]. В работах [2] и [3] cинтез кодов SystemVerilog/VHDL осуществлялся с помощью программы Synplify Premier от Synplicity.
При адаптации VHDL-кодов функциональных блоков процессорного ядра RISC-V возникли некоторые вопросы, связанные с синтезатором-компилятором QIS САПР Quartus II. Прояснить эти вопросы помогла оригинальная версия переводного учебника [3]. При разработке проекта в базисе ПЛИС Cyclone V были сохранены оригинальные коды SystemVerilog/VHDL и обозначения сигналов и шин.
Структурная и функциональная схемы однотактного процессорного ядра RISC-V (с поддержкой команды addi) показаны на рис. 1 и 2. На рис. 3 представлена тестовая программа (машинный код хранится в шестнадцатеричном файле riscvtest.txt), зашитая в ПЗУ (рис.7.64 и 7.65 из [2]). Тестируются следующие команды: add, sub, and, or, slt, addi, lw, sw, beq, jal. Если тест проходит успешно, то значение 25 (0 × 19) должно записаться по адресу 100 (0 × 64).
Верхний уровень иерархии проекта в САПР Quartus II, в отличие от работы [2], представлен не структурным файлом (обьект riscvsingle, пример 7.1 из [2]) на языке VHDL, а иерархической схемой в графическом редакторе (рис. 4). На рис. 5 в качестве примера показан тракт данных, соответствующий примеру 7.5 (обьект datapath).
При адаптации RISC-V в САПР Altera Quartus II возник ряд проблем. Все шины данных во всех функциональных блоках (в работе [2] они называются строительными блоками) должны быть 32-разрядными. В некоторых функциональных блоках требуется увеличение разрядности шин с 8 до 32 (регистр с сигналом сброса flopr, пример 7.8 [2]; шинный мультиплексор 2:1, пример 7.10 [2]; шинный мультиплексор 3:1, пример 7.11 [2]).
Синтезатор Quartus II не поддерживает пакет расширения IEEE.NUMERIC_STD_UNSIGNED.all от Synopsys или Mentor Graphics. Поэтому в данной работе использовали пакеты IEEE.NUMERIC_STD.all и IEEE.std_logic_unsigned.all.
Возникла также проблема с памятью команд (асинхронное ПЗУ). При компиляции исходного VHDL-кода ПЗУ (пример 7.14) возникает ошибка компиляции (рис. 6). Причина неудачной инициализации ОЗУ в проекте заключается в том, что операции ввода-вывода файлов в VHDL не поддерживаются синтезатором в Quartus II. Пример 1 (рис. 7) демонстрирует «подправленный» (сделан по шаблону XST [4, 5]) VHDL-код, который все же проходит безошибочную компиляцию с загрузкой из текстового файла riscvtest.txt, однако mif-файл конфигурации ПЗУ создается пустым (с нулевым содержимым) (пример 2, рис. 8). Это говорит о том, что VHDL-код ПЗУ с загрузкой из файла является не синтезируемым в САПР Quartus II, но может быть использован, например, в САПР Xilinx.
Воспользоваться встроенной мегафункцией ПЗУ ROM: 1PORT не получилось по причине ограничения разрядности адресной шины и того, что ПЗУ работает в синхронном режиме.
В руководстве пользователя [4] указано, что Quartus II поддерживает системные команды $readmem и $readmemh в Verilog для инициализации памяти с помощью текстового файла. Поэтому было принято решение использовать оригинальный SystemVerilog-код ПЗУ (пример 7.14). На рис. 4 показан проект процессорного ядра RISC-V в САПР Quartus II с использованием ПЗУ и ОЗУ на SystemVerilog.
Пример 3 (рис. 9) показывает, что САПР генерирует заполненный mif-файл (64 строки (слова) по 32 бита в каждой; система счисления содержимого DATA_RADIX представлена в двоичном формате BIN, а содержимого адресов – в беззнаковом десятичном UNS) из SystemVerilog-кода ПЗУ. Рис. 10 показывает, что асинхронное ПЗУ организуется на базе синхронного ОЗУ с 6-разрядной адресной шиной RADDR[5..0].
Тем не менее, можно организовать инициализацию ПЗУ ([5]) непосредственно из VHDL-кода (пример 4, рис. 11).
В этом случае нужно будет заполнять дистанцию между реальными командами тремя пустыми значениями, например, X"00500113", X"00000000", X"00000000", X"00000000", X"00C00193", по причине того, что счетчик команд увеличивает свое содержимое на 4, поскольку команды в RISC-V являются 4-байтовыми. В этом случае потребуется 80 строк и использование 7-разрядной адресной шины RADDR[6..0] (рис. 12). Пример 5 (рис. 13) демонстрирует фрагмент сгенерированного mif-файла при инициализации ПЗУ непосредственно в HDL-коде.
Выявилась также проблема компиляции ОЗУ данных. VHDL-код из работ [2, 3] используется так же и для реализации ОЗУ MIPS-процессора [6]: mips.vhd
From Section 7.6 of Digital Design & Computer Architecture Updated to VHDL 2008 26 July 2011 David_Harris@hmc.edu.
В VHDL-коде ОЗУ (пример 7.15 из работ [2, 3]) используется to_integer, оператор wait on и 8-разрядная адресная шина a(7 downto 2) (пример 6, рис. 14). Первые две причины приводят к ошибкам компиляции в САПР Quartus II, которые можно исправить, заменив to_integer на conv_integer с соответствующим пакетом IEEE.std_logic_unsigned.all, и использовать один оператор process на запись и считывание (пример 7, рис. 15).
Использование 8-разрядной адресной шины a(7 downto 2) ОЗУ данных приводит к неправильному функционированию процесса. Поэтому был использован оригинальный SystemVerilog-код ОЗУ с 32-разрядной адресной шиной. Как вариант можно использовать доработанный VHDL-код (см. пример 7, рис. 15).
В работах [2, 3] разработка VHDL-кода АЛУ вынесено в самостоятельную задачу. Однако, код АЛУ можно взять из [6] от MIPS-процессора (пример 8, рис. 16). VHDL-код в точности соответствует схеме на рис. 5.18, б из работы [2]. АЛУ поддерживает команду SLT (set if less than – «установить, если меньше, чем», когда A < B, Result = 1), а также логические сдвиги влево (LSL) или вправо (LSL).
В работе [2] приведена программа тестбенча (обьект testbench, пример 7.12). Он проверяет наличие записи в память данных и сообщает об успехе, если правильное значение (25) записано по адресу 100.
Но мы не будем его использовать, а подтвердим правильность разработки функциональным моделированием с использованием симулятора ModelSim Altera Starter Edition и векторного редактора. Функциональное моделирование показывает, что тест проходит успешно (рис. 17). Значение 25 (0 × 19) записывается в ОЗУ по адресу 100 (0 ×64). Проект работает на максимальной частоте 58 МГц (табл. 1).
Проверить правильность выполнения команд можно с помощью бесплатной онлайн-программы «кодер/декодер команд RISC-V» [7] (рис. 18). На рис. 18 показан
перевод команды FF718393 (третья команда с адресом 8 на рис. 3), представленной в шестнадцатеричном формате, в ассемблерный код addi x7, x3, –9. В результате выполнения этой команды в регистр с адресом x7 будет занесено число 3: x7 = (12–9) = 3 (см. рис. 17).
Команда FF718393 представляется в двоичном коде с выделением полей команд процессора RV32I. На рис. 18 видно, что это команда относится к типу I. Если сравнить рис. 17 и 18, то можно увидеть, что поля команды, формируемые проектом процессора RISC-V в САПР Quartus II, правильно заполнены значениями.
Заключение
Несмотря на незначительные проблемы с адаптацией HDL-кода однотактного процессорного ядра RISC-V, в данной работе удалось успешно реализовать его в базисе ПЛИС Cyclone V
с применением САПР Altera Quartus II. При этом максимальная рабочая частота данной реализации составила 58 МГц.
Потребовалась доработка VHDL-кода ПЗУ команд и ОЗУ данных, а также замена разрядности шин данных в некоторых функциональных блоках с 8 на 32 (регистр с сигналом сброса flopr, пример 7.8 [2]; шинный мультиплексор 2:1, пример 7.10 [2]; шинный мультиплексор 3:1, пример 7.11 [2]).
ЛИТЕРАТУРА
Строгонов А.В., Бордюжа О.Л., Строгонов А.И. Эффективный подход в разработке управляющих автоматов микропроцессорных ядер // ЭЛЕКТРОНИКА: Наука, Технология, Бизнес. 2024. № 1. С. 78–86.
Харрис С.Л., Харрис Д. Цифровая схемотехника и архитектура компьютера RISC-V / Пер. с англ. В.С. Яценкова, А.Ю. Романова; под ред. А.Ю. Романова. М.: ДМК Пресс, 2021. 810 с.
Harris S.L., Harris D. Digital Design and Computer Architecture RISC-V Edition. 2022. ISBN: 978-0-12-820064-3.
Intel Quartus Prime Pro Edition User Guide. Design Recommendations. UG-20131. ID: 683082. Version: 2021.10.04.
XST User Guide. 10.1. ROMs Using Block RAM Resources HDL Coding Techniques // www.xilinx.com.
https://pastebin.com/ew0SACWy.
https://luplab.gitlab.io/rvcodecjs/#q=00C00193&abi=false&isa=AUTO.
Altera Quartus II
А.В. Строгонов, д.т.н., А. Винокуров, к.т.н., А.И. Строгонов
В России продолжается популяризация и развитие открытой архитектуры RISC-V. Сегодня разработкой проектов на базе открытой архитектуры RISC-V занимается ряд российских компаний и ведущих университетов. Например, микроконтроллер Hackee на базе ядра SCR1 (от российского разработчика Syntacore) был спроектирован совместно магистрантами НИУ «МИЭТ» и специалистами компании Yadro. «Микрон» представил микроконтроллер «MIK32 Амур» (К1948ВК018) на базе RISC-V и отладочную плату на его основе. Есть проекты и других российских компаний, действующих в рамках «Альянса RISC-V» [1]. Одним из направлений исследований в этой области является отработка прототипов процессоров на платформе ПЛИС. В статье рассмотрен пример реализации однотактного процессорного ядра RISC-V в базисе ПЛИС Cyclone V с применением САПР Altera Quartus II.
Для реализации процессора RISC-V в данной работе была выбрана однотактная микроархитектура, которая выполняет всю команду за один такт. Из-за того, что все действия выполняются за один такт, эта микроархитектура не требует никаких дополнительных регистров, недоступных для программиста. Основным преимуществом однотактной микроархитектуры является простой принцип ее работы.
В данной разработке в качестве основного языка был выбран VHDL, хотя процессор можно реализовать на двух языках: SystemVerilog и VHDL. Коды SystemVerilog/VHDL основных функциональных блоков RISC-V приведены в разделе 7.6.1 работы [2]. В работах [2] и [3] cинтез кодов SystemVerilog/VHDL осуществлялся с помощью программы Synplify Premier от Synplicity.
При адаптации VHDL-кодов функциональных блоков процессорного ядра RISC-V возникли некоторые вопросы, связанные с синтезатором-компилятором QIS САПР Quartus II. Прояснить эти вопросы помогла оригинальная версия переводного учебника [3]. При разработке проекта в базисе ПЛИС Cyclone V были сохранены оригинальные коды SystemVerilog/VHDL и обозначения сигналов и шин.
Структурная и функциональная схемы однотактного процессорного ядра RISC-V (с поддержкой команды addi) показаны на рис. 1 и 2. На рис. 3 представлена тестовая программа (машинный код хранится в шестнадцатеричном файле riscvtest.txt), зашитая в ПЗУ (рис.7.64 и 7.65 из [2]). Тестируются следующие команды: add, sub, and, or, slt, addi, lw, sw, beq, jal. Если тест проходит успешно, то значение 25 (0 × 19) должно записаться по адресу 100 (0 × 64).
Верхний уровень иерархии проекта в САПР Quartus II, в отличие от работы [2], представлен не структурным файлом (обьект riscvsingle, пример 7.1 из [2]) на языке VHDL, а иерархической схемой в графическом редакторе (рис. 4). На рис. 5 в качестве примера показан тракт данных, соответствующий примеру 7.5 (обьект datapath).
При адаптации RISC-V в САПР Altera Quartus II возник ряд проблем. Все шины данных во всех функциональных блоках (в работе [2] они называются строительными блоками) должны быть 32-разрядными. В некоторых функциональных блоках требуется увеличение разрядности шин с 8 до 32 (регистр с сигналом сброса flopr, пример 7.8 [2]; шинный мультиплексор 2:1, пример 7.10 [2]; шинный мультиплексор 3:1, пример 7.11 [2]).
Синтезатор Quartus II не поддерживает пакет расширения IEEE.NUMERIC_STD_UNSIGNED.all от Synopsys или Mentor Graphics. Поэтому в данной работе использовали пакеты IEEE.NUMERIC_STD.all и IEEE.std_logic_unsigned.all.
Возникла также проблема с памятью команд (асинхронное ПЗУ). При компиляции исходного VHDL-кода ПЗУ (пример 7.14) возникает ошибка компиляции (рис. 6). Причина неудачной инициализации ОЗУ в проекте заключается в том, что операции ввода-вывода файлов в VHDL не поддерживаются синтезатором в Quartus II. Пример 1 (рис. 7) демонстрирует «подправленный» (сделан по шаблону XST [4, 5]) VHDL-код, который все же проходит безошибочную компиляцию с загрузкой из текстового файла riscvtest.txt, однако mif-файл конфигурации ПЗУ создается пустым (с нулевым содержимым) (пример 2, рис. 8). Это говорит о том, что VHDL-код ПЗУ с загрузкой из файла является не синтезируемым в САПР Quartus II, но может быть использован, например, в САПР Xilinx.
Воспользоваться встроенной мегафункцией ПЗУ ROM: 1PORT не получилось по причине ограничения разрядности адресной шины и того, что ПЗУ работает в синхронном режиме.
В руководстве пользователя [4] указано, что Quartus II поддерживает системные команды $readmem и $readmemh в Verilog для инициализации памяти с помощью текстового файла. Поэтому было принято решение использовать оригинальный SystemVerilog-код ПЗУ (пример 7.14). На рис. 4 показан проект процессорного ядра RISC-V в САПР Quartus II с использованием ПЗУ и ОЗУ на SystemVerilog.
Пример 3 (рис. 9) показывает, что САПР генерирует заполненный mif-файл (64 строки (слова) по 32 бита в каждой; система счисления содержимого DATA_RADIX представлена в двоичном формате BIN, а содержимого адресов – в беззнаковом десятичном UNS) из SystemVerilog-кода ПЗУ. Рис. 10 показывает, что асинхронное ПЗУ организуется на базе синхронного ОЗУ с 6-разрядной адресной шиной RADDR[5..0].
Тем не менее, можно организовать инициализацию ПЗУ ([5]) непосредственно из VHDL-кода (пример 4, рис. 11).
В этом случае нужно будет заполнять дистанцию между реальными командами тремя пустыми значениями, например, X"00500113", X"00000000", X"00000000", X"00000000", X"00C00193", по причине того, что счетчик команд увеличивает свое содержимое на 4, поскольку команды в RISC-V являются 4-байтовыми. В этом случае потребуется 80 строк и использование 7-разрядной адресной шины RADDR[6..0] (рис. 12). Пример 5 (рис. 13) демонстрирует фрагмент сгенерированного mif-файла при инициализации ПЗУ непосредственно в HDL-коде.
Выявилась также проблема компиляции ОЗУ данных. VHDL-код из работ [2, 3] используется так же и для реализации ОЗУ MIPS-процессора [6]: mips.vhd
From Section 7.6 of Digital Design & Computer Architecture Updated to VHDL 2008 26 July 2011 David_Harris@hmc.edu.
В VHDL-коде ОЗУ (пример 7.15 из работ [2, 3]) используется to_integer, оператор wait on и 8-разрядная адресная шина a(7 downto 2) (пример 6, рис. 14). Первые две причины приводят к ошибкам компиляции в САПР Quartus II, которые можно исправить, заменив to_integer на conv_integer с соответствующим пакетом IEEE.std_logic_unsigned.all, и использовать один оператор process на запись и считывание (пример 7, рис. 15).
Использование 8-разрядной адресной шины a(7 downto 2) ОЗУ данных приводит к неправильному функционированию процесса. Поэтому был использован оригинальный SystemVerilog-код ОЗУ с 32-разрядной адресной шиной. Как вариант можно использовать доработанный VHDL-код (см. пример 7, рис. 15).
В работах [2, 3] разработка VHDL-кода АЛУ вынесено в самостоятельную задачу. Однако, код АЛУ можно взять из [6] от MIPS-процессора (пример 8, рис. 16). VHDL-код в точности соответствует схеме на рис. 5.18, б из работы [2]. АЛУ поддерживает команду SLT (set if less than – «установить, если меньше, чем», когда A < B, Result = 1), а также логические сдвиги влево (LSL) или вправо (LSL).
В работе [2] приведена программа тестбенча (обьект testbench, пример 7.12). Он проверяет наличие записи в память данных и сообщает об успехе, если правильное значение (25) записано по адресу 100.
Но мы не будем его использовать, а подтвердим правильность разработки функциональным моделированием с использованием симулятора ModelSim Altera Starter Edition и векторного редактора. Функциональное моделирование показывает, что тест проходит успешно (рис. 17). Значение 25 (0 × 19) записывается в ОЗУ по адресу 100 (0 ×64). Проект работает на максимальной частоте 58 МГц (табл. 1).
Проверить правильность выполнения команд можно с помощью бесплатной онлайн-программы «кодер/декодер команд RISC-V» [7] (рис. 18). На рис. 18 показан
перевод команды FF718393 (третья команда с адресом 8 на рис. 3), представленной в шестнадцатеричном формате, в ассемблерный код addi x7, x3, –9. В результате выполнения этой команды в регистр с адресом x7 будет занесено число 3: x7 = (12–9) = 3 (см. рис. 17).
Команда FF718393 представляется в двоичном коде с выделением полей команд процессора RV32I. На рис. 18 видно, что это команда относится к типу I. Если сравнить рис. 17 и 18, то можно увидеть, что поля команды, формируемые проектом процессора RISC-V в САПР Quartus II, правильно заполнены значениями.
Заключение
Несмотря на незначительные проблемы с адаптацией HDL-кода однотактного процессорного ядра RISC-V, в данной работе удалось успешно реализовать его в базисе ПЛИС Cyclone V
с применением САПР Altera Quartus II. При этом максимальная рабочая частота данной реализации составила 58 МГц.
Потребовалась доработка VHDL-кода ПЗУ команд и ОЗУ данных, а также замена разрядности шин данных в некоторых функциональных блоках с 8 на 32 (регистр с сигналом сброса flopr, пример 7.8 [2]; шинный мультиплексор 2:1, пример 7.10 [2]; шинный мультиплексор 3:1, пример 7.11 [2]).
ЛИТЕРАТУРА
Строгонов А.В., Бордюжа О.Л., Строгонов А.И. Эффективный подход в разработке управляющих автоматов микропроцессорных ядер // ЭЛЕКТРОНИКА: Наука, Технология, Бизнес. 2024. № 1. С. 78–86.
Харрис С.Л., Харрис Д. Цифровая схемотехника и архитектура компьютера RISC-V / Пер. с англ. В.С. Яценкова, А.Ю. Романова; под ред. А.Ю. Романова. М.: ДМК Пресс, 2021. 810 с.
Harris S.L., Harris D. Digital Design and Computer Architecture RISC-V Edition. 2022. ISBN: 978-0-12-820064-3.
Intel Quartus Prime Pro Edition User Guide. Design Recommendations. UG-20131. ID: 683082. Version: 2021.10.04.
XST User Guide. 10.1. ROMs Using Block RAM Resources HDL Coding Techniques // www.xilinx.com.
https://pastebin.com/ew0SACWy.
https://luplab.gitlab.io/rvcodecjs/#q=00C00193&abi=false&isa=AUTO.
Отзывы читателей