pretty code

2025年6月30日 星期一

傻強傻的呀

我果然是傻強無誤。

最近使用 Vim 開啟 System Verilog 檔案時,不知道是否是工作站的版本過舊,遇到這種檔案,都無法顯示出 file type,導致語法顏色一片慘白!為了自己方便,設了一個 map 快速鍵,只是每次都要按還是有點麻煩。

今天終於受不了了,打電話詢問 IT 是否可以更新 Vim 版本,一問之下,才知道目前 Server 已經有 8.1X 的版本。

不過號稱對 Vim 略懂略懂的我,一時之間也不知道為什麼在設了 Path 之後,開啟的還是原本的 Vim 7.X 版本,明明 Path 印出來已經是在第一順位?另外一個問題則是目前的 .vimrc 居然不能用在 8.1X 的版本,會爆出一堆 chdir 之類的系統函數找不到?

就在思考 Vim 是否有什麼設定要設時,熊熊想到,我應該自己設 event 就好,這樣就不用麻煩 IT。

不管是 BufRead、BufReadPost 或是 BufEnter 應該都可以達到自動化的目的。

改天有空在來解決使用 Vim 8.1X 的問題,畢竟在工作站上,Shell 直接開啟 Vim 還是比較符合我的工作習慣,在 Windows 我反而習慣直接開啟 gVim。

我是個很容易適應工作環境的人,有什麼就用什麼,不過我到現在從來不會想用 Mac 就是XD

2025年6月29日 星期日

學習如何學習

#!/bin/bash

items=(
A
B
C
)

for ((i=0; i < ${#items[@]}; i++));
do
    item=${items[$i]}
    echo ${item}
done


上面是 bash script 使用 array 的範例,坦白說我從來都記不住,每次需要時都是去我的 blog 搜尋。

換句話說,我記住的不是程式語法,而是我需要的語法在哪裡?

這個語法可能是在 blog,我寫過的 code 中,或是書本的某個章節。

我也不知道這樣好是不好,但我就是不喜歡背書。

今天剛好 Youtube 跳出薑餅資在談學習的一支影片,這個人是我覺得學習相關的知識說得還不錯的 Youtuber。

我想學習如何學習是件很重要的事,雖說每個人喜歡的方法都不同!

總之,我就是只想記住指標的指標在哪裡,我想記住的不是指標本身XD

1'bx = false

果然跟我想的一樣,1'bx 在 Verilog 中屬於 false 的情況。

我的 Testbench 結束條件是某個 register bit !=  1,IP Vender Testbench 的結束條件是判斷 bit == 1'b1,就會繼續在 while loop 中。

但不知為何,我失敗的 Test case 會讀到 1'bx,因為等於 false,自然會跳出迴圈。
 
下面是我模擬程式的示意圖。


雖然 IP Vender 判斷條件寫的 code 不嚴謹!但問題不是出在這裡,而是為什麼除了 REVISION_CHECK 外的測試,在讀 Shadow register 時居然會讀到 0 or 1 以外的值?

感覺問題本質又回到了原點:

01. 客戶給的 C code 和 firmware 是否正確?
02. 是否有哪個設定是錯的,比如像 cfg 到底是不是 hard code?
03. Testbench 是否有哪邊給的訊號是錯的或是說是否需要調整 timing,就像我用 APB 連 REVISION_CHECK 都過不了?

2025年6月28日 星期六

山醫命相卜

放假這兩天本想繼續解決工作的問題,無奈目前沒有什麼好想法,只能回過頭再看一次文件及 Testbench!

好久沒買雜書了,最近都在看 Vim,應該要調劑一下身心了,雖然我還是很喜歡 Vim 沒錯XD

順便巡一下 Kobo 網頁,是否又再更改 HTML 結構!

2025年6月26日 星期四

Gatesim 終於可以 compile 成功了

坦白說,我一直很不喜歡 Synopsys!

尤其最近的一個工作項目是要跑他提供的 IP Testbench。

大部分情況下,我們從客戶那拿到的 input 都是 netlist,所以,IP 相關的文件會提到如何做客戶 design 的 gatesim!(實際上,他文件寫的對我解決問題都沒幫助!)

雖然我們客戶某些 rtl 資料夾不想給我們,但因為那本來就跟 netlist 無關,故不給好像也還合理?

但是當使用 NCVerilog 編譯的時候,連 Synopsys 自己 Testbench 的相關檔案編譯都會有錯誤,這我實在是不能接受!

我能接受你只給 vcs 的 Testbench,但既然你有 option 可以選擇,理論上你應該要測試過沒問題才對?

但從昨天中午拿到客戶最後給的 C code 檔案後,我都一直在解決編譯的錯誤,直到今天晚上 10 點左右,我才順利跑起 simulation!

雖然這兩天大部分的時間都在跟我同事看他 Testbench 的問題,即使扣掉開會及上課的時間,我應該至少也花了 4 ~ 5 個小時有,真的是浪費我的生命XD

拿這些時間多寫幾個 Vim functions 來幫助我工作不是更好嗎?

不如歸去呀XD

2025/06/27 更新

果然如我預期,早上上班登入工作站看到的結果是失敗。

此時第一件事一定是 dump waveform,優先檢查的是 clock 和 reset。

不過,Synopsys 提供的 define 打開就會報錯!還好這個錯誤是可以 Google 到的,只是 LD_PATH 設定的問題,不過,我自己得先補一個 NCVerilog 參數。

但在我一時還找不到 LD_PATH 該設的正確路徑時,為了不浪費中午的時間,於是自己寫一個 initial block 直接 dump VCD 最快,只要硬碟不要爆掉就好XD

稍微看了一下似乎沒看到異常的訊號?

下午只好又繼續翻閱各個文件。

晚上回家連回公司時,忽然想到何不試試 JTAG protocol?

雖然最簡單的 REVISION_CHECK 可以通過,但其他都會報錯,暫時還想不到解法,不過我應該會往自己有修改過的 Verilog 檔案去下手檢查?

2025/06/28 更新

雖然本來就有打算放假連回公司繼續測試,但每測試一次就要等一陣子,實在緩不濟急。

還好,據我多年 coding 經驗,EDA 只要還是由軟體人所開發,我大概就能知道他們是如何設計的?

雖然我可以無腦的複製一份最上層的資料夾再做另一個測試,但是很多 file_list 路徑都要修改,當然這也不是什麼太困難的事,但最麻煩的是我的工作站空間已經不足,我連 dump VCD 都不夠了,雖然我可以 dump fsdb,但不知為何似乎是 license 原因,我無法開啟 fsdb 檔案,故我還是需要 VCD 比較實在。

為了不浪費空間,而我的多個測試也不需要更動 Testbench 內容,最多只是調整 test script 參數。

最好的方式就是只複製 test script、test script 裡面用到的檔案(比如說直接透過 command line 傳給 xrun 的,非 file_list)、幾個 include 檔案(位在測試路徑下的,這些才是動態產生的,原本就在 Testbench 那包的,大部分都不需要修改,故用同一份即可),這些就是我最低限度的檔案,只複製這幾個檔案,我隨時可以長出好幾個測試,這樣更能加速我驗證收斂問題。

現在能限制我的就只剩下 NCVerilog license 個數了!

但我家只有 2 個呀XD 

2025年6月24日 星期二

詠春三板斧

一代宗師的武術界曾提到這樣一句話:詠春來來去去就是那三板斧!

今天不知為何在工作時想到這句話?

突然發現,其實我現在的工作每天也是只有用到三板斧XD

我目前工作的三板斧為:Vim、grep、sed。

Vim 不用多說,我自己就寫了一堆 Vim script functions,即使不算自己的 Vim function,我每天用到的 Vim 功能至少就 10 個以上起跳XD

不誇張的說,沒有 Vim,我大概沒辦法工作了!

其次是 grep,很多時候我要解決的問題或是完成手上的工作,說穿了就是在一堆資料中找東東!有了 grep 的幫助,真的節省我很多時間。

最後則是 sed,grep 找到的資料透過 sed 可以輕易的切出任何我要的片段,只要下對 regex,大概事情就完成一半了XD

如果硬要加上第四板斧,我想這道板斧應該就是 find 指令無誤!

Linux 與 Vim 的世界就是這樣的樸實無華,每天都能發現新玩意?

就像是我請教我主管問題一樣,不管何時都是如沐春風!

2025年6月23日 星期一

shell script 真的很難 debug

可能我還不習慣 debug shell script?

上星期五想要檢查一個 list 檔案的每個項目是否存在於另一個 log 中,殊不知一個這麼簡單的東東,我到今天下班前才有空把它搞定,雖然也是因為我今天根本沒時間靜下心來思考的緣故?

總之,我的架構是用 cat list 取得所有項目,然後再把它應用在 for loop 中,不確定這樣是不是大家常用的做法,但至少我覺得這樣的語法我比較不會忘記XD

下面是我回家模擬的結果。


雖然我知道原本的錯誤是誤把 \r 也餵進 grep 的 pattern,但我一時之間也無法解釋第一個 inst_b 怎麼會印的跟我想的不一樣?

改天再來想想 ...

2025/06/23 洗完澡更新

詢問 Bard 的結果,這個語法我應該記不住XD

#!/bin/bash

list=list.txt
source=hier.txt

while IFS= read -r pattern; do
    pattern=`echo $pattern | tr -d '\r'`
    echo $pattern
    grep -E $pattern $source
    echo -----------
done < $list

2025/06/24 更新

大概可以猜出為什麼會印出 @inst_b 了?

原本應該是印出 #inst_b@,但因為 inst_b 後面有一個 \r 回車字元,故跳回 # 位置,然後印出 @,所以 # 就被覆蓋掉了?

這應該還算是一個合理的解釋吧XD