
Emulatore PDP-11/34 a livello di circuito
ll/34 è un emulatore a livello di circuito per il PDP-11/34A (1976), che esegue una CPU virtuale ricostruita a ritroso dagli schemi elettrici, dal microcodice e dalle acquisizioni logiche di un PDP-11/34A reale.
È stato originariamente progettato come replica digitale della CPU reale per assistere nella risoluzione dei problemi a livello di segnale. Il livello di circuito (tabelle di verità delle ROM + logica combinatoria) è stato scelto rispetto al livello di gate (Verilog) perché è sufficientemente a basso livello da riprodurre i bug hardware, ma abbastanza veloce da eseguire programmi.
L'albero dei sorgenti è organizzato come segue:
| Directory | Descrizione |
|---|---|
pdp11/ | La macchina: CPU, UNIBUS, periferiche, ROM di boot, modello della console programmatore, sonda del logic analyzer. machine.c la assembla ed esegue. |
frontends/ | Interfacce utente: cli/ (terminale), wasm/ (GUI nel browser), tty/ (lato host della linea seriale). |
demos/ | Immagini disco e programmi. |
docs/ | Documentazione DEC. |
La CPU virtuale (pdp11/kd11ea/) replica il generatore di clock, le porte logiche e l'ALU (simulati in logica C), avanzando attraverso il microcodice originale estratto dalle ROM.
È composta dai seguenti componenti:
| File | Descrizione |
|---|---|
roms/ | Dump delle ROM (combinatorie e microcodice). |
kd11ea.c | Nucleo della CPU. Avanza attraverso il microcodice una micro-parola per ciclo. Le porte 74xx e le ALU a fette di bit 74S181 sono modellate qui. |
rom_wiring.h | Cablaggio degli indirizzi e decodifica delle uscite per le ROM combinatorie. |
ucode_rom.h | Documenta e assembla il microcodice della CPU in micro-parole da 512×48 bit. |
clockgen.c | Generatore di clock. Modella la linea di ritardo originale che scandisce la CPU. |
mmu.c | Gestione della memoria. Spazi di indirizzamento kernel/user e traduzione della memoria da 16 a 18 bit. |
int.c | Arbitro degli interrupt. Implementa la coda di priorità e approssima l'ordine di concessione della daisy-chain dell'UNIBUS. |
clock.c | Clock interno dell'emulatore. Mantiene il tempo simulato sincronizzato con il tempo reale. |
I seguenti dispositivi sono stati implementati. Poiché l'Unibus è asincrono, non tutti i dispositivi devono essere accurati in termini di temporizzazione o di segnale.
La Programmer Console, in particolare, utilizza un'emulazione ad alto livello del suo comportamento anziché una ricostruzione a basso livello dell'Intel 8008 e del cablaggio della sua scheda.
I dispositivi sono inseriti nel backplane UNIBUS (unibus.c), che esegue la decodifica degli indirizzi, la temporizzazione e i cicli di bus.
La Programmer Console emula gli interruttori e gli indicatori del pannello frontale del PDP-11/34A. Consente di inizializzare il bus, avviare la CPU, eseguire il codice passo-passo, esaminare e depositare dati a indirizzi arbitrari e uscire dall'emulatore.
La console viene generata automaticamente ogni volta che la CPU viene arrestata (accensione, istruzione HALT o Ctrl-P).
Il frontend è disaccoppiato dal motore, quindi è disponibile anche una GUI fotorealistica del pannello frontale in WebAssembly.
La Debug Console fornisce un debugger interattivo sia per il codice a livello di microcodice che a livello di istruzioni:
s [n]: esegue passo-passo n micro-istruzioni con dump completo dello stato (MPC, ALU, bus, registri)b addr: imposta un breakpoint sul PC (ottale), bl per elencarli, bd n per eliminarlig: riprende l'esecuzioneu [addr] [n]: disassembla le istruzionic [addr] [n]: dump della memoria (ottale)mmu: mostra lo stato della MMU (PAR/PDR kernel + user, modalità corrente evidenziata)r: dump dei registri
Debug console nella GUI Web Assembly.
La risoluzione dei problemi di ll-34 durante il suo sviluppo si è rivelata così simile alla risoluzione dei problemi dell'hardware reale che è stato implementato un logic analyzer interno per tracciare i segnali e sondare il datapath. Questo si è rivelato determinante per individuare sottili bug di ROM e di temporizzazione nella CPU virtuale.
Il logic analyzer consente di sondare 107 segnali, inclusi 72 dagli schemi DEC, 31 segnali compositi (registri, bus e flag) e 4 valori di temporizzazione dall'emulatore. Le versioni future consentiranno la cattura della maggior parte dei segnali dagli schemi.
La frequenza di campionamento è il clock della CPU in tempo reale (5.555.556 Hz) con una risoluzione di 180 ns per campione. Un divisore configurabile riduce la frequenza di campionamento per finestre di cattura più lunghe.
Le catture utilizzano un ring buffer (fino a 64K campioni) con trigger configurabile su qualsiasi segnale, posizione del trigger regolabile (rapporto pre/post) ed esportazione CSV per l'analisi offline.
Il logic analyzer di ll-34 (in basso) può essere utilizzato per risolvere i problemi dell'hardware reale (in alto), proprio come l'hardware reale è stato utilizzato per risolvere i problemi di ll-34.
ll-34 viene fornito con alcuni programmi e sistemi da provare: un Game of Life, V6 UNIX, RT-11 V4 con il gioco originale Tetris e ATTN/11, un piccolo Transformer addestrabile con self-attention.
./ll-34 --rk ./demos/rtv4_rk.dsk