Re: Virtueller Hive
Verfasst: Fr 16. Jun 2023, 23:33
Wenn du am Projekt nicht mehr weiterabeitest, könntest du evtl. die Quellen posten?
Retro Style Eigenbau Computer mit Parallax Propeller
https://hive-project.de/board/
Willst du dir das wirklich antun?Wuerfel_21 hat geschrieben: ↑Fr 16. Jun 2023, 23:33 Wenn du am Projekt nicht mehr weiterabeitest, könntest du evtl. die Quellen posten?
Besser mal gepostet als wenn die ganze Arbeit irgendwo in einem Festplattencrash verloren geht.
Die verilated.h könnte erzeugt werden, wenn man den Verilator Build Prozess anstößt (propellersim/propeller-verilator/verilog/build.sh), den hatte ich nicht integriert. Bei mir ging das aber jetzt aber nicht mehr. Ist aber vmtl nur eine kleine Anpassung. Der Verilator P1 hatte ich nur mal ganz am Anfang und als Kontrolle ob alles richtig läuft. Er ist allerdings sehr langsam, und lässt auch keine Savestates zu, was mich fast noch mehr als die geringe Geschwindigkeit genervt hat.
Du meinst den Code Generator dazu? Ich sehe gerade, die waren in separaten Unterordnern. Ich habe sie mal angefügt. Es scheint wohl zwei zu geben, propeller-clone-translator und propeller-jvm-backend, bin mir leider nicht mehr sicher was neuer war. Aber ich glaube das wurde auch als Kommentar in manche Header/Asm Dateien gespeichert. Die Generatoren sind in Kotlin geschrieben.
Yupp, bei mir ~ 3.5 MHz in Turbulence.
Code: Alles auswählen
cogClk7_4SUUUT:
.sect0:
;let outp_cog_alu_r 0I0
mov ecx, 0x0 <-- Sollte xor ecx,ecx sein
;preload p_reg
mov eax, dword [rsi+cog_p_reg]
;let instr_dst p_reg
mov edx, eax
;if (neq32 (and32 p_reg 0I1f0) 0I1f0)
and eax, 0x1f0
cmp eax, 0x1f0
jz .sect2
.sect1:
;let outp_cog_alu_r bus_q_reg
mov ecx, dword [rdi+hub_bus_q_reg] <-- Könnte CMOV sein, nicht sicher ob das hier hilft.
.sect2:
;Call Macro macroCogState4ZF1
;Inputs: [rdx: instr_dst, r8: outp_cog_alu_r]
;Modified: [rdx, r8]
mov r8d, ecx
call macroCogState4ZF1 <--- Sollte tail-call sein
ret
Die undokumentierten Seltsamkeiten werden meines Wissens nach nicht absichtlich ausgenutzt und sind IIRC sowieso im Verilog-Modell nicht ganz akkurat, soweit ich weiß ist das Modell nicht die direkte Quelle für das tatsächliche Chiplayout, das wurde manuell aufgebaut. Im tatsächlichen Chip hängt die undokumentierte WRxxxx Z-flagge davon ab, in welchem physischen RAM-Block die Cogs arbeiten.thiloa hat geschrieben: ↑Mi 21. Jun 2023, 00:14 Wenn man die undefinierten Befehle im Cog mal außen vor lässt, dann müsste man noch ein wenig von dem Hub Memory Zugriff wegoptimieren können. Derzeit wird der ja quasi immer noch virtuell nachgebaut. Leider haben einige der undefinierten Befehle seltsame Eigenschaften, die von Hub Aktionen der Nachbarcogs beeinflusst werden.
Da der Code von Parallax so kryptisch in Verilog aussah und vor allem sehr "Gate Nah", dachte ich, das zumindest Teile der Hardware darauf aufbauen (abseits von dem analogen Kram). Es sind m.E. nicht nur die Flags. Bei den unbenutzen Befehlen konnte man meines Wissens nach ohne Warten vom Hub lesen. Natürlich nicht die eigens angefragten Daten, sondern dann ggf. welche vom Nachbarcog. Wenn du meinst, dass diese Befehle de facto nie in realer Software benutzt werden, kann man das natürlich für den eigenen Zweck optimal auslegen und bspw. ein NOP daraus machen. Ich hatte nur den 6510er im Hinterkopf wo die Leute alle möglichen undokumentierten Opcodes verwendet haben und relevante Simulatoren diese deshalb auch nachbauen ("müssen").Wuerfel_21 hat geschrieben: ↑Mi 21. Jun 2023, 01:03 Die undokumentierten Seltsamkeiten werden meines Wissens nach nicht absichtlich ausgenutzt und sind IIRC sowieso im Verilog-Modell nicht ganz akkurat, soweit ich weiß ist das Modell nicht die direkte Quelle für das tatsächliche Chiplayout, das wurde manuell aufgebaut. Im tatsächlichen Chip hängt die undokumentierte WRxxxx Z-flagge davon ab, in welchem physischen RAM-Block die Cogs arbeiten.
Das stimmt, mir war es damals vor allem die korrekte Ausführung wichtig und das ASM Backend ist halt komplett selbst geschrieben. Vorher hatte ich ja mit einer Lib vom GCC gearbeitet, dessen Code ist sicher besser, aber das hat jedes Mal über 100ms gestoppt, dieser "Schluckauf" beim Ändern eines Counter/Vid Registers war mir dann doch zu viel. Außerdem ist das Programm häufiger abgestürzt und ich konnte nie herausfinden, was die Ursache war.Wuerfel_21 hat geschrieben: ↑Mi 21. Jun 2023, 01:03 Yupp, bei mir ~ 3.5 MHz in Turbulence.
Den Generator sollte ich mir morgen mal ansehen. Der output scheint nicht 100% optimal zu sein. Hier ein Stückchen aus einer der Dateien:
Wenn sie benutzt werden, dann entweder in Code der nie publiziert wurde oder unabsichtlich. Das mit der Flagge war nur das wo ich genaueres weiß...thiloa hat geschrieben: ↑Mi 21. Jun 2023, 20:49 Da der Code von Parallax so kryptisch in Verilog aussah und vor allem sehr "Gate Nah", dachte ich, das zumindest Teile der Hardware darauf aufbauen (abseits von dem analogen Kram). Es sind m.E. nicht nur die Flags. Bei den unbenutzen Befehlen konnte man meines Wissens nach ohne Warten vom Hub lesen. Natürlich nicht die eigens angefragten Daten, sondern dann ggf. welche vom Nachbarcog. Wenn du meinst, dass diese Befehle de facto nie in realer Software benutzt werden, kann man das natürlich für den eigenen Zweck optimal auslegen und bspw. ein NOP daraus machen.
Joa. Wobei ich denke das große Gewinne vor allem in Code der fast immer läuft zu finden sind.thiloa hat geschrieben: ↑Mi 21. Jun 2023, 20:49 Abseits davon ist in dem Code der Zwischensprache noch ein wenig Ineffizienz was manche COG Operationen angeht, insbesondere die Flags und manche Subtraktionsaktionen sind ein wenig kreativ eingebaut. Damit kann daraus leicht Code für C generiert werden, wo man ja keinen Zugriff auf die Flags hat. Bei x86 Asm müsste aber zumindest das Zero Flag in vielen Operationen implizit anfallen. Das Carry Flag unterscheidet sich an manchen Stellen hingegen glaube ich etwas zwischen x86 und PASM.
Ja, normalerweise muss man IIRC nur RBX, RBP und R12 aufwärts wegstacken.
Jo, soweit war ich auch, aber hab es noch nicht gebaut bekommen. Noch nie was mit Kotlin am Hut gehabt.
GEAR ist halt wirklich extrem langsam, aber dein Projekt ist an den grenzen von sinnvoller Interaktivität. Ich finde das ist nicht zu unterschätzen.thiloa hat geschrieben: ↑Mi 21. Jun 2023, 20:49 Neben der P1 Implementierung wird auch etwas Zeit in der Simulation "drum herum" an der Pin Schnittstelle verschwendet. Auf die ursprünglich angedachten 80 MHz kommt man so aber vermutlich nicht, daher hatte ich das Projekt für mich als Hive Emulator schon gedanklich aufgegeben.
Ob abseits davon Interesse an so einem zyklengenauen Simulator in der doch recht überschaubaren Propellergemeinde besteht, weiß ich nicht. Ich meine etwas schneller und "genauer" als Gear ist es ja schon, der Code und das Userinterface sind halt so noch unbrauchbar für Dritte. Der P1 ist allerdings inzwischen auch ein wenig in die Jahre gekommen..