為科學計算機打造以 Nibble 為導向的 CPU

追求重現經典科學計算機的體驗,引領我們進入硬體設計與電腦架構之間一個迷人的交集。當目標是打造一台高精度十進位計算機時,傳統 CPU(如 Z80 或 6502)標準的以 Byte 為導向的架構,往往會成為阻礙而非助力。

這個由 gdevic 開發的專案,探索了回歸硬體底層來打造專門為十進位運算優化的 CPU 之想法。透過使用 Verilog 設計客製化 CPU,該專案展示了將硬體架構與資料表示法——特別是二進位編碼十進位 (BCD)——對齊,是透過客製化晶片實現高精度科學運算的最高效方式。

架構選擇:為什麼是 Nibbles?

這個專案的核心在於決定讓 CPU 成為「以 Nibble 為導向」。在標準電腦中,Byte(8 bits)是最小的可定址記憶體單位。然而,對於將數字儲存為 BCD 的科學計算機而言,每個十進位數字都由一個 4-bit nibble 表示。

如果使用標準的 8-bit CPU,處理器必須不斷進行位元移位 (bit-shifting) 與遮罩 (masking) 操作來分離單個數字。透過將 4-bit nibble 作為自然的資料寬度,並確保記憶體是 nibble-addressable,設計者消除了這種額外的開銷。硬體被建構來以十進位數字進行「思考」,使得 BCD 算術的實作變得更加流暢。

客製化 CPU 的技術規格

該系統建立在 Harvard 架構之上,將指令記憶體與資料記憶體分離,從而能夠更有效地同時進行指令擷取與資料擷取。

關鍵技術組件包括:

  • 12-bit ISA: 一個專為計算機特定需求設計的客製化指令集架構。
  • 8-state Execution FSM: 一個處理指令執行週期的有限狀態機 (Finite State Machine)。
  • Hardware Stack Guard: 一個專門防止堆疊溢位 (stack overflow) 的機制,具有專門用於微碼 (microcode) 除錯的 FAULT 狀態。
  • CORDIC Algorithm: 為了處理三角函數,該專案利用了 CORDIC (Coordinate Rotation Digital Computer) 演算法,並已驗證其精度達 14 位有效數字。
  • Custom PCB: 最終的硬體實作包含一個使用 EasyEDA/JLCPCB 設計的客製化 PCB,並配備電池與充電電路。

軟體堆疊與工具鏈

硬體僅佔方程式的一半。為了讓 CPU 運作如同一台計算機,該專案包含了一套完整的軟體與軟體模擬工具鏈:

  • Two-pass Assembler: 一個使用 Python 編寫的組譯器 (~700 行),可將客製化 ISA 轉換為機器碼。

  • Verilator + Qt Framework: 這使得相同的 Verilog 原始碼可以在多個環境中執行:作為模擬、作為桌面 GUI 除錯器、作為 WebAssembly,以及在實際的 FPGA 硬體上。

  • Microcode Scripting: 在微碼之上實作了一種腳本語言,允許在不更改硬體邏輯的情況下,為計算機增加新功能。

傳承與影響

這個專案是對經典科學計算機時代的致敬,特別是來自 HP 的產品。正如一位評論者所言,70 與 80 年代的傳 leyendaary HP 計算機以其堅固的構造與使用逆向波蘭表示法 (Reverse Polish Notation, RPN) 而聞名,這消除了在複雜表達式中使用括號的需求。

"對於擁有 HP 計算機的人來說,最棒的部分在於其堅固的物理構造... 精確度,以及每當你的同學想借用你的計算機時,如果你問他們是否知道 RPN,他們會因恐懼而退縮。"

透過重現這些早期科學機器之邏輯,這個專案架起了現代 FPGA 設計與定義了個人電腦早期時代的經典架構決策之間的橋樑。

Sources