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

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 年度新北市聯合奠祭實施計畫」關鍵字查詢,內有項目細節可看。

2025年6月14日 星期六

Kobo 網頁又改版了

我想這個標題未來應該會一直出現XD

不得不說,人家讀墨網站就沒有那麼多問題,就你 Kobo 喜歡將 HTML  改來改去,真是腦袋有洞?


罵歸罵,還是要看一下如何修改,雖然我現在已經很少看工作以外的書了?


這次顯示購買記錄一頁有幾個項目的地方又從一行改從跨行了?

幸好,Javascript 的 regex 似乎可以支援跨行,即使我沒有加上 m 選項?

總之,現在可以就好了,我也懶得查了?

畢竟,現在國事如麻,百廢待興呀XD

期待的功能終於有人實做了

之前一直覺得是不是哪邊文件沒看清楚?不然沒道理 Yosys 合成出來的都是 escaped identifier 的名稱,這樣看起來確實是不好看!

剛剛本想直接 trace code,想說還是先用關鍵字在 issues 查一下,果然目前是沒有 rename 這樣的機制。

幸好,有一位強者提交了這個功能,等到通過後,我就可以拿 Yosys 綜合 ORFS 裡的一些專案得到一個相對大型的 netlist 來用,不然想要開發或測試一些功能都不方便。

目前還是只能看到醜醜的 escaped identifier!

看到這樣的結構,想開發一些功能都沒勁了XD

2025年6月12日 星期四

第二次確診記錄

約莫是五個星期前感冒過一次,那次原本以為是確診,但跑了好幾家才買到的快篩測試後卻不是?不過我篩的時候已經是 8 ~ 9 天後的事了。

那次咳嗽大概是一個星期多才變比較少,一天下來也是會偶爾咳個幾下,印象中以前感冒不會拖那麼久,但不排除是以前有看醫生的緣故?哭哭,我從小看到大的醫生已經退休,公司附近的診所評價都很差,不太可能為了這個上台北看病。

上星期五下班開始,體感好像咳嗽又變嚴重,好像六還是日開始有流鼻水,星期一咳嗽達到巔峰狀態,好險只持續一天,當然睡覺的咳嗽還是一直持續,晚上不好睡覺。

星期二下班時看老婆都沒吃飯,一問之下才知道她已經肌肉痠痛一整天,也已經去我看到評價不好的診所看過病,不過醫生不覺得是流感故也沒幫她做快篩。

一整天也不說,下班時打電話也不說,害我只好三兩下把飯扒完,開車去一個我查到評價還可以的診所。

由於又繞了一圈去停車,等到我走路回去時看診人數已經爆滿,還好我老婆已看完在等快篩結果中,不過為了讓老婆早點回去休息,故我自己也沒機會看病。

篩的結果不是流感,不過醫生覺得應該是新冠,想知道的話自行購買快篩確認,因為不影響他開藥的決定XD

還好這次購買很順利,不用像上次一樣要跑多家才買到。

回到家老婆累到洗完澡就睡了,反正快篩有多買,順便來測一下好了?

滴完後,只不過把東西轉頭丟到垃圾桶的光景,無意間一瞄之下,居然是兩條線?這也太快了吧,上一次確診快篩時也沒那麼快出現兩條線?


不過單從顏色來看,似乎沒有很深?

由於隔天老婆要去南部出差,她中午又跟同事吃飯草草結束我電話,故我也不知她近況如何?

昨天還沒下班就聽到位子傳來老婆的訊息震動聲,等跟同事討論完回到位子一看,原來她也中獎了,不過她更誇張,據她本人說法,一滴下去,流過去馬上兩條線。


還好電話中聽起來精神還可以,除了下午一直拉肚子以及輕微想吐!

虧我上星期五下班後在家也一直戴口罩,沒想到她還是中了,雖然我一直覺得是她傳染給我的XD

在家也戴口罩,出門及上班也一直戴,即使是一盒 300 的口罩,我的耳朵也已快承受不住。

Verilog - Implicit declarations

在 Verilog 2005 4.5 中提到了 Implicit declarations。

簡單來說,變數可以直接使用XD

在我這種寫純C 出生的看來,這種 coding 真的是大逆不道!

如果只是一個地方忘記宣告就算了,偏偏我看到的卻是幾乎所有的變數都這樣使用,重點是這個 Testbench 還是御三家中的某個 IP 的 Testbench。

一個要錢的東西你這樣寫,我只想問候他老母?

不過也不排除這樣寫是故意的,大大增加你修改 Testbench 的不便XD

雖然我現在就是要確定你每個 net 給什麼值,假設你在這個 Testbench 中 include 一堆檔案,我得一個一個看過去才知道你到底是否有在哪個地方宣告並賦值?這大大增加了我 trace code 的不便!

尤其這裡用了一堆 define,其對應的 endif 也沒給註解!

我實在是很難一眼看出我要的東西到底在不在。

第一個問題很簡單,如果是自己寫的 Verilog,加上下面語法即可報錯。

`default_nettype none


第二個問題就有點小麻煩

理論上如果我知道所有的 define 是什麼,我是可以透過 iverilog 的前置處理來幫我去掉不要的 define,再用 sed 去掉拿掉 define 留下來的連續空白,我就可以有一個清爽的 Testbench 來用。


但問題是我連完整的 Testbench 都有缺,我根本無法確認所有的 define?

2025/07/06 更新

雖然 implicit declaration 很不可取,但我最近 blog 文章的 demo 也是用了這個技巧,讓我可以用一張圖片表達我想表達的意思,所以我也用了很多這個技巧來減少我的 Verilog 行數XD

不過我寫 Verilog 絕對不會這樣用就是了。

2025年6月4日 星期三

每天都對 Vim 有新的體悟

Vim 用到現在,只差覺得摺疊沒那麼好用?

今天忘記要查甚麼資料,試了一下 set foldmethod=indent,想要看一個整體的感覺比較方便,一試之下,好像還可以?

尤其我的 code 一向很注重整齊,現在設成 default 後,打開自己的 code 感覺清爽多了!


只恨自己沒有早一點用 Vim,不然生活應該會更開心XD

2025/06/05 更新

zA 打開所有折疊
zM 關掉所有折疊

如果折疊不如預期,可以下 set sw=2 來幫助折疊更多。

原來我對 Verilog 理解有誤

一直以為在 Verilog 中,想要用某個 module,一定要建立一個實體,沒想到好像不是這樣?

這幾天又把手上的 IP test 相關 flow 又看更深了一層,在看的過程中就覺得哪邊怪怪的,原來是 module 不用一定要建立實體?

晚上回到家,寫了一個測試來驗證,好像真的不用,難道是 System Verilog 的緣故?先記錄一下,回頭再來確認!


2025/06/05 更新

早上翻遍了 Verilog 規格書,還是看不到不用實體化的理由?

於是問了一下 Bard,他也是一直跟我說不行,直到我說我用 iverilog + vvp 是可以跑的,他才告訴我一個答案,一開始我還半信半疑,不過,有了方向就好解決,打開 -v 選項一切都無所遁形!

下面是 Bard 的回答

你觀察到的現象是正確的!

你的 tb.v 程式碼能夠被 iverilog tb.v + vvp a.out 正確執行,這主要是因為 Icarus Verilog (iverilog) 編譯器的一個特性,以及 Verilog/SystemVerilog 語言中階層式參考 (Hierarchical Reference) 的規則。

Icarus Verilog 的行為:

自動辨識頂層模組 (Top-Level Modules):

iverilog 預設會將那些沒有被其他模組實例化的模組視為頂層模組 (top-level modules)。

在你的 tb.v 檔案中,cfg 和 test 這兩個模組都沒有被其他模組實例化,所以 iverilog 會將它們都視為頂層模組。

這意味著 iverilog 會為 cfg 和 test 各自創建一個獨立的實例,位於模擬器內部的一個抽象的 "root" 級別。

即使 cfg 模組沒有被 test 模組直接實例化,但 test 模組可以透過階層式參考的方式來存取 cfg 模組內部定義的訊號。

在 iverilog 預設將 cfg 視為頂層模組的情況下,它會被分配一個預設的階層名稱,通常就是它本身的模組名稱,或是在內部樹狀結構中被編譯器視為一個根實例。

所以,當 test 模組嘗試使用 cfg.num 時,iverilog 能夠解析這個路徑,找到 cfg 這個頂層模組的實例,並進一步找到它內部的 num 訊號。

為什麼這在真實硬體設計中不常見:

雖然 iverilog 允許這樣做並能正確模擬,但在實際的 RTL (Register Transfer Level) 硬體設計中,這並不是一個好的設計習慣,通常會避免。

缺乏明確的連接性: 

在硬體中,你必須明確指定一個模組如何與另一個模組互動(透過實例化和端口連接)。你目前的寫法模糊了這種關係,讓人難以理解訊號是如何傳遞的。

模擬器/合成器行為差異: 

雖然 iverilog 支援這種階層式參考,但其他模擬器或硬體合成器 (Synthesizer) 可能對這種寫法有不同的解釋或根本不支援。合成器在將 Verilog 程式碼轉換為實際電路時,需要明確的連接關係,而這種直接的階層式參考對於合成器來說通常是難以理解和實現的。

可讀性與維護性: 

這種寫法降低了程式碼的可讀性。當專案變大時,很難追蹤哪個模組直接存取了另一個模組的內部訊號,這會增加維護的複雜性。

模組的封裝性: 

模組應該有良好的封裝性 (encapsulation),即外部模組只能透過其定義的端口與之互動,而不應該直接進入其內部存取訊號。直接的階層式參考打破了這種封裝。

總結:

iverilog 允許你的 tb.v 程式碼正確執行,是因為它有足夠的智慧來辨識多個未被實例化的模組為頂層模組,並支援跨層次的階層式參考。

然而,在撰寫可合成的硬體描述語言時,強烈建議遵循實例化 (instantiation) 和端口連接 (port mapping) 的標準方式來建立模組之間的關係,或者使用 參數 (parameters) 或 SystemVerilog 的封裝 (packages) 來定義全域常數,以確保程式碼的清晰度、可攜性以及可合成性。

下面是我回家測試的結果


確實使用 -s 指定 top module 後,iverilog 便會報錯,可見 Bard 沒有騙人XD

2025年6月3日 星期二

Vim profile test


從前幾天買的書中學到一招,可以觀察 Vim script 的函數執行時間。

目前不確定 SELF TIME 有沒有包含 count 的?

2025/06/03 晚上更新

回家又做了一次,順便記錄一下相關指令。

:profile start xxx.log
:profile func *
:profile file *


這次抓的是詳細的資料圖,可以看出最花時間的是往回找 module 的那個 execute 指令。

問題就是出在 search 而非是那個 redraw 清理下面狀態列的指令。