Каковы основные этапы написания симулятора Instruction Set? - PullRequest
3 голосов
/ 03 января 2011

Я буду работать над проектом, который требует написания симулятора для определенного набора команд (который может быть не для реального процессора). Предпочтительно этот симулятор будет чем-то похожим на симулятор SPIM для MIPS ISA. Он будет показывать содержимое всех регистров, ячеек памяти и т. Д., И позвольте мне пошагово выполнить инструкции. Существует ли стандартный набор шагов для написания симуляторов? С чего начать?

Я знаю Java и C ++, и я закончил два курса по компьютерной архитектуре и работал в команде из 3 человек.

Ответы [ 3 ]

4 голосов
/ 04 января 2011

Я бы сказал, что сначала вам нужно поработать над дизассемблером.Симулятор - это следующий шаг после дизассемблера.Например, дизассемблер x86 (или другие наборы команд переменной длины слова) должен следить за выполнением кода.Во-первых, он должен знать, основываясь на кодах операций, сколько байтов используется этой инструкцией, во-вторых, это ветвь и, если да, то какой, условный или безусловный, и реагировать соответственно.Симулятор делает все это плюс он имитирует регистры.Дизассемблер будет для образовательных целей, а не для полированной публикации на sourceforge.Достаточно, чтобы понять, как анализировать инструкции на уровне битов, вычислять смещения перехода.

Я бы начал с простого набора команд, такого как 12-битный рис, или 6502, или чего-то подобного (msp430 - это другоевозможный кандидат).Если вы идете с существующим набором инструкций для обучения написанию симулятора, вы можете использовать существующие инструментальные цепочки (ассемблеры и, возможно, компиляторы) для этой цели.Разделите задачу пополам.Для нового набора команд вам понадобится набор инструментов в какой-то момент или, по крайней мере, хороший дизассемблер, если вы хотите вручную написать машинный код (дизассемблер дважды проверяет, есть ли у вас машинный код, который вы хотели).Или вы можете иметь возможность в симуляторе выводить дизассемблированный код в порядке выполнения, который в любом случае хорош для отладки.

Сначала не беспокойтесь о прерываниях, но имейте в виду, что вам понадобится механизм остановкиПоток симуляции, сохранить состояние и повторно использовать симулятор для стольких тактов.Вы увидите множество симуляторов, по сути, по одному шагу каждой инструкции.Оценка количества тактов в каждой инструкции по аппаратным причинам либо для периодических прерываний, либо для другого смоделированного оборудования, которое должно быть синхронизировано с имитируемым процессором.Так что было бы неплохо начать с моделирования вашего образа жизни, а затем, при необходимости, придумать улучшения производительности.

Если вы не программировали с использованием конечных автоматов, я настоятельно рекомендую немного узнать о них и написать несколькотренировочные программы.

Я работаю над проектом и надеюсь опубликовать его, если я когда-нибудь закончу, может помочь с такими темами.Мои симуляторы набора команд в наши дни на самом деле написаны на языке проектирования аппаратного обеспечения (например, verilog, а не hdl, который я использую, но он конвертируется в verilog), а затем используют нечто вроде verilator с оболочкой C / C ++.Таким образом, работа, связанная с извлечением кодов операций и битов, выполняется языком, предназначенным для управления именно этим.А части, которые хотят имитировать периферию или предоставлять графический интерфейс или другие способы отображения происходящего, обрабатываются языком, разработанным для этого.Если вам довелось работать над проектом, в котором этот новый набор инструкций реализован в vhdl или verilog, я настоятельно рекомендую гибридный симулятор hdl plus с программным решением либо через VPI, если это коммерческий симулятор hdl, либо с помощью других более простых методов, если вы используете verilator.или икар верилог или гхдл или другие.(Икару может понадобиться реклама, такая как интерфейс vpi).Прелесть здесь в том, что вы ближе к реальному оборудованию, ошибки и бородавки и т. Д. В оборудовании могут быть найдены и устранены перед переходом на кремний, изменения или улучшения в оборудовании мгновенно реализуются в симуляции вместо того, чтобы выполнять сопоставлениеизменения или улучшения в симуляторе и т. д. У симуляторов hdl есть скриптовые языки или система C и т. д., которые отлично подходят для функциональной проверки оборудования, но вы не можете запустить его на кремнии.Если вы не одобряете использование этих инструментов и запускаете реальные двоичные файлы на смоделированной логике, и предоставляете уровень абстракции для реальных инструментов для загрузки, отладки или мониторинга (например, напишите бэкэнд в openocd для прохождения через хост к слою hdl simи поговорить с имитатором jtag на чипе, в зависимости от сложности этого проекта (вполне выполнимо, как я сделал это сам)).Эти реальные программы можно запускать как в симуляции, так и на кремнии, экономя время при написании тестов и создавая тестовое программное обеспечение задолго до того, как кремний прибудет, а не запускается после того, как он прибудет.Если это новый или иным образом набор инструкций для цепочки инструментов, вам придется потратить время на эту цепочку инструментов, по крайней мере, на ассемблер и компоновщик, и я бы сделал какой-то дизассемблер, а затем превратил бы этот дизассемблер или его части в первый вырез.на симуляторе.Что касается стандартных вещей, которые я видел в имитаторах наборов команд, то, по сути, мы думаем о единичном шаге, чтобы вы могли обрабатывать часы, прерывания и другое моделируемое оборудование.основная функция моделирования либо имитирует один тактовый цикл, который может быть не полной инструкцией (подход конечного автомата), либо основная функция моделирует одну инструкцию и возвращает модифицирующие регистры, флаги и память в соответствии с требованиями инструкции (и подсчет имитированных часов).В зависимости от того, насколько многофункциональным вы хотите, чтобы этот симулятор с самого начала выполнял чтение и запись ram / rom и регистрировал функции, чтобы вы могли в одном месте захватывать память и регистрировать изменения для отображения пользователю.Только доступ или, по крайней мере, изменение регистров и оперативной памяти через эти абстрактные функции.Кроме того, это просто тонна набора текста, чем сложнее набор команд, тем больше инструкций, тем больше строк кода для ввода.

4 голосов
/ 03 января 2011

Первым шагом будет создание ассемблера для вашего процессора. Ассемблер не имеет никакого отношения к симулятору, и, на мой взгляд, включение синтаксического анализатора ассемблера в ненужное усложнит ситуацию.

Использование отдельного ассемблера сохраняет модульность и позволяет вашему симулятору иметь в качестве входного кода простой двоичный код, который вы даже можете создавать, проверять и изменять отдельно. Это также соответствует существующей практике.

Что касается вашего симулятора, поиск в Google по запросу writing a CPU simulator имеет это в качестве первого попадания, и есть еще немало интересных результатов.

3 голосов
/ 05 января 2011
  1. отправной точкой является сам набор инструкций и внутренняя архитектура процессора [иногда называемая «моделью программирования»] и режимы адресации.
  2. глубокое знание того, что ожидается от каждой инструкциичтобы сделать [внутри процессора] и какой вывод процессор должен отправить [в память или порт ввода / вывода] для этой инструкции
  3. разработать формат инструкции для инструкции машинного кода: сколько бит / байтдолжен быть в машинном коде инструкции;исходя из этого, сколько битов составляют код операции, сколько битов для указания режима адресации, сколько битов для указания операнда [регистр, данные или адрес] и т. д. должны быть определены.также определите порядок и комбинации этих групп битов.Вам будет удобно держать общее количество нет.битов в инструкции машинного кода как кратное 8 [то есть инструкция машинного кода, размер которой составляет 1, 2 или 3 байта, более удобна для вас, чем 12 бит или 17 бит].
  4. в симуляторепрограммное обеспечение [которое вы можете написать на c / cpp / java или на любом другом языке, который вам нравится], вы будете назначать переменные для представления внутренних регистров процессора;работа ALU будет выполняться функциями вашего ПО;ваш SW будет читать инструкции машинного кода из двоичного файла / ascii-hex;каждая инструкция должна анализироваться на основе того, что указывают разные группы битов];затем вызовите необходимые функции на основе этих указаний.
  5. спроектируйте хороший интерфейс пользователя для симулятора sw.Я думаю, вы, вероятно, будете использовать симулятор для демонстрации / обучения / тренировки.отображать действия sw [действия, происходящие внутри процессора], когда действия выполняются;например, вы можете отображать ячейки стековой памяти или регистры, когда данные записываются или считываются из этих мест.это поможет лучше понять операции процессора пользователями.Что еще более важно, это поможет вам, когда вы разрабатываете / тестируете симулятор sw, чтобы легко находить ошибки.
...