pretty code

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

2025年6月22日 星期日

Vim Regex Pattern by Google Gemini

底下是 Gmini 整理的。 

Vim Regex Pattern 詳細跳脫規則

Vim 的正規表達式語法非常強大,但它的轉義規則與 Perl 或 Python 等語言的標準正規表達式略有不同,尤其是在處理特殊字符時。Vim 將某些特殊字符分為 "魔法" (magic) 和 "非魔法" (nomagic) 兩種模式。

你可以使用不同的前綴來控制正規表達式的魔法模式:

  • \M: 設定為 全魔法 (very magic) 模式。所有的特殊字符都視為魔法,不需要額外轉義。這是最像 Perl/PCRE 的模式。
  • \m: 設定為 魔法 (magic) 模式 (Vim 預設)。大部分特殊字符是魔法的,少數需要轉義。
  • \v: 設定為 極魔法 (very magic) 模式。所有的特殊字符都視為魔法,不需要額外轉義。這是最推薦使用的模式,因為它與常見的正規表達式引擎行為最接近,減少了混淆。
  • \V: 設定為 非魔法 (very nomagic) 模式。所有的特殊字符都視為普通字符,需要轉義才能具備特殊含義。

推薦:始終使用 \v 開頭的正規表達式,它讓你的模式更直觀。

使用 \v (極魔法) 時的常用特殊字符和其含義:

字符說明範例 (\v)匹配範例
.匹配任何單個字符 (換行符除外)\v.imVim, aim
*匹配前一個項目 0 次或多次\vgo*dgod, good, gooood
+匹配前一個項目 1 次或多次\vgo+dgood, gooood (不匹配 god)
?匹配前一個項目 0 次或 1 次\vcolou?rcolor, colour
{n}精確匹配前一個項目 n 次\va{3}aaa
{n,}匹配前一個項目至少 n 次\va{2,}aa, aaa, aaaa
{n,m}匹配前一個項目 n 到 m 次 (包含)\va{2,4}aa, aaa, aaaa
()分組,創建子匹配\v(ab)+ab, abab
``或 (OR) 邏輯`\v(cat
[]字符集,匹配方括號內的任何一個字符\v[abc]a, b, c
[^]負向字符集,匹配方括號內之外的任何一個字符\v[^aeiou]匹配任何非元音字母
^匹配行的開頭 (當它是模式的第一個字符時)\v^The匹配以 "The" 開頭的行
$匹配行的結尾 (當它是模式的最後一個字符時)\vend$匹配以 "end" 結尾的行
\b匹配單字邊界 (word boundary)\v\bword\b精確匹配單字 "word"
\<匹配單字的開頭\v\<word匹配 "word" 在單字開頭
\>匹配單字的結尾\vword\>匹配 "word" 在單字結尾
\s匹配任何空白字符 (space, tab, newline, etc.)\vhello\sworldhello world
\S匹配任何非空白字符\v\S+word, abc
\d匹配任何數字字符 ([0-9])\v\d{3}123, 456
\D匹配任何非數字字符\v\Da, !
\w匹配任何單字字符 (字母、數字、底線)\v\w+variable_name, 123
\W匹配任何非單字字符\v\W!, @
\( \)普通括號 (分組)\v(abc)匹配 abc 並捕獲
`\`普通豎線 (或)`\vabc\
\{ \}普通花括號 (量詞)\vabc\{匹配 abc{
\+普通加號\v1\+11+1
\?普通問號\vwhat\?what?
\.普通點號\vfile\.txtfile.txt
\[ \]普通方括號\v\[bracket\][bracket]

關於轉義 (Escaping):

  • 當使用 \v (very magic) 模式時,幾乎所有你希望作為字面意義匹配的特殊字符,都需要在其前面加上一個反斜槓 \ 進行轉義。 這包括 . * + ? | ( ) [ ] { } ^ $ \ 等。
  • 反斜槓本身 (\) 在正規表達式中也是特殊字符,所以如果你要匹配字面意義上的反斜槓,你需要寫 \\。

例外 (通常不需要轉義的字面字符,除非在特定上下文中):

  • 字母和數字通常不需要轉義。
  • 逗號 ,、破折號 -、等號 = 等非正規表達式特殊字符在模式中通常不需要轉義。

總結

在 Vim Script 中使用正規表達式時,為了清晰和與其他語言習慣保持一致,強烈建議在模式字串的開頭加上 \v (very magic)。這樣,你就只需要記住那些本身就具有特殊意義的字符(如 . * ( [ 等)需要用 \ 來轉義,如果想讓它們作為字面字符匹配。

第一次覺得 AI 有幫助

昨天快篩一條線後,今天終於回了父母家一趟,所以放假這兩天其實都沒什麼在碰 Vim!

晚上回來後,想說來替 Vim 加一個功能好了XD


但是很多時候,我們好奇的是這根訊號它又被穿到哪個 module or cell 了!

如果是 cell 那還好辦,畢竟 pin 不會太多。

假設是另一個 module 或是 hard macro,此時 pin 的個數便會很多,甚至在一頁內都看不到 instantiation 的地方?

雖然可以用搜尋的方式找到分號,接著找右大括號,然後用 % 跳到左大括號,如此一來,我們就可以看到 instantiation 的 module name or cell name 了!

不過,如果可以比照 module 一樣處理,工作當然更方便。

可惜,這次用 Google 搜尋 Vim script 關鍵字都不順利,Vim help 又不好閱讀,於是直接詢問 Gemimi,想不到比我用 Google 快?

結論就是我又可以豐富我的 vimrc 了XD


2025/06/23 更新

今天去辦公室馬上拿真實的 netlist 來測試,果然還不錯,除了要稍微修改 regex 外,畢竟,真實的 netlist pin 很多,我原本的假設不一定成立!

不過,重點還是 [".", "(", ")"] 這 3 個字元是否存在於 hightlight 那行,假設有任一個存在,我就當作是 instantiation 語法!

目前使用的感想還行XD

2025年6月17日 星期二

老人安置

最近幫媽媽處理一些親屬老人安置補助的東東,記錄一下避免忘記。


假設符合一定條件,這個補助計畫網頁文字為「低收入戶、中低收入失能及保護安置老人接受長期照顧機構安置補助計畫」,假設是新北市政府 114 ~ 115 年度,養護類安置費,每個月 2 萬 4 千元,假設中途因病住院,30 日內都可以保留並仍予補助。



這個金額最早沒那麼多,陸續有調整,108 年度為 2 萬 2 千元。

另根據「低收入戶及中低收入戶傷病住院看護費用補助」說明,符合資格者,一天可請領看護費用 1,800,目前看護行情一天至少 2,800。


假設是喪葬費,最高 3 萬元整,亦可以參加聯合公祭,可用「113 年度新北市聯合奠祭實施計畫」關鍵字查詢,內有項目細節可看。