有時候可能只是 top port 要設值,有時候可能是途徑上的 MUX 要加 enable 訊號。
又或是這個 SRAM Model 要加些 define 才能跑到正確的 code。
但最多時候都是 SRAM 本身的訊號哪裡沒控制好!
這次這個問題是我解最久的一次,大概解了快四天有,中間一度有先處理別的事情。
最後才發現是裡面一組 register 因為沒有 reset,導致 X 值無法復原。
坦白說找到 root cause 帶有一點幸運的成分,雖然我早就使用 iverilog 處理前置處理器的語法得到一個乾淨的 Verilog 檔案,但關於 Q 一直為 X 這件事卻是看不出個所以然。
最後想到去跟上一版可以過的 waveform 比較,雖然因為這次關掉某些功能導致 hierarchy 不一樣,不能在同樣的時間點來做比較,但在人工對齊 waveform 之後,還是能倆倆互相比較。
假設大家的時間點都一樣,只要 dump VCD,寫個程式來比較差異處即可,可惜在這裡不適用!
最後才在這次被關掉功能上的某個 reset port 上,在接近 0 秒的位置,似乎看到有一條突刺?
將其放大一看,原來有個 pulse 的動作,但我們這一版因為關掉該功能,故被 tied 1'b0。
試著將其用 force reset 後,果然幾千個錯誤少掉好幾百個了!
再來就簡單了,只要將所有的 SRAM 都比照辦理即可。
說是這樣說,但要得到所有 SRAM 的 path 也是得花點工夫。
這時就是要請出 grep sed Vim 三兄弟。
但最關鍵的一點是,如果某 sram 長這樣:
u_wrapper.data.\genbus[0].u_ram
設值時要這樣寫
force {u_wrapper.data.\genbus[0].u_ram.reset} 1
搞定收工。
唉,如果我有時間,我也想好好看一下 simulation 文件,確認是否有更好的方式來 debug 萬惡的 X。
無奈我這達達的馬蹄,又要達達的去解下一個問題了,不如歸去呀?