ll/34 是一款針對 PDP-11/34A(1976 年)的電路級模擬器,它運行一個虛擬 CPU,該 CPU 是從實際 PDP-11/34A 的電路圖、微碼和邏輯捕捉中逆向工程出來的。
它最初的設計目標是作為真實 CPU 的數位複製品,以協助進行訊號層級的故障排除。虛擬的 KD11-EA CPU 本質上是由電路圖的 C 語言翻譯以及 ROM 表格查找所組成。所有組合式 ROM 都經過逆向工程,並且時脈產生器也經過精確建模。
選擇電路級(ROM 真值表 + 組合邏輯)而非閘級(Verilog)是因為它足夠低階,能夠重現硬體錯誤,同時又足夠快速以執行程式。
所有裝置都連接到 UNIBUS 背板(unibus.c),該背板負責處理位址解碼、時序和匯流排週期。
內部,CPU 由以下元件組成:
模擬 PDP-11/34A 的前面板開關和指示燈。當 CPU 停止時(開機、HALT 指令或 Ctrl-P),此功能會啟用。
它允許初始化匯流排、啟動 CPU、單步執行程式碼、檢查和寫入任意位址的資料,以及退出模擬器。
前端與引擎是分離的,因此也提供了一個使用 WebAssembly 的擬真前面板 GUI。
除錯主控台為微碼級和指令級程式碼提供了一個互動式除錯器:
在 ll-34 開發過程中進行故障排除的經驗,與排除真實硬體故障的經驗非常相似,因此實現了一個內建的邏輯分析儀來追蹤訊號並探測資料路徑。這對於追蹤虛擬 CPU 中微妙的 ROM 和時序錯誤非常有幫助。它也可以作為參考,用於排除真實硬體的故障,就像可正常工作的硬體有助於開發模擬器一樣。
邏輯分析儀可以探測主要 CPU 訊號上的 102 個點,這些點對應於實際晶片的針腳(KD1:Exx:針腳標記符合 DEC 電路圖 K1-5 至 K2-9)。為了方便起見,還提供了邏輯別名(MPC、ALU_OUT、IR、PSW 等)。
取樣率為實際 CPU 時脈(5,555,556 Hz),每樣本解析度為 180 ns。可設定的除頻器可以降低取樣率,以獲得更長的擷取視窗。
擷取使用環形緩衝區(最多 64K 個樣本),可設定在任何訊號上觸發,可調整觸發位置(預/後比例),並支援 CSV 匯出以進行離線分析。
在專案中,邏輯擷取被廣泛用於映射和除錯理解不深的multiplexing路徑。
ll-34 附帶了一些程式和系統可供嘗試:生命遊戲、V6 UNIX、RT-11 V4 搭配原始的俄羅斯方塊遊戲,以及 ATTN/11,一個小型可訓練的 Transformer 模型,具備自我注意機制。
啟動 ROM 將自動從 RK11 加載並啟動作業系統。輸入 DIR 將列出檔案,HELP 將列出說明,RUN TETRIS 將啟動俄羅斯方塊演示(儘管 $TERM 可能會出錯?)。RUN ADVENT 將啟動基於真實 PDP-11/34 建構的 Colossal Cave Adventure。
啟動載入程式將顯示一個最小化的 @ 提示符。輸入 rkunix 並按 Enter,幾秒鐘後您應該會看到一個 login: 提示符。輸入使用者名稱 root,無需密碼即可登入!需要注意的是,在早期 UNIX 中,cd 命令被命名為 chdir。
需要 make 和一個 C11 編譯器,沒有其他依賴項。
已驗證在 Linux(x86_64 和 aarch64)上使用 musl 和 glibc,macOS aarch64,以及 NetBSD 10 aarch64 編譯時沒有警告。
除了 CLI 版本外,還有一個獨立的 WebAssembly 版本,提供擬真 GUI,網址為:https://dbrll.github.io/ll-34。
注意:ll-34 是一個資源密集型的模擬器。與指令級模擬器不同,它一次一個微碼週期進行模擬,並在每個步驟中運行 ALU、組合式 ROM、暫存器、時脈產生器和匯流排時序。主機必須持續維持 5.5 MHz 的時脈產生器節奏,才能保證週期精確性。
啟動時,模擬器會進行自我基準測試,並報告其速度相對於真實 KD11-EA 的比例。低於 1x 的比例表示主機無法跟上,計時精確性無法保證。基準測試在 WebAssembly 版本中不可用,因為瀏覽器計時器解析度使其不可靠。由於 WASM 版本比原生版本慢,在智慧型手機上運行通常會太慢。