pretty code

2025年7月20日 星期日

電路是個很神奇的東東

雖然 debug 很煩,很多時候會找不到方向,還有問題一直無法收斂,但多少還是可以從中學到一點新知識。

電路是個很神奇的東東,可能只是某一個 bit 不對,就導致整個 simulation 不如預期。

昨天剛好跟同事討論到 $display 出現了 xX 的字眼,查了一下,才知道這兩者是有細微的不同。

簡單來說,當訊號中有一部分是 unknown,就會看到大寫的 X。

反之,如果訊號全部 unknown,便是小寫的 x。

長知識了XD

下面是一個簡單的例子以及規格書描述。


2025年7月15日 星期二

好久沒看 Vim 的書了

最近都在連工作站測試,放假除了出去外,有想法都會進工作站試個幾局XD

原本下班前覺得妥當的東西,剛剛連回去看的結果居然不如預期?

無奈之下,還是先 dump fsdb 好了,根據我星期日的測試,雖然因為缺少 license 無法開啟,但還是可以透過 fsdb2vcd 得到 VCD 檔案,如果我們又無聊的透過 vcd2fsdb,這個 fsdb 就可以解除封印,不過不排除是我星期日測太多眼花了XD

唯一可以確定的是 VCD 轉 fsdb 就沒有 license 問題。

目前網路上找的到的解釋就是下面這張圖,感覺很像 Synopsys 會做的事XD



不知不覺小老婆演唱會也過去好幾個星期了,這次雖然準時登入還是搶不到票,不過我喜歡的歌演唱會也不會唱就是了!

現在有點懷疑是否真的要用 VCS 才能順利跑成功?

我果然還是太嫩了?以為憑我 SW 的經驗可以無往不利?

幸好之前投資 Vim 的點數沒有白費,不需要找阿卡拉重置點數!

如果這一年多來沒有投資 Vim,我估計我跑過的測試應該會少 1/3 以上!

很多時候要改一堆東西,Vim 不熟都很難搞定XD

2025/07/15 更新

成也蕭何,敗也蕭何。

就是對自己的 Vim 技巧太有信心,沒想到居然少給了某個 hard macro 電,還好同事有幫忙看到,不然我應該找不出來,該段 code 看了至少 10 次以上有。

這告訴我們一件事,EDA 工具已經告訴我們哪個訊號有問題,第一件事一定是去檢查那根訊號,而不是把整段 code 又看一次。

另外,fsdb2vcd 有點愚蠢,從上班轉到下班回到家遠端連線都還沒轉完,那還不如直接 dump VCD 都沒那麼慢!

EDA 工作每件事都很花時間,還是盡量不要犯蠢較好,不過好像很難避免?

這應該不是什麼 SOP 可以解決的!

我能想到的就是可以用程式檢查的就寫在 Testbench 內檢查,越早出錯越早離開越好。

$display 想看的訊號,如果可以用程式產生 $display 的檢查語法,還是要利用程式來產生,才不會像我一樣敗在那個 bit。

force 的訊號,同理可證。

2025年7月10日 星期四

Linux + Vim 真是絕配

想要得到一份兩個目錄下的檔案內容差異又不想包含 soft-link,Google 一下可以知道 diff 就有這樣的選項可以使用。

diff -r --no-dereference

為什麼要排除 soft-link?假設路徑中前後各有一個 soft-link,則比較出來的差異數量會膨脹成 4 倍。

排除了重複的資料後,diff 結果可以很容易的再用 sed 切出我們要的內容,也就是不同目錄的差異檔案清單。

如果我們把查詢出來的清單再加工成另一份清單,簡單加上一個 Vim Function,我們就可以快速的隨時瀏覽該檔案的差異項目。

diff -r --no dereference Dir1 Dir2 > diff.log
cat diff.log | sed -En 's/diff -r --no-dereference (.*) (.*)/gvim -d \1 \2/p' > diff_file_list.txt

function! CallExternalCmd()
    let l:line = getline(".")
    execute ":!" . l:line
endfunction

這是我在工作站沒有 WinMerge 這樣的軟體情況下,能夠想出的最佳解法。

當然最佳解一定是在工作站安裝 WinMerge 類似的軟體,雖然在 Linux 上 command line 才是王道,如果偶爾也有 GUI 可用,那也是個不錯的休閒時光XD

2025年7月6日 星期日

人的記憶力很不可取

早上連回工作站確認昨天測試結果,順便試一下還沒測試的參數。

突然無意間發現,似乎有一段 code 沒有整理到之前簡報?

馬上回去 review power point,沒想到我當初就有寫進去?

完全不計得有這回事?

最近測試很不順利,從上星期四晚上 debug 到今天還不能跑過所有的 PHY test!雖然這星期又多過了 2 個測試項,但還是覺得很阿雜。

我想應該要靜下心來好好重頭看過所有的文件,不要先入為主的認為沒用就心不在焉的看過!

就從我整理的 power point 及 word 文件開始好了,畢竟就連我有寫過的我都忘記了XD

2025年7月5日 星期六

動態改變 Verilog 選項

很多時候,工作就是一連串的取捨。

以 Verilog 來說,`ifdef 是編譯時期決定的,可以用這個來決定 Verilog 的行為。

但如果我們想要增加功能,我們就必須重新 define 新的 macro 並重新編譯才行。

想要動態改變 Verilog 選項,就必須使用 $test$plusargs 或是 $value$plusargs,前者類似 `ifdef,我們想要知道的是某個值是否有定義,後者則是我們想知道某個值是什麼。

下面便是一個簡單的例子。


值得注意的是,使用 `ifef 或是 `$test$plusargs 並沒有什麼準則,端看你的需求是什麼?

動態改變某個選項,意味 simulation 必須一直做判斷求值的動作,我想這多少也會增加 simulation 的時間?

假設不考慮效能的話,動態一定是比 `ifdef 好,至少你可以一眼看出程式在幹嗎!


自己寫的 Verilog 還好搞,像是 vendor 的 Testbench,它的各個 define 散落各地,光要把他們集合起來餵給 iverilog 就是個大工程。

純軟的人真倒楣,走到哪都要看到爛 code,10 幾年前我看高通以及微軟的 AK 已經覺得夠爛了,沒想到現在看到 Synopsys 的 code,我才知道人外有人,天外有天。

一爛還有一爛爛,連文件跟 Testbench 都對不起來是怎樣?

工作站注意事項

已經好幾天下班後或放假時都會連回工作站確認測試結果及做更多的測試。

今天早上外出回來後,就在確認上一次測試的結果時,不知為何 Vim 操作變得很慢,於是只好先離開再進入工作站。結果回來時居然看不到原本的 session 階段,只好忍痛新開 session。

進入新工作階段後,第一件事當然是確認原本的 simulation 是否還在,如果還在要把它 kill 掉,不然最近工作站空間吃緊,測試可能會無法順利完成。

果不其然,上一個 session 的 simulation 還在,當下也沒想太多就 kill 了。

後來為了測試工作站 save session 是否正常,便先離開再進來。

不料,卻看到兩個 session,原本以為已 crash 的 session 居然又在了?進去一看,開啟的 shell 視窗都在,難怪先前 ps 還可以看到原本的 simulation。

我想我想相反了,只要 ps 可以看到 process id,那就表示 session 沒有失效,只是不知為何當初登入時看不到,很可能重新連線就可以看到了!

可恨我的測試只好又重頭再來一遍XD

2025年7月3日 星期四

fsdb 替代方案

雖然在 github 找了幾個關於 fsdb 的替代方案,不過 Windows 上並沒有合適的檔案可供測試,故暫時無法得知一些替代方案是否可以解決?

看起來除了控制 VCD 的 level 與 instance 層級之外,目前的最好解法便是在適當的地方,呼叫系統指令暫時關掉不想要的 dump 動作。

跑起來的感覺大概就像下面那張圖一樣。

從 100 ns 開始,呼叫 $dumpoff 停止 dump,接著在 200 ns 開始,呼叫 $dumpon 恢復 dump。


另外,下午在找資料的過程中,無意間發現當初開發 fsdb 的人。

一般來說,我都會很佩服這樣的人!

不過,唉,不說了…

但是有機會我還是會去買他或是她的書來看,至少在 coding 這一項,對方一定是比我強沒錯!

正所謂海納百川,不以人廢言。

《灌籃高手》電子書今日正式上線

中午吃飽飯立刻在公司電腦下單XD

本想早上就買的,但今日要早點去公司測試,只好忍痛放棄?

雖然這套漫畫排不上我想買的漫畫前三名,但看在我在 2014 年也有短暫觀看 NBA 的過往,還是掏出魔法小卡勇敢地買下去。

順便在線上閱讀一下最後一集,不得不說感覺還是很熱血,下午想做的測試也不禁讓我熱血沸騰起來。

哪天才能等到我的黑豹列傳呀!

2025/07/03 晚上更新

雖然人是熱血沸騰起來沒錯,但只多過了 2 種測試,有些地方無法解釋且跟文件對不起來,待我晚上連回公司時好好想想。

順便附上嘿嘿後的最後一集封面!
要是現在放棄的話,比賽就結束了XD

2025年7月2日 星期三

xmhelp

DC 有 man 可以查詢錯誤,NCVerilog 則是 xmhelp 指令。

比如我在 simulation 的過程中,出現一個 *W,BIGIDX 的錯誤訊息,原本的 log 可以知道是哪個檔案,但如果我們想多了解一點,可以用下面指令來查詢。

xmhelp xmelab BIGIDX

另外,xrun or ncverilog 都是一個統包的指令,其實他會分別作編譯,elaborate 以及跑模擬。
這其實會分別對應到另外 3 支程式。

第一支程式是 xmvlog,接著是 xmelab,最後則是 xmsim。

對應到 iverilog 便是 iverilog + vvp。

另外,NCVerilog 是舊版本名稱,現在應該是 Xcelium。

2025/07/03 更新

上面只是舉例用法,xmhelp 後面的參數要看你是哪一階段的錯誤,就要填上對應的程式名稱。

比如 xmhelp xmvlog NOINUF

2025年7月1日 星期二

沒事多讀規格書

原本我以為 timescale 是可以細到針對個別 Verilog 設定XD

昨天在 2005 規格書好像沒有看到?可能是跟我邊分心連到工作站做事有關,不過卻意外多知道一個函數 $printtimescale( ),可以印出目前檔案的 timescale 設定。

今天突然想到,自己寫個 Testbench 來驗證不就好了!

於是我對 Verilog 又多懂了一點點…

今日重點

01. $printtimescale 可以印出目前 timescale。
02. 看起來所有檔案只能用同一個,後面會覆蓋前面(待確認?)。


2025/07/02 更新

下午因為硬碟空間不足,苦等原本測試未果,無法繼續下一個測試。

乾脆跟 Google AI 對談,順便切磋一下彼此對 EDA 軟體心得,後來順口問了一句有關 `timescale 的想法,居然發現 AI 給的例子完美證明了 `timescale 是可以對個別 module 做設定。

我本來的例子由於是 include,因此會原地展開,才會有我後者取代前者的結論。

下面是 AI 給的例子,因為是個別編譯,故分別保留各自的 `timescale。


雖然我昨天又看了一次規格書,實在看不出這樣的結論?

不過,我跟 AI 都一致認為這樣容易產生 bug,最好的方式還是有一個統一的 include 檔案,大家才能都用同樣的設定。