Микроархитектурный симулятор мощности (карты) для Cortex-M3
Обзор
Fast Cortex-M3-симулятор, который создает следы питания. Более подробную информацию можно найти в https://eprint.iacr.org/2017/1253.pdf
- Написано в C ++ для скорости
- Читает и моделирует файл .bin, созданный из источника сборки/C с помощью инструментов GNU Arm
Поддерживаются только инструкции, обычно встречающиеся в кодировании крипто -примитивов. Неподдерживаемые инструкции могут быть добавлены в cpu.cpp.
Компиляция
- Компиляционный симулятор: симулятор (включая) основная функция хранится в статической библиотеке.
- CD Libsim/Build
- делать
- сделать установку
- Составьте прошивку реализации. В качестве примера мы используем sec_add_v05:
- CD SEC_ADD_V05/FW/BUILD
- делать
- Скомпилируйте симулятор реализации (все еще используя sec_add_v05 в качестве примера):
- CD SEC_ADD_V05/SIM/BUILD
- делать
Используя симулятор
Симулятор читает файл .bin, который должен быть расположен в текущем каталоге. Имя файла .bin зависит от того, что было указано в источниках симулятора.
Предполагается, что симулятор используется при разработке прошивки, поэтому обычный способ запуска симуляции - это
- Изменить каталог на каталог прошивки: CD SEC_ADD_V05/FW/BUILD
- Запустите симулятор: ../../sim/build/sim_sec_add_v05 -n 1000
Опция «-h» показывает действительные параметры и параметры.
Кодирование новой реализации FW
Реализация FW является просто функцией C (возможно, содержащей код сборки), следуя ARM ABI (1 -й параметр в R0 и т. Д.) Нет основной функции. Все функции C и предварительные процессоры могут быть использованы.
Прошивка может быть скомпилирована любым компилятором ARM, поддерживающим Cortex-M3. Только ARM GCC был протестирован. Путь к исполнению компилятора ARM может быть изменен в Scripts/FW.MAK путем изменения переменной «DIR».
Кодирование нового симулятора
Лучше всего начать и изменить уже существующий симулятор. Симулятор должен содержать 3 функции:
- void check_sec_algo (void): эта функция применяет некоторые тестовые векторы и отпечатки.
- void t_test_sec_algo (параметры и параметры): эта функция запускает T_TEST, генерируя входы и сбора трассов
- обертка для вызова функции FW (которая будет смоделирована). Эта обертка (чья подпись зависит от функции FW) должна записать аргументы в памяти симулятора и соответствующим образом установить регистры процессора. Затем он запускает симуляцию. После моделирования он должен скопировать результаты из моделируемой памяти.
Поддержка больше инструкций ARM V7-M
Следуйте этим шагам, чтобы поддержать инструкцию в симуляторе:
- Добавить значения декодирования и маски в файл libsim/src/opcodes.h
- Декодировать инструкцию в функции step () в libsim/src/cpu.cpp
- Добавьте выполнение функции в том же файле
- Не забудьте добавить эту новую функцию в список методов в процессоре.
Macros test_ins32 и test_ins16 также упрощают декодирование инструкции, не забудьте проверить поведение новой моделируемой инструкции, особенно поведение регистров трубопровода reg_a и reg_b!
Валидации
Каждая инструкция, поддерживаемая симулятором, должна быть подтверждена в соответствии с моделированием RTL. RTL дерево не хранится в этом хранилище, потому что оно принадлежит Arm Limited. Большая часть процедуры, описанной ниже, только для моей собственной документации.
- Добавить новую инструкцию в файловый эксперимент .c в дерево симулятора
- Execute make check> sim_trace.log 2> & 1 в направлении сборки FW в дереве симулятора
- Добавьте новую инструкцию в утечку файла .c в дереве RTL
- Компиляция: Сделать тестовое код testName = утечка
- Симулировать: выполнить run testname = утечка
- Преобразовать файл трассировки TARMAC.LOG в файл трассировки регистра: ../../../../../Bython/GEN_TRACE.PY> VERILOG_TRACE.LOG
- Скопируйте файл трассировки регистра в дереве симулятора: CP ~/documents/repos/maps/rendered/sse050/logical/testbench/execution_tb/verilog_trace.log.
- Сравните трассировку симулятора и трассировку RTL. Либо визуально, используя gvim -d sim_trace.log verilog_trace.log, либо используя: ./../../python/compare_traces.py
Ошибки/ограничения
Знают ограничения:
- Трубопровод для инструкций LDRB/Strb более сложный, чем то, что реализовано в симуляторе. Например, для следующего кода:
ldrb r2, [r0]
strb r2, [r0]
REG_A и REG_B не будут правильно смоделироваться симулятором. Функциональность все еще верна, хотя. Когда другая инструкция вставлена между LDRB и инструкциями STRB, моделирование верно.