pretty code

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 清理下面狀態列的指令。

2025年5月30日 星期五

又上天龍


Vim script 細節雖然大概都知道了,手上也有謎版 PDF 以及英文電子書了,難得再次來到天龍國的天瓏書局,不買真的說不過去,於是我又多砍了幾棵樹了XD

通識課這本我其實只想看其中的兩頁,不過嗎,書本不嫌少,知識不嫌多,還是需要一些東東來傍身?

絕世武功動輒都要練個好幾十年,但是現代人欠缺的就是時間呀XD

2025/06/01 更新

原來上面中間那一本已經有第 2 版的英文電子書了,剛試閱了一下,出版社還很貼心的附上連結,只要傳給他購買證明,出版社便會寄給你免費的 PDF 電子書,那還等什麼XD

於是我的 Vim 藏書加上這本,已經來到 6 本之多!剛好 3 本電子書 + 3 本紙本書XD


2025/06/04 更新

原來外國人也會嘴砲,到現在都還沒收到 PDF 電子書,感覺不好XD

2025年5月29日 星期四

Download UNC files to WSL2 folder

今天遇到一件怪事,差點以為是客戶給的東西裡面的東西,搞了半天居然是因為標題所描述。

當我們把 UNC files 複製到 Windows WSL2 folder ( \\wsl2.localhost ) 時,不知為什麼會產生 xxx:Zone.Identifier 的檔案。 

還好我突然福至心靈的去檢查原始資料,不然就糗大了XD


2025/05/31 更新

即使從 \\wsl2.localhost 裡面複製到 \\wsl2.localhost 其他位置,一樣會產生這個檔案。