Hallo Besucher, der Thread wurde 1,3k mal aufgerufen und enthält 10 Antworten

letzter Beitrag von androSID am

Kleiner Layoutfehler im 8500R4/8501R4 - ohne Auswirkung

  • Heute ist mir ein "Flaw" im Layout des 8500+8501 aufgefallen! Aber erstmal vorweg: In den NMOS Chips werden - um z.B. ein NAND zu bauen -

    drei FETs benötigt: Ein FET auf der High-Side als Pull-Up und dann je nach Anzahl Eingänge FETs um den Ausgang nach GND zu ziehen:



    Im 6502 Core sind von diesem jede Menge vorhanden; einer davon hier:



    Und bei genau diesem einen speziellen NAND wurden wohl beim Übergang zu HMOS (also beim 8500+8501) beim Pull-Up aus

    meiner Sicht ein "kleines Böckchen" geschossen:


    Es wurde versehentlich das Gate des T1 nicht an Source, sondern an Drain (VCC) angeschlossen:


    - Zum Vergleich 6509 ohne Fehler:


    Da dies bei mehreren Tausend solcher Pull-Ups das einzige ist, das auf diese Art beschaltet wurde, gehe ich von einem

    Layoutfehler aus.


    Was bedeutet dies konkret? Nicht viel: Auf Grund der Größe dieses FETs funktioniert er (offensichtlich!) trotzdem

    noch als Pull-Up. Tatsache ist. Das diese Schaltungsvariante auch eine zeitlang üblich war. Von daher hat dies

    im ersten Moment KEINEN Einfluss auf die Funktionalität - ist aber auf jeden Fall ungewöhnlich.


    PS: Im 6502 und 6509 ist dieser Pull-Up "richtig"

  • Wie hast du den "Fehler" gefunden? Etwa durch manuelle Suche?


    Ich gehe mal davon aus, dass du eine SW zur Analyse bzw. Erkennen der

    Transistoren verwendest und die dir dann den Fehler meldet.

    Manuelle Suche bzw. ich habe die aus dem vektorisierten Bild generierte

    Netzliste debugged und festgestellt, das dieser Knoten sich nicht korrekt

    verhält. Nachdem ich meinem Generator "beigebracht" habe, auch solche

    FETs als Pull-Up zu behandeln, funktionierte dann auch

    meine Simulation des Chips einwandfrei. :)

  • Mit ReverseEngineering auf Chipebene bin ich so gut wie nicht vertraut:

    - Du hast also eine SW, die dir die einzelnen Layer in Vektor-Format umwandelt.

    Davon gibt's ja für viele Einsatzbereiche entsprechende SW.

    - Die Vektor-Beschreibung muss aber dann in eine Netzliste umgewandelt werden.

    Hast du die SW dazu selbstgeschrieben?

    - Und zum Schluss: hast du auch eine SW, die die Netzliste in HDL umwandelt.

    (ich hatte mal vor Jahren einen Blog gelesen, in den der 6502 per

    Graphenisomorphismen in HDL umgewandelt wurde. Das Ergebnis lässt sich

    ohne Probleme auf einem FPGA zum laufen bringen. Ich hab's auch mal versucht,

    aber leider nicht alle Latches erkannt :((( )

  • Das umwandeln der Chipbilder in ein Vektorbild mache ich derzeit manuell... die mir

    bekannten Versuche dies zu automatisieren waren nicht erfolgreich; daher habe ich hier keine

    Anstrengung unternommen.


    Aus diesem vektorisierten Bild (SVG) generiert meine SW (ja; selbst programmiert) dann weitere

    Layer mit den Channels (Gates) der FETs und den Drain+Source Diffusionsbereichen.

    Daraus kann die SW dann eine einfache(!) Transistor-Netzliste (ähnlich SPICE3 Format) generieren

    und die Symbolnamen der Knoten auswerfen.


    Diese Netzliste wird von meinem Simulator (weitere SW) eingelesen und dann eben mit einem

    künstlichen Clock angesteuert. Die Signale der Pads werden einzelnen Knoten zugeordnet und ich

    kann einen simulierten RAM/ROM dran hängen und das Teil booten.


    Die Umwandlung nach HDL ist der nächste Schritt... wobei ich hier eher eine simulierbare

    Version anstrebe, gegen die ich dann eine "saubere" Implementierung

    (ohne Latches/Transmission Gates) verifizieren kann.


    Das ganze ist aber WIP... wie Details aussehen weiß ich dann auch noch nicht so genau.

  • Das mit der manuellen Umwandlung in ein Vektorformat habe ich mir fast

    schon gedacht, ist wohl vergleichbar kompliziert wie OCR etc.


    Die HDL-Umwandlung habe ich auch mal versucht, aber wie gesagt, leider

    an komplizierteren Konstrukten wie Latches schon gescheitert. Hab aber

    auch nicht viel Zeit investieren können.


    Kennst du Seiten wie diese hier? Da gibt's neben kompilerbarer C++-SW

    auch fertige HDL-Beschreibungen. Eben diese habe ich mal in einem VC-20

    eingesetzt, funktioniert perfekt. (und btw.: eine TIA-Beschreibung existiert

    ebenfalls, d.h. ein 2600er kann damit perfekt nachgebildet werden. Auf

    Visual6502 lässt sich auch die ARM1-Netzliste auslesen und umwandeln,)

  • Kennst du Seiten wie diese hier? Da gibt's neben kompilerbarer C++-SW

    auch fertige HDL-Beschreibungen. Eben diese habe ich mal in einem VC-20

    eingesetzt, funktioniert perfekt. (und btw.: eine TIA-Beschreibung existiert

    ebenfalls, d.h. ein 2600er kann damit perfekt nachgebildet werden. Auf

    Visual6502 lässt sich auch die ARM1-Netzliste auslesen und umwandeln,)

    Ja... die CPU bzw. den Code von Holme kenne ich und die SW habe ich mir mal angesehen. :)

    Man merkt Ihr deutlich an, da sie eher von einem Hardwerker gezimmert wurde. :weg:

    (Aber immerhin ein schöner PoC! Alle mir bekannten Studien zu HDL Konvertern

    basieren auf mehr oder weniger modifizierten Algorithmen zur Erkennung von

    Subgraphisomorphismus und einem entsprechend angepassten Graphen).

    Werde ich auch so zu lösen versuchen...


    Beim Simulator habe ich versucht den gleichen Graph hierfür zu nehmen; allerdings

    hat dies leichte Performance einbußen gegenüber einem minimalen Netzgraphen.

    Eventuell werfe ich das also wieder über Bord -> Für jeden Zweck nur den richtigen Graph.

    Ist - wie gesagt - WIP. Und da jetzt der Generator läuft, kann ich mich verstärkt um

    den Simulator kümmern - es gibt noch soooo viel zu tun.


    Vom TIA habe ich nur Screenshots und den Schaltplan gesehen... aber keine Netzliste.


    Der ARM steht nicht in meinem Fokus; sondern eher weitere Chips der MOS65 Familie.

  • (zu TIA: schau mal hier nach, aber kleine Warnung: ist wegen Python extrem

    langsam EDIT: PIA ist leider nur SW, ist aber auch kein für eine exakte Simulation

    so wichtiger Chip)


    zu Subgraphisomorphismus: ich selber hab's einfach per Graphensuche gemacht.

    Dazu muss man nur die Netzlistenelemente und ihre Verbindungen untersuchen

    und die Gleichungen aufstellen (NOT, NOR, NAND etc.). Hat aber den Nachteil,

    dass z.B. Latches im Meer von Gleichungen untergehen und dir dein Compiler

    eine "Latch-Warnung" ausspuckt. Was aber kein Problem ist, du willst ja Latches

    haben. Allerdings wären explizite Latches mit entsprechender HDL-Zuordnung

    besser.

    Und genau hier ist z.B. ein Isomorphismen-Ansatz besser: du gibst "bequem" alle

    Typen als Beschreibung vor, und falls dein Algorithmus einen Transistor nicht

    zuordnen kann (lässt sich ja leicht ermitteln), dann lässt sich lokal manuell der

    neue Typ ermitteln, zum Algorithmus hinzufügen und die Suche beginnt von

    vorne. Wenn du also etwas Stabiles, Erweiterbares suchst, wird das wohl die

    beste Wahl sein.

  • Ja... das ist mein Ansatz. Und bei der doch im Vergleich zu heutigen Chips überschaubaren

    Anzahl Transistoren dürfte es kein Problem sein, hier einen unmodifizierten Algorithmus

    zu verwenden. Die meisten der mir vorliegenden Studien beschreiben nur modifikationen

    hiervon um mit den Milliarden an Transistoren schneller zu werden.


    Leider habe ich noch keine schöne Lösung für die Transmission-Gates gefunden, die

    im 6502 bidirektional arbeiten. In der Simu sind die kein Problem... aber für die Synthese

    eben ein Problem.


    Danke für den Link... das Teil hatte ich ganz vergessen. ^^:thumbsup:

  • Leider habe ich noch keine schöne Lösung für die Transmission-Gates gefunden

    Von der Existenz dieser Gates weiss ich schon aus Beschreibungen wie dem

    Blockdiagramm (Link?, habe ich gereade nicht), wo diese aber z.B. im Visual6502

    sind???? Falls du das weisst: kannst du vlt. ein Bildschirmfoto machen? Oder

    aber im zugehörigen Python-Skript?


  • Schau Dir z.B. mal Node140 im Visual6502 an... der steuert 8 Passgates an.

    In den Skripten sind das ganz normale FETs. Der "Trick" ist die Auswertung:

    Je nachdem welche Seite des FETs (d.h. welcher Bus) aktiv getrieben wird, der gewinnt

    und setzt damit auch die andere Seite.

    Außer wenn beide Seiten aktiv getrieben werden. Dann ist es allg. eine

    AND Verknüpfung, die stattfindet zw. den Bussen.

    Und bei manchen illegalen Opcodes werden mehrere Ausgänge auf einen

    der Busse gelegt... da hängt es eben davon ab, was vorher im Register stand.