pretty code

2025年7月26日 星期六

給開司一罐啤酒

昨天是回到以前辦公室的第一天,畢竟我在那個空間也待了 10 年有,昨天上完廁所常常不自覺地走回以前位子XD

既然是回去的第一天,不買罐咖啡給自己說不過去,但該解決的事還是得解決。

查了一個星期多的訊號後,個人猜測失敗原因是因為不能滿足文件要求,如果要一個一個訊號自己慢慢初始化不太實際,也不能一股腦用 force 和 release 給足訊號,於是這兩天便先往下一階段邁進。

坦白說要用人工重新拉線很容易寫錯,即使對 Vim 略懂略懂的我,還是覺得太花時間了!

昨天趁著中午及下午上班後,簡單寫個小程式,可以幫我宣告 wire、增加註解以及加上一個 MUX。

雖然可以做到上述的事,但一個下午試用的結果,我的函數參數增加到 9 個,即使我呼叫 add_mux 的程式也是使用 sed parse 出 initialize instance 的 pin 所組成,但還是覺得很辛苦。

加上加班時間,大概快 9 個小時只加完 95 組 wire,大部分時間都是一個一個人工比對參數是否合理,中間還有開過 3 次 Tessent 確認連線是否有問題,大概一個小時加完 10 組訊號又多一點。

今天因為要出去,出門前還是稍微修改了一下 add_mux 參數,讓他跟原本客戶的名字及 index 比較能 match 得上。

明天不出門應該可以把剩下的加完。

這樣的需求就是要寫 config 檔餵進程式,雖然還是要比對 config 檔,但應該是比人工 coding 快,只是這樣的流程如何設計還是需要好好規劃才會好用。

畢竟 9 個參數的函數扣掉 2 個 default value 也還是有 7 個參數要加,自己用無所謂,要給人用就有點麻煩,但我也不認為這些參數可以省略就是了。

另一個方式就是只複製 top module,這樣 pyverilog parsing 應該就不會太慢,不過還是少不了 config 檔就是。

順帶一提,我這裡的 config 檔就是產生呼叫 add_mux 的語法,也就是使用 sed 產生出 code。

2026/09/18 更新

EDA 工作的事還是要透過 EDA 解決。

至於 License 不夠那是不好說的問題了,畢竟該花的錢還是得花。

用 Perl 或是 Python 另外寫工具都是邪魔歪道。

現在的我應該會選擇使用 Tessent 來改 design。

除了 VHDL 檔案以外,純 Verilog 架構,它允許你將找不到的 design 視為黑盒子。

故我們就不用費心找到相關檔案。

也不是說 VHDL 無法黑盒子,但是 VHDL 有歸屬到 Library 的問題。

預設是 work,如果歸類不一樣,elaboration 就會有問題。

2025年7月23日 星期三

gtkwave 待驗證事項

gtkwave 什麼都好,就是使用滑鼠滾輪時,作動的是移動時間軸而不是像 Verdi 是調整訊號欄位的上下滾動。

看文件是有一個 use_scrollwheel_as_y 的選項可以使用,但不論是在家裡還是工作站都無法生效?

改天有空再來翻翻 source code 確定是否誤會了文件的意思。

2025/07/26 更新

稍微翻了一下 README,似乎在某個版本後就拿掉這個選項?

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 都對不起來是怎樣?