費氏數列是整數序列 0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55,以此類推,由種子 F(0) = 0 與 F(1) = 1 定義,遞推式為 n ≥ 2 時 F(n) = F(n − 1) + F(n − 2),這是 NIST Digital Library of Mathematical Functions 與 OEIS A000045 所記載的標準從零起算形式。使用 Verilog 程式碼的費氏數產生器,常會搭配另一份瀏覽器端參考,好讓硬體輸出能對照一份獨立產生的精確清單來核對。費氏數列產生器就是這類參考:輸入 1 到 1,000 的項數,按下產生,即可取得從 F(0) 到所請求最終索引的每一個值,每一項各佔一行帶索引的列。因為每個值都以 BigInt 保存並直接轉成十進位文字,即使超過一般 JavaScript 數字會崩成四捨五入的那一點,輸出仍能保住每一位數。整條管線都在目前頁面執行,因此所選項數與產生的各位數字都不會離開瀏覽器。

費氏數列是什麼、如何定義
多數教科書習題從 1, 1 開始列,因為它們跳過了零種子,但這種慣例不一致,正是 Verilog testbench 裡差一錯誤最常見的來源之一。本產生器堅守 OEIS A000045 所記載的從零起算定義,因此 F(0) 永遠等於 0,F(1) 永遠等於 1,之後每一項都是前兩項的和。這種形式也正好對齊硬體描述語言計算暫存器的方式,因為 Verilog 的 reg [WIDTH-1:0] fib 對記憶體區塊建立索引時,通常也是從零開始。
若要更完整說明當 HDL 程式碼索引從 0 開始時,為何從零起算形式較安全,從 F(0) 起講解費氏數列概念 指南涵蓋同一套定義,並附額外計算範例。
一旦遞推式鎖定為該形式,幾個具體數值就能成為任何 Verilog 實作可信賴的參考點:
| 索引 n | F(n) | 作為 Verilog 健全性檢查 |
|---|---|---|
| 0 | 0 | 種子:硬體應輸出的第一個值 |
| 1 | 1 | 第二個種子;確認 FSM 沒有跳過 F(0) |
| 2 | 1 | 第一次真正的遞推;F(1) 與 F(0) 的和 |
| 5 | 5 | 捕捉來自 F(1) 與 F(2) 的重複 1 值 |
| 10 | 55 | 許多 FPGA 實驗課會用的常見教科書例子 |
| 20 | 6765 | 可輕鬆放進 32 位元暫存器 |
| 46 | 1836311903 | 有號 32 位元暫存器能表示的最後一個值 |
該表每一列都只差一次加法就能對上 Verilog 實作,因此在展開更大規模模擬之前,這是成本最低的健全性測試基準。
為何 Verilog 與 HDL 開發者需要精確參考
硬體描述語言會默默處理整數溢位。寬度 32 的 Verilog 暫存器,一旦費氏值越過 2^31 − 1,就會以 2^32 為模環繞,而只印出低 32 位元的 testbench 即使上半是垃圾也會看起來正確。SystemVerilog、VHDL unsigned,以及任何使用 uint32_t 的 C 測試工具也一樣。在這種背景下,參考清單的價值比較不在外形,而在精度:預期序列裡的每一位數都必須精確,不論它落在這次執行的哪個位置。
取得那份精確清單最快的方法,是問一個完全不必近似的工具。費氏數列產生器 把每一項存成 BigInt,對每個請求的索引做一次加法,再把結果寫成普通十進位文字。沒有封閉形式的黃金比例捷徑,沒有浮點平方根,當項數爬過 F(78) 時也不會默默四捨五入。
若要在更廣的數值工作流程裡實作這個遞推,在 MATLAB 裡免寫程式產生亂數 也提供類似的視窗式捷徑。核心想法——讓工具產出精確數值參考,你的程式碼只需對上它——同樣適用。
產生帶索引的費氏參考清單
介面刻意做得很小。三個步驟涵蓋從快速健全性檢查到深層 testbench 完整一千項測試資料的所有支援用途。
- 在輸入框輸入 1 到 1,000 的整數項數。項數一律把 F(0) 算作第一項,因此輸入 1 只回傳 F(0),輸入 20 回傳 F(0) 到 F(19),輸入 1000 回傳 F(0) 到 F(999)。
- 按下產生按鈕,等待帶索引的清單出現。清單上方的摘要一律會寫出所輸入的項數與實際產生的最終索引,因此一眼就能確認這次執行是否符合你 Verilog testbench 設定的深度。
- 用複製按鈕複製以換行分隔的文字,若沒有剪貼簿權限也可手動選取可見文字。每一行都保留索引,因此即使在開頭 0, 1, 1, 2 視覺上容易撞在一起的地方,某一項的位置仍不會含糊。
解讀輸出:帶索引的列,不是裸數字
輸出每一行的格式為 F(index) = decimal value。索引是從零起算的位置,值則是該費氏數的精確十進位表示,沒有千分位分隔符,也沒有科學記號。正是這種格式讓輸出可以安全貼進 Verilog 註解區塊、C 標頭或 Markdown 表格——索引跟著數字走,放錯位置的項就不會被誤認成鄰居。
編輯項數會清掉上一次執行。這在硬體工作流程裡很重要,因為測試資料通常會依每個新深度重新產生:不會有舊序列殘留在尚未處理的新輸入底下。摘要面板只在新執行完成後才更新,因此畫面上的結果一律與上方顯示的項數一致。
對能輕鬆放進 32 位元的值,輸出短而好讀。20 項清單涵蓋 F(0) = 0 到 F(19) = 4181,一螢幕就放得下。50 項清單到達 F(49) = 7778742049,過了那一點數字仍繼續增加、不加壓縮,這正是你拿來對照使用任意寬度暫存器的 Verilog 實作時想要的行為。
越過 32 位元邊界後的 BigInt 精度
JavaScript Number 值只能精確表示到 2^53 − 1 的整數,而費氏數列出乎意料地早就越過這條安全整數邊界:F(78) = 8944394323791464 仍能放進 Number.MAX_SAFE_INTEGER,但 F(79) = 14472334024676221 與 F(80) = 23416728348467685 已經超出。從該索引起,任何把值存成浮點雙精度的工具都會開始丟掉最低幾位並印出近似值——印出來的數字看起來可能仍合理,但最後幾位會在項數成長時默默改變。
本產生器把每一項存在 BigInt 裡,只在寫出該列時才轉成十進位文字,從而繞過整個問題。例如 F(100) 會顯示為精確的 21 位數 354224848179261915075,而不是 3.5422484817926193e+20 或任何其他壓縮形式。同一做法也讓 F(500)——一個 105 位數的整數——每一位都準確,這也是為什麼存在一千項上限:在那個深度,F(999) 帶有數百位數字,帶索引的輸出大到需要捲過數百行。
輸入規則:什麼算數、什麼會被拒絕
輸入是普通的十進位項數,不是目標值,也不是最終索引。輸入 100 不會回傳 F(100)——它回傳從 F(0) 到 F(99) 的前 100 列。摘要面板一律會重述實際產生的最終索引,因此誤讀無法悄悄溜走。請求一項只回傳 F(0);請求二十項則回傳 F(0) 到 F(19)。
小數、科學記號、正負號、千分位分隔符、負項數,以及空輸入,一律拒絕而非四捨五入。超過 1000 的項數也會被拒絕;上限是產品對渲染與複製文字的效能限制,不是費氏數列的數學限制。若要更長的執行,下一步應改用配備專用任意精度函式庫的專門程式環境。
在把產生結果複製進 Verilog 專案之前,值得做幾項實務檢查:確認摘要印出的最終索引符合 testbench 預期的深度,確認項數等於最終索引加一,並掃過前面幾列以確認這次執行真的從 F(0) = 0 開始。這三項檢查幾乎能抓住每一次誤用本工具的情況。
把輸出當 Verilog testbench 資料使用
最直接的用途是作為 testbench 裡的黃金參考。因為每一行都帶索引,你可以把輸出貼進 $display 或 $strobe 格式字串,例如 $display("F(%0d) = %s", expected_idx, expected_val);,直接與硬體產出的值比對。對幾個困難索引重複這件事——例如 F(45)、F(78) 與 F(100)——就能在一次短測試裡演習 32 位元溢位轉換、安全整數交界,以及舒適的多字組結果,不必枚舉中間每一個索引。
對更大的測試資料,帶索引的清單也可以當測試檔頂部的註解區塊。之後讀檔的人不用跑模擬,就能看到 testbench 正在斷言的精確序列。這種可見性往往比模擬本身更早抓到錯誤,尤其在驗證者與實作者不是同一人的跨團隊審查裡。
最後,在你撰寫 Verilog 遞推本身時,輸出也很適合作快速參考。在 SystemVerilog 裡把兩個寬費氏暫存器相加是熟悉的模式,而本產生器可為你選擇的任何樣本 N 提供預期值——直到 F(999)——不必離開頁面,也不必相信會悄悄四捨五入最後幾位的計算機。