Это симулятор процессора с архитектурой big-endian, поддерживающий инструкции фиксированной длины (DATA_WIDTH = 32 бита). Проект включает реализацию процессора, модуля памяти и тестового окружения, а также тестовую программу для вычисления последовательности Фибоначчи.
- Архитектура: Big-endian
- Длина инструкций: Фиксированная,
DATA_WIDTH = 32бита - Поддерживаемые инструкции:
LOAD: Загрузка данных из памяти в регистрSTORE: Сохранение данных из регистра в памятьADD: Сложение значений двух регистров с записью результатаHALT: Остановка выполнения программы
Для сборки проекта используйте следующую команду, указав путь к библиотеке SystemC:
make SYSTEMC_HOME=/path/to/systemc SYSTEMC_LIB=/path/to/systemc/libdocker build . --no-cache -t simpulator
docker run -it simpulator ./simulationПо умолчанию тестовая программа вычисляет последовательность Фибоначчи. Для проверки корректности работы при выполнении инструкции STORE выводится содержимое всех регистров в консоль.
- Функция
print_registers(): Изменение формата вывода регистров. - Функция
execute(): Изменение типа инструкции, при выполнении которой выводится информация о регистрах. - Функция
store_program()вTestBench: Изменение кода тестовой программы (по умолчанию вычисляется последовательность Фибоначчи).
Для загрузки своей программы:
- Отредактируйте функцию
store_program()в файлеTestBench.cpp. - Укажите последовательность инструкций в формате, соответствующем архитектуре процессора.
- Убедитесь, что адреса памяти и регистров корректны.
Каждая инструкция имеет длину 32 бита. Первые INSTRUCTION_WIDTH = 4 бита кодируют код операции (opcode). Далее структура зависит от типа инструкции.
Сложение значений двух регистров с записью результата в регистр назначения.
+-----------+-------------+-------------+-------------+------------------+
| 4 бита | 4 бита | 4 бита | 4 бита | 16 бит |
| Opcode | R_dest | R_src1 | R_src2 | Зарезервировано |
+-----------+-------------+-------------+-------------+------------------+
R_dest: Регистр назначения (REG_WIDTH = 4бита).R_src1,R_src2: Регистры-источники (REG_WIDTH = 4бита каждый).
Загрузка данных из памяти в регистр.
+-----------+-------------+----------------------+-------------+
| 4 бита | 4 бита | 16 бит | 8 бит |
| Opcode | R_dest | Адрес источника | Зарезервировано |
+-----------+-------------+----------------------+-------------+
R_dest: Регистр назначения (REG_WIDTH = 4бита).Адрес источника: Адрес в памяти (ADDR_WIDTH = 16бит).
Сохранение данных из регистра в память.
+-----------+----------------------+-------------+-------------+
| 4 бита | 16 бит | 4 бита | 8 бит |
| Opcode | Адрес назначения | R_src | Зарезервировано |
+-----------+----------------------+-------------+-------------+
Адрес назначения: Адрес в памяти (ADDR_WIDTH = 16бит).R_src: Регистр-источник (REG_WIDTH = 4бита).
Остановка выполнения программы.
+-----------+-------------------------------+
| 4 бита | 28 бит |
| Opcode | Зарезервировано (игнорируется)|
+-----------+-------------------------------+
Инициализация сигналов и тестирование:
- Проверка модуля памяти (
Memory). - Тестирование кодирования и декодирования инструкций.
- Запуск симуляции процессора.
Модуль Memory реализует функциональность работы с памятью:
- Поддержка блокирующего вызова
b_transport. - Два сокета:
- Для взаимодействия с симулятором (
Processor). - Для взаимодействия с тестовым блоком (
TestBench).
- Для взаимодействия с симулятором (
Реализация симулятора процессора:
- Поддержка инструкций и работы с памятью.
- Порты:
clk: Входной сигнал тактовой частоты.start_signal: Сигнал начала работы.reset_signal: Сигнал сброса.start_address: Адрес начала программы.
- Сокет
mem_socketдля работы с памятью. - Регистры:
REG_COUNT = 4, доступ через векторregisters. - Счётчик команд: Хранит адрес текущей инструкции (
pc).
Модуль тестирования:
- Подача сигналов: сброс, запуск, адрес начала программы.
- Тесты:
test_memory(): Проверка памяти.test_encoder(),test_decoder(): Проверка кодирования и декодирования инструкций.
- Сокет
mem_socketдля записи программы и данных в память. - Порты:
- Выходные:
start_signal,reset_signal,start_address. - Входной:
clk.
- Выходные:
Содержит:
- Подключение библиотек.
- Константы:
MAX_MEMORY_SIZE = 1024: Объём памяти.REG_COUNT = 4: Количество регистров.REG_WIDTH = 4: Биты для кодирования номера регистра.ADDR_WIDTH = 16: Биты для адресации.DATA_WIDTH = 32: Длина инструкции.INSTRUCTION_WIDTH = 4: Биты для кода операции.DATA_LOCATION_IN_MEMORY = 0x100: Адрес секции данных.
- Объявления типов.