January 20th, 2013

Лабораторная работа 5: делаем процессор MIPS (3)

Продолжение, начало "Лабораторная работа 5: делаем процессор MIPS (1)" и "Лабораторная работа 5: делаем процессор MIPS (2)" <<

Продолжаем делать процессор MIPS на Verilog. В предыдущих частях определились с архитектурой реализуемого процессора и рассмотрели реализацию базовых модулей дизайна на Verilog. Теперь осталось рассмотреть последний ключевой модуль, в котором собственно будет реализована логика работы, которая определяет процессор (разбор и выполнение ассемблерных команд), ну и несколько вспомогательных модулей, которые необходимы для организации ввода-вывода и запуска финального дизайна на живой ПЛИС.

4. Шина данных и контроллер

Модуль шина данных и контроллер (datapath and controller) - осуществляет разбор потока команд ассемблерной программы, который приходит к нему из памяти инструкций, и осуществляет выполнение каждой команды на один такт синхросигнала процессора.

Замечание 1: В классических реализациях однотактового процессора (в частности в той, которая приведена в качестве примера в книге "Harris and Harris") части "controller" и "datapath" логически разнесены по разным модулям и включают некоторые дополнительные модули типа ALU (Arithmetical logic unit - Арифметико-логическое устройство). Controller отвечает за разбор команд и арифметических операций (блок ALU decoder). Datapath определяет логику путешествия данных внутри процессора (между файлом регистров и памятью данных, установка счетчика программы и т.п.) в зависимости от текущей операции. Подобное разбиение целесообразно производить в силу ряда объективных причин - модульность и гибкость дизайна, оптимизация использования доступных аппаратных ресурсов (уменьшение количества используемых строительных блоков и сокращение количества микроопераций, выполняемых между двумя тактами) и т.п. Однако введение таких дополнительных сущностей также в некоторой степени усложнит дизайн (увеличится количество витков в "клубке проводов", по которым гуляют биты между каждыми двумя тактами процессора) и описывающее его повествование (каждый дополнительный модуль - лишний раздел с дополнительными разъяснениями зачем он нужен и каким образом вписывается в общий дизайн). По этой причине некоторые дополнительные сущности и разбиения из дизайна удалены, а вся необходимая функциональность помещена в один большой модуль. Его структура и логика будут более понятны в рамках текущего цикла лабораторных работ, а результат его работы в достаточном приближении будет точно таким же, как результат работы более правильных дизайнов.

Замечание 2: Выбранный способ реализации данного модуля судя по всему также должен быть более понятен программистам, привыкшим к процедурным парадигмам, т.к. в нем прослеживается некоторая последовательность действий, хотя в некоторых случаях она и мнимая. В то время как в примере из "Harris and Harris" дизайн на каждом шаге как бы "сворачивается в клубок" из последовательности вложенных модулей и архитектору системы требуется видеть, по какой из петлей пробежит входящий сигнал в зависимости от тех или иных условий, сразу на всех уровнях.

Итак, судя по названию, в данный модуль входят два основных логических блока:
Контроллер (controller) - разбор двоичных инструкций (машинных кодов) процессора, которые поступают в модуль из памяти инструкций.
Шина данных (datapath) - логика путешествия данных между блоками процессора - между файлом регистром и памятью данных, установка счетчика программы и т.п. в зависимости от значения текущей инструкции.

Код модуля, приведенный ниже полностью, на каждый такт процессора делает примерно следующее:
1. Разбор текущего значения 32хбитной инструкции на составляющие поля (см команды ассемблера).
2. В зависимости от типа инструкции и значений ее внутренних полей производится вычисление значений, которые должны быть отправлены в файл регистров, память данных или счетчик программы по факту выполнения текущей команды.
3. Собственно в момент такта процессора clock происходит запись значений, подготовленных на предыдущем этапе, уже непосредственно в файл регистров, память данных и счетчик инструкций.
4. И так вечно и бесконечно.

И последнее напутствующее замечание: для вычисления результатов работы каждой команды и записи вычисленных значений по назначению на каждый такт синхросигнала clock используются всё те же два блока always - always @(*) и always @(posedge clk), что и в Лабораторной работе 4 по знакомству с простыми конечными автоматами. Первый блок always @(*) вычисляет значения результата работы инструкций и находится прямо в текущем модуле шина данных и контроллер (datapath and controller), а второй always @(posedge clk) в трех экземплярах размазан по модулям счетчик программы (pc - program counter), файл регистров (register file) и память данных (data memory). Про подробности работы разных блоков always и их отличия можно почитать в описании 4й лабораторной работы, в описании ниже на этих нюансах останавливаться уже не будем.

Теперь собственно технические подробности и код Verilog (модуль полностью можно находится в файле mips.v, ниже сразу идет разбор построчно).



Collapse )
Подошли совсем вплотную к кульминации нашего дизайна - реализация ассемблерных программ процессора, в следующем посте.