Skip to content

tailname/simpulator

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

25 Commits
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

О проекте

Это симулятор процессора с архитектурой 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/lib

или docker

docker build . --no-cache -t simpulator
docker run -it simpulator ./simulation

Тестовая программа

По умолчанию тестовая программа вычисляет последовательность Фибоначчи. Для проверки корректности работы при выполнении инструкции STORE выводится содержимое всех регистров в консоль.

Возможные модификации:

  • Функция print_registers(): Изменение формата вывода регистров.
  • Функция execute(): Изменение типа инструкции, при выполнении которой выводится информация о регистрах.
  • Функция store_program() в TestBench: Изменение кода тестовой программы (по умолчанию вычисляется последовательность Фибоначчи).

Загрузка собственной программы

Для загрузки своей программы:

  1. Отредактируйте функцию store_program() в файле TestBench.cpp.
  2. Укажите последовательность инструкций в формате, соответствующем архитектуре процессора.
  3. Убедитесь, что адреса памяти и регистров корректны.

Формат инструкций

Каждая инструкция имеет длину 32 бита. Первые INSTRUCTION_WIDTH = 4 бита кодируют код операции (opcode). Далее структура зависит от типа инструкции.

Инструкция ADD

Сложение значений двух регистров с записью результата в регистр назначения.

+-----------+-------------+-------------+-------------+------------------+
| 4 бита    | 4 бита      | 4 бита      | 4 бита      | 16 бит           |
| Opcode    | R_dest      | R_src1      | R_src2      | Зарезервировано  |
+-----------+-------------+-------------+-------------+------------------+
  • R_dest: Регистр назначения (REG_WIDTH = 4 бита).
  • R_src1, R_src2: Регистры-источники (REG_WIDTH = 4 бита каждый).

Инструкция LOAD

Загрузка данных из памяти в регистр.

+-----------+-------------+----------------------+-------------+
| 4 бита    | 4 бита      | 16 бит               | 8 бит       |
| Opcode    | R_dest      | Адрес источника      | Зарезервировано |
+-----------+-------------+----------------------+-------------+
  • R_dest: Регистр назначения (REG_WIDTH = 4 бита).
  • Адрес источника: Адрес в памяти (ADDR_WIDTH = 16 бит).

Инструкция STORE

Сохранение данных из регистра в память.

+-----------+----------------------+-------------+-------------+
| 4 бита    | 16 бит               | 4 бита      | 8 бит       |
| Opcode    | Адрес назначения     | R_src       | Зарезервировано |
+-----------+----------------------+-------------+-------------+
  • Адрес назначения: Адрес в памяти (ADDR_WIDTH = 16 бит).
  • R_src: Регистр-источник (REG_WIDTH = 4 бита).

Инструкция HALT

Остановка выполнения программы.

+-----------+-------------------------------+
| 4 бита    | 28 бит                        |
| Opcode    | Зарезервировано (игнорируется)|
+-----------+-------------------------------+

Архитектура проекта

main.cpp

Инициализация сигналов и тестирование:

  • Проверка модуля памяти (Memory).
  • Тестирование кодирования и декодирования инструкций.
  • Запуск симуляции процессора.

memory.cpp

Модуль Memory реализует функциональность работы с памятью:

  • Поддержка блокирующего вызова b_transport.
  • Два сокета:
    • Для взаимодействия с симулятором (Processor).
    • Для взаимодействия с тестовым блоком (TestBench).

processor.cpp

Реализация симулятора процессора:

  • Поддержка инструкций и работы с памятью.
  • Порты:
    • clk: Входной сигнал тактовой частоты.
    • start_signal: Сигнал начала работы.
    • reset_signal: Сигнал сброса.
    • start_address: Адрес начала программы.
  • Сокет mem_socket для работы с памятью.
  • Регистры: REG_COUNT = 4, доступ через вектор registers.
  • Счётчик команд: Хранит адрес текущей инструкции (pc).

TestBench.cpp

Модуль тестирования:

  • Подача сигналов: сброс, запуск, адрес начала программы.
  • Тесты:
    • test_memory(): Проверка памяти.
    • test_encoder(), test_decoder(): Проверка кодирования и декодирования инструкций.
  • Сокет mem_socket для записи программы и данных в память.
  • Порты:
    • Выходные: start_signal, reset_signal, start_address.
    • Входной: clk.

common.h

Содержит:

  • Подключение библиотек.
  • Константы:
    • MAX_MEMORY_SIZE = 1024: Объём памяти.
    • REG_COUNT = 4: Количество регистров.
    • REG_WIDTH = 4: Биты для кодирования номера регистра.
    • ADDR_WIDTH = 16: Биты для адресации.
    • DATA_WIDTH = 32: Длина инструкции.
    • INSTRUCTION_WIDTH = 4: Биты для кода операции.
    • DATA_LOCATION_IN_MEMORY = 0x100: Адрес секции данных.
  • Объявления типов.

About

A simple processor simulator on SystemC

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors