pretty code

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