In der prototypischen Implementierung werden nur neun Befehlsgruppen mit jeweils wenigen enthaltenen Instruktionen verwendet, so daß für eine spätere Fortführung des Entwurfs zu einem Mikrocontroller mit vollständigem Befehlssatz ausreichend Freiheitsgrade zur Verfügung stehen sollten. Zusätzlich wäre es möglich, anwendungsspezifische Befehle (beispielsweise einer Echtzeit-JVM) ebenfalls in Hardware anzulegen.
Dies gilt insbesondere, da rund 250 verschiedene Bytecode-Befehle existieren. Bei näherem Hinschauen stellt man jedoch fest, daß es sich bei kleinen Gruppen von Instruktionen häufig um Varianten eines Befehls mit unterschiedlichen Optionen bzw. variiertem Operanden handelt, die also mit einer einzigen, festverdrahteten Instruktion implementiert werden können. Bezieht man diese Tatsache in die Betrachtungen mit ein, so kommt man auf rund 100 Hardware-Befehle, die für die korrekte Interpretation von Java-Bytecode in einer Java Virtual Machine zur Verfügung gestellt werden müssen.
Von diesen tatsächlich in Hardware zu implementierenden Instruktionen sollen die in Tabelle 4.2 aufgeführten 26 Befehle im Prototypen verwirklicht werden, welche 53 Bytecodeinstruktionen entsprechen. Auch diese Umsetzung wird unter der Randbedingung vorgenommen, daß relativ wenig Platz auf dem FPGA zur Verfügung steht. Insofern wurde eine Priorisierung vorgenommen, damit die für die Ausführung eines Programms wichtigsten Befehle auch von Anfang an implementiert sind. Auf diese Weise wird zwar vorerst keine vollständige Kompatibilität des Prototypen mit "normalen" Java-Programmen erreicht, es ist damit aber eine Schnittstelle für Test-Programme verfügbar.
Die Kodierung der Befehle im Bytecode könnte grundsätzlich auch als Code für die Implementierung verwendet werden, allerdings wäre durch die Gruppenbildung bestimmter Befehle eine Überarbeitung notwendig.
In Tabelle 4.2 ist für jeden Opcode eine Priorität angegeben, mit der dieser Befehl im Prototypen implementiert werden soll. Die Kodierung wurde wie folgt vorgenommen (in absteigender Reihenfolge): von 5 (muß in jedem Falle implementiert sein) über 4, 3 und 2 bis 1 (sollte noch implementiert werden, falls alle anderen Befehle aus Tabelle 4.2 schon enthalten sind und es die Ressourcen erlauben).
Um die mikrocodierten Befehle umsetzen zu können, sind zusätzlich Befehle für Zugriffe auf die globalen (Hilfs-)Register GLOBAL0 und GLOBAL1 erforderlich. Diese sind in Tabelle 4.2 mit einem z als Priorität gekennzeichnet. Für eine weitere Vereinfachung der Tests werden ebenfalls die beiden Befehle zur direkten Veränderung des Befehlszeigers und des Zeigers über den obersten Eintrag auf dem Stack hinzugenommen.
Tabelle 4.3 enthält die Befehlsfolgen für die beiden mikrocodierten Befehle des Prototypen. Es handelt sich dabei um Array-Zugriffe im externen Speicher. Die benötigte Referenzadresse für den Anfang des Feldes und der Index für den zu bearbeitenden Eintrag müssen für eine korrekte Verarbeitung vorher auf den Stack geschrieben worden sein.
|