跟 SRAM 訊號奮鬥了一天,除了稍微關心一下學弟妹外,其餘都在看我的波形。
明明所有的 input 我都 follow 了,已經沒有 unknown 訊號,沒想到一個 miscompare 都沒少?
這時能做的事就是放空自己,明天再來一遍,只要按部就班的從頭檢查一遍,我想答案就能呼之欲出了吧?
幾個我比較關心的點如下:
01. 為什會產生檔名為 Fast_function 的 SRAM Verilog,這到底從哪裡來的?應該是客戶 perl tool 產生出來的 file_list 吧!
02. 為了避開沒有 license 的問題,我們自己把 Memory Model hack 掉,這樣合理嗎?
03. 如果 Address 跟 Data 都正常,只有 Q 不正常,那問題還是出在 SRAM 本身嗎?
05. 到底是否是 AXI 訊號未初始化引起?但我也把該 Alert 成功搞定了,Log 已經看不到了?
06. 我今天強制 force 了一個 closed loop 訊號,是否把 function 搞亂了?
為啥上星期解決另外一顆 SRAM 的經驗套用在這裡不管用呢?
2026/02/04 更新
重看一次訊號,還是沒有問題,感覺還是我上面的疑點 3 較可疑!
最後終於發現問題是出在 simulation model 中,如果不 define 某個值,Q 永遠是走 Data 而不是我們要的 Test Data,難怪 SimVision 看到的就是直接連線到 Data Port。
雖然從字面上看不出來那個 define 的用途,但 EDA 不會騙你,我用 iverilog 前置處理的結果確實跟 Test Data 有關的 code 都不在了,如果不把沒用的區塊拿掉,很難一眼看出 code 到底跑在哪裡!
我想也許可以借助 EDA 的能力,幫助我們在眾多 define 中找到目前到底是執行在哪個 define 區塊,改天翻翻文件應該能找到答案。
花了兩天搞定問題,感覺還行。
遇到問題時,有個自己的筆記系統與習慣就很重要了,隨時要注意自己在哪裡,才不會淹沒在一堆訊號中迷失了方向。
2026/02/05 更新
不知道在我們這行 AI 是否真的可以回答出正確的答案?坦白說,我 google 都找不到答案了,很難想像 AI 的資料庫從哪裡來?
上面是我昨天跟 AI 討論的結果,今天很高興的去公司確認,根本沒有這個選項,除非我眼花看錯了。
雖然 AI 一本正經地胡說八道,但因為我本來就知道 iverilog 前置處理的用法,所以把概念套用到 iverilog 上,就變成了很好的 solution。
iverilog -E -c file-list -o pre_iverilog.txt
上面指令,可以讓 iverlog 直接讀所有的檔案,因為我們用 -E 請他前置處理,結果就會是一個乾淨的 code。
執行結果如下圖。
有人可能會疑問,直接用 grep 不就好了,但是一個 file_list 中可能又會包括其他的 file_list,也有可能是 include_dir,故需要另外寫一支程式,去找出所有的檔案並檢查是否有 define 該 macro。
故雖然 AI 在那瞎說,但還是讓我領悟出原來可以這樣用。
其實從編譯器角度來看,想想這樣使用也很合理,只是一般人不會想到這樣來使用,至少我是不會想到就是XD
2026/02/06 更新
本想明天給 iverilog 發個 patch,結果萬能的 Linux 天神一行 regex 都不用下,這個經過前置處器處理留下一堆空白的醜 Code 就可以回復原貌,真是讓人開心。
以後遇到 simulation 問題,看客戶的 Verilog code 就更容易發現問題了XD