pretty code

2025年8月7日 星期四

第一次使用 VCS 就上手

果然 Synopsys 很喜歡留一手XD

最近一個東東一定要用 VCS 才能成功跑完模擬,使用 xrun 完全不行。

我想這也不意外,畢竟都是同一家的產品。

理論上 VCS 開啟那個功能後,我應該可以看到 VCS 如何對那些 register 設值,但是有一半的訊號,他不會告訴你他是如何給值!

今天想過使用 dump waveform 裡面的訊號來驗證這些值是什麼?但奇怪的是這些訊號居然都不在 waveform 裡面?嚴格來說,應該是 standard cell 的 instance 找不到?

究竟原因是什麼,我還未知就是了!改天想到再來研究看看。

這星期算是我第一次使用 VCS,剛看了一些文章後,還是把一些技巧記錄一下避免忘記。

01. -R 很好用,雖然說要分離編譯還是 simv 使用的參數不是很難,但如果不用特意區分,只要一股腦的寫在同一個 script 或是 file_list 也不錯。

02. 原本我以為 VCS 不支援 -f file_list 的使用,今天才發現原來是某些參數不行,只要區分開來,就不用像下面這樣寫在 script 裡面,後面多了一個醜醜的反斜線,看了就有礙觀瞻XD

vcs \
-option1 \
-option2 \
-final_option

使用 file_list 的好處還不只是好看而已,不要的參數可以隨時註解起來,不需要另外剪下放到下面以備不時之需。

不過也許是我對 script 不熟,還沒想到要如何克服這個問題就是!

03. UCLI 有點像是 GNU GDB,可以下斷點看訊號或是改值。

04. -debug_pp, -debug_all 是配合 UCLI 及 DVE 使用。

UCLI - User Command Line Interface
DVE - Discovery Visible Environment ( GUI )

不過,現在好像比較少人用 DVE?

05. -notice 顯示詳細的診斷訊息。

06. +vcs+lic+wait 無限的等待 license。

07. -l log_name 這個參數跟 Xcelium 一樣。

08. dump VCD 相關。

+vcs+vcdpluson
-vcd <filename>

應該還有很多,先知道這些即可,有需要再查詢即可。

這篇是我覺得寫得還不錯的文章。

2025/08/08 更新

原來要加上 +fsdb+keep_cell_module="*" 的語法才會 dump 那些 cell 的訊號,檢查了一下,Xcelium 看起來預設就會 dump 了。

另外,不知道為什麼 -P xxx.tab /verdi/pli.a 要 dump FSDB 的參數,放在 file_list 會讓 $fsdb 相關的系統函數找不到?即使改用 -debug_access 也是一樣(-P 在 Verdi 2024 後就會過時)。

後來查了一下,改用 bash script 的方法解決,雖然要宣告一個陣列,但還算可以就是。

gtkwave 是我大哥

雖然最近使用 Verdi 快速幫我定位 x 訊號的問題,再加上點擊訊號或物件馬上跳到 RTL code,或是在 RTL Code 中追蹤 wire,不論是上述哪個功能,都是我覺得蠻好用的功能。

但純粹就看波型來說,我還是比較喜歡 gtkwave。

尤其你有一堆一樣的 instance 裡面的訊號要看,可以快速的使用 Search -> Signal Search Regexp,一下就把一堆訊號找出來加入。

儲存訊號的 gtkw 檔案,也可以很快的複製一份並直接更改內容變成 for 新的波型使用,理論上可以開啟別的 gtkw 來對應?但我還是習慣複製一份!

我想 gtkwave 欠缺的應該只是快速的找到 instance 吧?畢竟一層一層點不是很好用。

也許 nWave 也有對應的功能可用,但我還沒找到就是。

今天為了簡報要抓取兩個波型的畫面來比較,只要簡單使用下面 command 就可以同時開啟兩個檔案在同一個視窗。

twinwave xxxx.gtkw + yyyy.gtkw

這樣的軟體你怎能不喜歡呢?

2025年8月3日 星期日

force, release, deposit command

一般來說,當我們 Testbench 測試時若遇到結果不如預期,往往都是某些訊號忘了設定,此時使用 force 便可以輕鬆搞定。

這樣的 case 一般不需要用到 release 解除原本的 force。

但換句話說,如果是需要 release 的 case,EDA 廠商的 Tcl deposit command 會比較好用,不需要另外記得 release,只要驅動該訊號的 input 有所變動,自然會以新值取代原本 deposit 給予的值。

即使記得 release 也不是什麼 case 都能讓原本的訊號繼續工作?

假設我們是對某根訊號 force x,假設這個訊號的電路是跟自己做反向,那這個訊號就會永遠 unknown 下去。

不知道觀察到的現象是否可以解釋 unknown 還是有機會無法回復呢?


新北市立案老人福利機構名冊

只有板橋區部分,其他可能要寫程式抓比較方便。

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。

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

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