RTL 與驗證

邏輯模擬(logic simulation)

在晶片還沒變成矽片之前,你照樣可以"執行"它——把它當成一段程式來跑。邏輯模擬接收你用硬體描述語言寫的設計描述,再配上一個負責撥動輸入的測試平台,然後隨著一個虛擬時脈一拍一拍向前走,逐時刻算出每一根連線、每一個暫存器在做什麼。你並不是把設計跑在硬體上,而是在自己的筆電上跑它的一個模型,盯著結果看。

具體來說,模擬器會推進一個"模擬時間"的概念,而且只在有東西發生變化的地方才重新求值。把一個輸入拉高,它就讓這個跳變邊緣在邏輯中傳播開來,安排下游的閘電路和正反器按各自的延遲去更新,把這一時刻的一切都穩定下來,然後再處理下一個事件。正是這種事件驅動的迴圈,使得哪怕是一小段真實晶片行為,模擬起來也要慢上許多——每一次訊號翻轉,都是工具必須明確記錄的一筆帳。回報則是徹底的可見性:你可以把每一個節點都匯出成波形,沿時間軸來回拖動,看清某個訊號究竟是在什麼時刻、為什麼出了錯。

同一套流程可以在不同的精細程度上執行。前期你模擬暫存器傳輸級——又快,又專注於一件事:邏輯功能對不對。到後期,經過邏輯合成之後,你可以拿反標了單元延遲的閘級網表來模擬,確認網表的行為依然正確——抓出諸如重置和未知值(X)這類 RTL 容易掩蓋的問題。但模擬並不是用來證明時序達標的,那是靜態時序分析的工作。模擬回答的只是一個問題——它做的事對不對?——這也正是為什麼早在流片之前,它就是設計驗證的中流砥柱。

`timescale 1ns/1ps
initial begin
  clk = 0;
  forever #5 clk = ~clk;  // toggle every 5 time units -> 10 ns period -> 100 MHz
end

在 `1ns` 時間單位下,每隔 `#5` 翻轉一次得到 10 ns 的週期——也就是一個模擬出來的 100 MHz 時脈。但 `#5` 的意思是"等 5 個時間單位",並不是任何晶片上真實的 5 奈秒;頻率到底是多少,取決於時間刻度(timescale)怎麼定。

"模擬通過"只意味著:對於你恰好施加的那組激勵,設計做對了——這是證據,而非證明。覆蓋率指標和形式驗證之所以存在,正是因為任何現實可行的測試平台,都不可能把每一種可能的輸入序列都跑一遍。

又稱
logic simHDL simulationRTL simulationgate-level simulation逻辑仿真邏輯模擬