Mikroarchitektur-Leistungssimulator (Karten) für Cortex-M3
Überblick
Schneller Cortex-M3-Simulator, der Leistungsspuren erzeugt. Weitere Informationen finden Sie in https://eprint.iacr.org/2017/1253.pdf
- geschrieben in C ++ für Geschwindigkeit
- liest und simuliert eine .bin -Datei, die aus einer Baugruppe/C -Quelle mit GNU Arm Toolchain erstellt wurde
Es werden nur Anweisungen unterstützt, die typischerweise bei der Kodierung von Krypto -Primitiven zu finden sind. Nicht unterstützte Anweisungen können in CPU.CPP hinzugefügt werden.
Kompilieren
- Kompiliersimulator: Der Simulator (einschließlich) der Hauptfunktion wird in einer statischen Bibliothek gespeichert.
- CD libsim/Build
- machen
- Installation machen
- Kompilieren Sie eine Implementierungsfirmware. Wir verwenden sec_add_v05 als Beispiel:
- CD SEC_ADD_V05/FW/Build
- machen
- Kompilieren Sie einen Implementierungssimulator (immer noch als Beispiel mit sec_add_v05):
- CD Sec_add_v05/Sim/Build
- machen
Verwenden des Simulators
Der Simulator liest eine .bin -Datei, die sich im aktuellen Verzeichnis befinden muss. Der Name der .bin -Datei hängt von dem ab, was in den Simulatorquellen angegeben wurde.
Der Simulator soll bei der Entwicklung der Firmware verwendet werden
- Wechseln Sie das Verzeichnis in das Firmware -Verzeichnis: CD Sec_add_v05/FW/Build
- Führen Sie den Simulator aus: ../../sim/build/sim_sec_add_v05 -n 1000
Die Option '-h' zeigt die gültigen Optionen und Parameter an.
Codierung einer neuen FW -Implementierung
Eine FW -Implementierung ist einfach eine C -Funktion (möglicherweise mit Montagecode), die dem Arm ABI (1. Parameter in R0 usw.) entspricht. Es gibt keine Hauptfunktion. Alle C- und Vorverarbeitungsfunktionen können verwendet werden.
Die Firmware kann von jedem ARM-Compiler zusammengestellt werden, der den Cortex-M3 unterstützt. Es wurde nur Arm GCC getestet. Der Pfad zum ausführbaren ARM -Compiler kann in Skripten/fw.mak geändert werden, indem die Variable "Dir" geändert wird.
Codieren eines neuen Simulators
Es ist am besten, einen bereits vorliegenden Simulator zu starten und zu ändern. Der Simulator muss 3 Funktionen enthalten:
- void check_sec_algo (void): Diese Funktion wendet einige Testvektoren und Drucke an, wenn der Test besteht oder nicht.
- void t_test_sec_algo (Optionen und Optionen): Diese Funktion führt den T_test aus, indem es Eingänge generiert und Spuren sammelt
- Ein Wrapper zum Aufrufen der FW -Funktion (die simuliert wird). Diese Wrapper (deren Signatur von der FW -Funktion abhängt) muss die Argumente in den Simulator -Speicher schreiben und die Prozessorregister entsprechend festlegen. Dann startet es die Simulation. Nach der Simulation muss die Ergebnisse aus dem simulierten Speicher kopieren.
Unterstützung mehr Arm V7-m Anweisungen
Befolgen Sie diese Schritte, um eine Anweisung im Simulator zu unterstützen:
- Fügen Sie die Dekodierungs- und Mask -Werte in der Datei LIBSIM/SRC/Opcodes.h hinzu
- Dekodieren Sie den Befehl im Funktionsschritt () in libsim/src/cpu.cpp
- Fügen Sie die Ausführung der Funktion in derselben Datei hinzu
- Vergessen Sie nicht, diese neue Funktion der Liste der Methoden in CPU.H hinzuzufügen
Die Macros test_ins32 und test_ins16 vereinfachen auch die Dekodierung der Anweisung. Vergessen Sie nicht, das Verhalten der neuen simulierten Anweisung zu validieren, insbesondere das Verhalten der Pipeline Register Reg_A und Reg_B!
Validierungen
Jede vom Simulator unterstützte Anweisung muss gegen die RTL -Simulation validiert werden. Der RTL -Baum wird in diesem Repository nicht gespeichert, da er zu Arm Limited gehört. Der größte Teil des unten beschriebenen Verfahrens ist nur für meine eigene Dokumentation vorhanden.
- Fügen Sie die neue Anweisung im Dateiexperiment.c im Simulatorbaum hinzu
- Führen Sie aus
- Fügen Sie die neue Anweisung in der Datei leckage.c im RTL -Baum hinzu
- Kompilieren: Testcode testName = Leckage machen
- Simulieren: Run testName = Leckage machen
- Konvertieren Sie die Trace -Datei von Asparcac.log in eine Register -Trace -Datei: ../../../..//python/gen_trace.py> verilog_trace.log
- Kopieren Sie die Register -Trace -Datei im Simulator -Baum: cp ~/documents/repos/maps/rendered/sse050/logical/testBench/execution_tb/verilog_trace.log.
- Vergleichen Sie die Simulator -Trace und die RTL -Spur. Entweder visuell mit GVIM -d SIM_TRACE.LOG Verilog_trace.log oder mit: ./../../python/compare_traces.py
Fehler/Einschränkungen
Die Beschränkungen sind:
- Die Pipeline für LDRB/Strb -Anweisungen ist komplexer als im Simulator implementiert. Zum Beispiel für den folgenden Code:
ldrb r2, [r0]
strb r2, [r0]
Reg_a und reg_b werden vom Simulator nicht korrekt simuliert. Die Funktionalität ist jedoch noch korrekt. Wenn eine andere Anweisung zwischen dem LDRB- und den STRB -Anweisungen eingefügt wird, ist die Simulation korrekt.