pretty code

顯示具有 工作 標籤的文章。 顯示所有文章
顯示具有 工作 標籤的文章。 顯示所有文章

2026年7月4日 星期六

關關難過關關過

為了 debug netlist simulation 問題,我已經花了快兩個星期的時間。

當然不是全心全意的只做這個,中間還需要分心處理別的問題。

總之,這個問題已經困擾了我兩個星期。

今天終於有一點曙光了,筆記本在公司,只好在這記錄一下了。

- RTL 可過,netlist 失敗。
- Only MBIST 可過,MBIST + Scan 失敗。
- 跟 MBIST EDA 版本無關。
- 降頻到 100 MHz + Version 2025 也是失敗。
- 出問題的 SRAM 所有 input 相關都比 RTL 快了 0.5 ns。
- RTL 針對那顆 clock gate ( 需 define power domain 那個 ),x -> 0,故造成 RTL 晚了 0.5 ns。
- Repair Pre 沒有失敗,Repair Post 跟 BIST Pattern 有一樣的 mismatches,但 GO Check 沒問題。

 真是個 borning 的工作,我好想 coding 呀。

2026/07/10 更新

星期一終於找到原因,原來是某個 clock gate TE 連線到 always on 的訊號,這導致 MBIST 行為都不如預期,因為 BIST CLK 應該要開開關關才對。

同理,那顆 SRAM 的 input 訊號差了 1ns 並不是造成失敗的主因,雖然這跟我想的不一樣就是了?

但是一些關鍵點的時間戳,比如 Pattern 開始時間,測試結束時間,RTL 和 netlist 的時間倒是一致。

勿在浮沙築高塔,古人誠不欺我也。

2026年6月17日 星期三

大道至簡,唯有 Python

雖然可能也許 Maybe,我最喜歡的程式語言還是 Go?

但不得不說,Python 能找到的程式碼最多?

為了 power  domain 的關係,我得宣告不同名字的 module code。

上次的 cell 只會傻傻的複製貼上,真枉費我寫了 20 年的程式。

如今又需要一堆這樣的 cell,這次總算想到要用程式來生成。

但昨天為了趕在 license 過期的前夕,快速完成某項功能,就用最笨的 print 來做,反正配合 Vim + 現有的 Verilog 也花不了幾秒。

昨晚一夜未眠,趁現在精神好,趕緊來找一下正解。

原來這樣即可。

2026年5月31日 星期日

颶風翻了身

好景不常,繼上次「閒適臥雲中」般的順利推 Code,這個星期說是跋山涉水,披荊斬棘也不為過。

首先,星期三的會議,以我破英文對客戶說話的理解,好像可以先跑測試,之後如果沒有更新,其實不用再跑?

但此番理論跟我從 git hook 看到的禁制似乎有所違背?

果然,不管你有沒有跑完測試,git push 就是要你再跑一次,但我實在沒空把整個 hook 看過一遍,也許答案藏在測試的 Makefile 中也說不一定?

總之,星期三晚上的推 Code 果然還是因為有人比我早更新而導致我推 Code 失敗!還好,當天還算幸運,第二次就順利推 Code 成功,故我當天就又推了一次,本想這樣一來,我六日就可以先不推 Code,於是當天又搞到 2 點才睡,

無奈,本週還是要推 Code,但想到可以讓同事以及專案流程順利一點,還是默默地從星期五晚上開始推 Code,也許可以像星期三那樣走狗屎運也說不準?

本週測試項目來到約 13X 個,就在順利跑完 120 個左右後,一來是剩餘測試卡住好久,二來是我在另外一個 reference 資料夾檢查的結果已經有人又推 Code 成功,於是就不等了,凌晨 12 點半就上床睡了。

不知是不是心懸測試結果的緣故,半夜四點醒來後就睡不著了,忍到七點多吃完早餐才進去客戶工作站檢查結果,沒想到測試居然還沒跑完,因為已經知道不可能成功,還是按下 Ctrl + C 停止所有測試,沒想到這是個不對的方式,直到後來才發現後果?(推 Code 有問題要停掉,一定要用 bkill,不能 Ctrl + C

因為星期六通常還是有人推 Code,故我的 SOP 已經改成星期六晚上 8 點後再視情況決定推 Code 事宜!

星期六晚上 8 點過後,距離最後一個 commit 已經有一段時間了,應該暫時沒人推 Code 了,故還是勇敢的 git push。

沒想到在剩下 1X 個項目的時候,測試又被卡住了,檢查一下 git commit 情況,已經有人截足先登了,於是決定取消,但這次用 bkill 終止所有測試。

星期日一早又看到一堆 git commit 的更新,說真的我也無從判斷該不該做,想了一下,還是默默地跑了下去。

老樣子,測試又卡住了,嚴格來說,是跑工作的 Server 都掛了,這似乎已經是常態了?

還好剛剛所有的測試都跑完了,只是要上傳的時候,一直跟我說 Git is locked?

等了幾次重試後,突然靈機一動,感覺跟星期五強制 Ctrl + C 有關?

於是火速回頭檢查禁制,果然此訊息是腳本本身的訊息而不是 git command 的訊息!

總之,此腳本推 Code 時,會產生一個 /tmp/git-push-2 的檔案,腳本以此檔案來避免有人同時推 Code。

檢查的結果,果然所有人是我,檔案建立時間就是星期五晚上的時間。

果斷的砍掉檔案之後,跑一跑突然又出現一個錯誤,然後整個腳本就結束了,本來以為又要重推了,髒話都要罵出來了?

還好後來想了一下,這個錯誤應該是 git 想要幫你重整 db 的動作,不影響推 Code 結果。


最後終於脫離了從星期五晚上執行到剛剛的鬧劇,真是不堪回首呀?

唉,少點心眼都不行,還好我曾經是一個貨真價實的軟體工程師,不然真的會被搞死,六日原本的計畫又泡湯了,幸好早上監控推 Code 時,順手把 Android PDF Viewer 完成,不然真的會幹到不行。

2026年5月24日 星期日

閒適臥雲中

這個星期又坐在電腦桌前面推 Code 了。

昨天難得順風順水,不用解 patch issue,不用管 make build issue,重要的是每個測試都能夠順利通過。

於是昨天便違反 SOP,大膽的給它用力推 Code,直到今天凌晨 3 點才睡。

這才對嗎,既然用了不合理規則擋我路,至少要像這樣順順利利,我才會心甘情願XD

昨天下午推 Code 前,去了一趟 IKEA,買了幾件小物,整理一下書桌,套句《劍來》的術語,這樣的環境才有助於聚集天地靈氣,養育我這一小方天地。

麻將大俠曾說:人品好,牌品自然好。

我要求的不多,每次推 Code 就像今天這樣就好了!
 

待會終於有時間玩一下暗黑 2 了。

2026年5月4日 星期一

呼山不來去就山

既然沒人能幫助我避開這件事,我只好想個 SOP 來遵循。

只要不滿足我的前置條件,我才懶得管能不能推 Code 成功。


假日應該開始有時間做自己的事吧?

2026年4月9日 星期四

雜訊

今天本來準備要來做一個之前因為 design 還未 ready 的 block,好不容易比對好 sram 種類,正準備插入測試電路,就遇到 read design 的第一個問題,還在思考要如何解的時候,同事問了我一個問題,他的環境跑 synthesis 似乎出了問題,無法產生該有的檔案。

沒想到就是這個問題,花了我快 3 個小時才找到 root cause,確實值得好好記錄下來。

我們登入的環境,會隨機分配,大部分都是分到前兩台,似乎從昨天開始,開始有機會被分配到第 3 台!

本來只是不同主機,並沒什麼大不了,偏偏就只有該位同事在那一台工作會出事!

這是第一個誤區,也是追查問題過程中的雜訊。

既然同事有問題就是有問題,應該要想辦法試著在我這裡也重現問題,而不是一直往該位同事的環境或資料夾方向去確認問題!

雖然這只是事後諸葛,我也不確定早上真的這樣做就可以更快找到問題?畢竟這個問題非常神奇XD

總之,就在我嘗試從環境,變數,資料夾等方向去解決問題,但仍然無法收斂問題後,因為我也沒招了,便請同事發個郵件給 IT,詢問到底哪裡出了問題?

就在我上廁所的當下,突然覺得還有一個可以嘗試的步驟,於是便請同事確認執行後是否有額外的錯誤訊息可參考。

可惜的是,錯誤訊息還是那些原本就從 console 可以看到的,執行這個步驟並沒有更多的資訊可供回饋!

就在我回位子嘗試的當下,我居然也撞出跟他一樣的問題了,真是恭喜老爺,賀喜夫人。

Debug 最怕的不是不知如何解題,而是無法重現問題!

有了一樣的問題那就好辦,雖然當下我也覺得跟事實衝突,明明那個步驟我也曾經成功產生檔案過?

還好後來馬上發現,那個檔案原來是一天前就產生的,換句話說,過去的一天內,我跟其他貌似成功的同事其實都已經發生問題而不自知!

我們之所以可以成功,那是因為該步驟只檢查檔案在不在,並不在意檔案是不是當下產生的!

所以那些一天前的檔案,其實有點 cache 的意思在?

剛好在幫同事確認問題的過程中,有看到登入的 script 被強制指定到第三台主機,修改的同事也有寫了註解,敘述修改時間為一天以前。

於是真相大白了,問題就是發生在第三台主機,雖然我同事環境還是有他的問題在XD

所以同事的環境問題是第二個雜訊,浪費了我不少時間。

總之,Debug 的同時,也要避免被雜訊影響,這是我今天學到的教訓!

不過,雜訊發生的當下,其實你很難知道那就是雜訊本人?

所以,以後要 Debug 時,應該還是要以重現問題為優先才對?

直到寫作當下,本人也還沒有正確解答就是了?

好不容易解決了同事的問題,快下班前終於可以好好的來看我自己的問題。

沒想到解決了第一個問題後,後續又冒出了好多個問題,解決第二個問題後,我也累了,決定下班打東東了XD

2026/04/10 更新

給 Gemini 的提示詞:工程師 debug 時最怕遇到雜訊,一不小心往往容易陷入死胡同而不自知。一個有經驗的工程師 debug 應該要像古人庖丁解牛般的抽絲剝繭,手起刀落,真相自然也就浮出水面。


使用 Pro 重生。


2026/04/10 下班更新

原來我唯一知道的就是我什麼都不知道!

本來以為昨天的問題已經告一段落,沒想到居然冒出新的問題?

原來我昨天看到的並不是事件的全貌!

昨天知道第三台主機雖然無法產生檔案,但是可以沿用舊檔案,因為我們目前就是要鎖住在 git 某個版本,而我們不是 designer 也不會去修改 RTL,所以使用舊檔案確實是 5566 的無所謂。

但昨天在第三台主機執行時偶爾驚鴻一瞥看到的錯誤,確實是個警訊無誤,只是當時並沒有想太多XD

今天 IT 回覆後,又產生了新的問題,還好客戶 IT 很給力,在幾封書信往返之後,終於讓我看到事件的全貌。

客戶在某個資料夾下會有一個儲存環境變數的檔案,這麼說好了,前兩台主機用的是一套,第三台主機用的又是另外一套。

因為一天以前大家都在前兩台主機工作,故這個儲存環境變數的檔案繼續沿用並沒有什麼不妥。

但當我們現在被強制登入到第三台主機,此時這個檔案就不能繼續沿用了,如果不砍掉重新產生,就是會有那麼多奇奇怪怪的問題。

這也是我昨天一直無法收斂問題的原因,因為我跟我同事觀察到的現象一點都對不上。

原來因為他前天不在,故他晚了我們整整兩天 git clone 新版本,理所當然的他並沒有那個環境變數檔案在新資料夾中。

理論上,雖然他晚了兩天,但因為他也是登入到新主機,故兩者都是新的,自然應該百毒不侵才對。

壞就壞在,我們的工作性質會殘留很多終端機在工作站中,我個人還算好一點,做完的工作我就會順手關掉終端機,但同事似乎無此習慣,此時只要在舊的終端機中執行並驗證環境,就會讓這個問題更加發散而無法收斂。

2026年3月25日 星期三

回憶過去

人老了,總是會突然想起一些以前的事!

還好以前沒有什麼豐功偉業可回味?


剛剛無意間在硬碟隨便翻翻看到的,真懷念那一段每天寫自己的工具幫助日常工作的日子呀。

其實是快被客戶的 make sanity 搞瘋了,好幾天了都還沒修復是怎樣,害我到現在還不能自己推 code。

想要自己嘗試去修復它,坦白說最新 make build 的錯誤也是我自己修掉的,但針對這個 simulation 錯誤我還看不出來錯在哪裡?

不過以 Log 莫名奇妙的就斷在某行來看,系統應該是 crash 了?

配合他的 verilog 行為來看,感覺像是去讀 AI 模型然後在 memory 想要做些事?

嗯,然後我也不知道要怎麼修復了?

我要是那麼厲害,我就去 Google 了XD

雖然現在我也不喜歡 Google 就是了,Don't be evil 呀!

2026年3月11日 星期三

我要 git commit 呀

快被 git conflict 搞瘋了,每次拉 code 都會有 git conflict,修到後來我都覺得我把環境搞爛了XD

這一個多月來也不算沒有收穫,至少多了解一下客戶是如何做事的?

不得不說,這個客戶的 flow 深得我心,有很多東西可以借鏡!

唯一的缺點就是英文太差了,溝通上有痛點XD

下次還是分配對岸的客戶給我好了,臣妾做不到呀XD

以下圖片來自 Gemini Web 產出


要當個趁職的 AI 圖片師還真不容易,第一張也是最好的一張,其他請他改只會越改越糟,付費版本這樣的表現有點落漆。 

2026年3月6日 星期五

英文差真的很糟糕

Debug 問題時最怕的就是先入為主,這會導致你身陷死胡同而不自知。

今天同事遇到一個問題,乍看之下,我一直以為是 file_list 這個檔案找不到?

我從檔案權限,檔案內容是否有不合法字元,LSF Server 權限問題,甚至是一個一個確定檔案是否有存在?

下班時間已到,但是找不到原因實在是不甘心,故多留了一個小時,雖然最後只找到 work around 解。

晚餐吃飯時雖然在看小說,但還是在心裡反覆琢磨可能的原因?

回家後繼續奮戰,終於讓我發現是我英文太差XD

人家清清楚楚地告訴你沒有 design,但我一直以為是 file_list 這個檔案找不到。

總之,適時的放空自己從頭再來,只要不是超自然現象,一定可以找到答案。

哈,這星期最爽的時候就是剛剛找到答案時的喜悅。

2026/03/07 更新

AI 就不會有先入為主的誤區,用個簡單的小例子,分別請兩個 AI 回答,兩個都可以順利找到答案。

可惜的是,我必須多發一個 request 告訴他不用檢查個別檔案是否存在,畢竟那是在遠端工作站。

總之,以後發生問題,一定要好好看清楚錯誤訊息,不要先入為主。

2025年7月6日 星期日

人的記憶力很不可取

早上連回工作站確認昨天測試結果,順便試一下還沒測試的參數。

突然無意間發現,似乎有一段 code 沒有整理到之前簡報?

馬上回去 review power point,沒想到我當初就有寫進去?

完全不計得有這回事?

最近測試很不順利,從上星期四晚上 debug 到今天還不能跑過所有的 PHY test!雖然這星期又多過了 2 個測試項,但還是覺得很阿雜。

我想應該要靜下心來好好重頭看過所有的文件,不要先入為主的認為沒用就心不在焉的看過!

就從我整理的 power point 及 word 文件開始好了,畢竟就連我有寫過的我都忘記了XD

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月22日 星期日

第一次覺得 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

2024年11月12日 星期二

怪事年年有

今天突然收到 IT 的資安警告信,意思是 Google Chrome Cache 資料夾偵測到類似木馬程式的東西!

印象中前幾個禮拜忙著 PAD Placement 時,Windows 就跳出過兩次警告,一次是 10/25 ,另一次是 10/29,為了這個,還把 Chrome 所有資料都刪過一次,沒想到今天居然又出現一樣的警告?

不敢說 8 個小時都在上班,但至少一天都認真工作 7 個小時以上,所以上的網站應該都是跟 Search IC 設計有關的!沒辦法,很多時候沒有文件,也只能透過 Google 找尋靈感。

如果以 10/29 以後為分界,我上最多的應該是全球最大男性交友網站 - github.com?

奇怪的點是,從年初來到這個新部門,上網找資料模式並未改變,之前為了查資料也很常上大陸及外國網站,但偏偏從 10/25 才開始陸續跳出警告?

之前第一次跳出警告,應該是忙著跟 OpenROAD 奮戰,故沒有看到什麼訊息就被我不小心按掉了,後來在事件檢視器及 Defender 頁面查了半天,都找不到警告訊息來源,也是透過 Google Search 才知道,Defender 事件是位在下面位置:

事件檢視器 -> 應用程式及服務記錄檔 -> Microsoft -> Windows -> Windows Defender -> Operational。

從這裡有記錄的時間得知,這邊的 Log 資料,最早日期可以追朔到 9 月初,應該是剛更新完電腦系統沒多久,故才沒有更早之前的記錄。

但問題來了,既然上網模式沒變,為什麼會跳出此訊息?

目前只能想到 3 個原因:

01. 被電腦或手機的 Chrome 同步到公司電腦,但這兩個地方我很少上網,大部分都是在滑 PTT。
02. Windowd Defender 誤判。
03. 大陸或國外網站真的有問題。

但工作又不可能不 Google,至少我現在還是菜鳥,不可能不上網找資料!

同樣也只能想到 3 個解法:

01. 自己租用 VM 專門用來上網查資料。
02. 買台小電腦帶去公司用手機網路查資料。
03. 乾脆就不查了XD

明明就很認真工作,今年居然收到兩次資安警告信,真是莫名的冤屈XD

2024年9月14日 星期六

2024 week 37 新玩意

01. 不要太相信 EDA 文件

我是不知道 EDA 授權金額多少錢,但 EDA 文件普遍寫得不好倒是真的,看起來寫了很多,但對解決問題沒啥幫助,不然就是文件寫的跟指令實際行為有時候會對不起來。

不過前提是文件要先從頭到尾認真看一遍,最好要看 2 ~ 3 遍,如果還是覺得哪邊怪,那恭喜你,你不孤單XD

02. 除非特例,少用 GUI mode,不然容易當機

我們跑的設計應該很小,但我這星期就遇到當機 2 ~ 3 次了,原本都以為是該指令要跑很久,後來越想越不對勁,去 EDA license 頁面確認,果然該 license 已經沒有被占用,資源是已釋放的狀態。

我猜,EDA 應該有另一個 thread 定期回報授權主機,避免當機占用 license,畢竟授權不便宜。

因此,不管是在哪個模式下,如果覺得 EDA 好像當機了,給它個面子等個 30 分鐘左右,如果從授權主機看不到你的使用授權,就可以放心地使用 kill 砍掉該 process。

印象中,top 指令看到都還是 run,而不是 zombie?

03. EDA 相關工作要建立 SOP

EDA 動不動就要跑很久,錯了再來一次的時間成本很寶貴。

要做什麼之前最好先想好,檢查再檢查,最好有 check list 可以檢查。

Vim、Shell Script、grep 各種技巧要不斷精進,這都是可以提高工作效率的投資。

要建立自己的工作模式,比如開幾個工作視窗,要不要用分頁,視窗要擺在哪邊,養成下意識的動作,做起事來會比較流暢。

2024年6月12日 星期三

關於 Verilog parser 這件事

連假都在盡最後努力讓自己的聖騎升上 97 級,再加上手上沒有那樣大的 netlist 檔案,所以放假三天就在打電動中渡過了XD

昨天一早就用 cProfile 確定最慢的執行函數是什麼?果不其然,前三名是 PLY yacc.py - parseopt_notrack、 PLY lex.py - token 以及 re.match,第四名 pyverilog parser.py - p_items 看起來貌似 constructor 沒錯?


光前三個就跑了 25 分鐘以上(cProfile 會增加程式執行時間,跑起來要更有耐心)。

要細究是哪個段落花時間只能 print message 了,但我想幫助不大,因為 PLY 應該已經是 Python 最有名的 lex/yacc solution 了,要優化應該也不是一天兩天的事。

順便實測其他 EDA tool 的花費時間,原來也不是我想的秒等級!

雖然這樣比有點不公平,比如 DC 還需要知道 cell library,還有不論是 DC or yosys,貌似 read_verilog 不只是 parsing 都還順便建立了 RTLIL 中介層,應該是比 pyverilog 只用一般資料結構儲存花時間,但也只能這樣比較了,畢竟我已經無法再細拆 command 了。

同樣的 netlist 檔案,花費秒數如下:

DC - 191
yosys - 380
pyverilog (建完語法樹) - 1546,離開程式 Python 釋放記憶體又花了至少 100 秒。

嗯,果然還是有一段差距。

2024/06/18 更新

透過 cProfile 分析得知,parser 花了很多時間做 match,撇開 C vs Python 語言差異不談,最快的解決方式就是只要處理 netlist 語法即可,不需要處理整個 Verilog 語法。

稍微查了一下,只有看到 C 語言版本的 netlist parser,再加上看 EDA 文件真的很 borning(EDA 文件都要真的操作才有感覺,還沒碰過的光看文件,坦白說收益不大),所以還是自己來吧。

從上星期五開始,扣掉家裡有事請假外,總共花了 16.5 小時使用 Python 實作。

概念也是非常簡單,我有一個函數負責取得以分號為結尾的字串或是 endmodule 關鍵字,這裡我稱呼它為工作字串,再來就是對工作字串做比對,只要分別針對 module,port,net,cell instance 處理並儲存結果即可。

目前暫時還沒想到 assign 要儲存啥以及偷懶不想處理一維陣列以上的情況,其餘我知道的語法都已處理完畢。

開發時間分析如下:

得到可以工作的字串 - 2.5 小時
使用 Rex 處理所有語法 - 8 小時
將儲存的資料結構轉成 pyverilog 的輸出格式 - 6 小時

程式碼行數:

得到工作字串 - 89 行
輸出 Verilog - 149 行
Rex 處理及其他 - 455 行

程式執行時間:

單純 parsing 及儲存 - 225 秒
輸出 Verilog - 56 秒

下面則是我的 netlist parser cProfile 結果:


目前還算滿意XD

雖然從結果來看,還是有進一步優化的可能性,但我覺得最多不可能再減少超過 50 秒?

就算再減少 50 秒也沒意義!我只有處理 netlist,不像 EDA Tool 處理整個 Verilog 語法,這樣的 parser 跟商用軟體比還是有段距離,但貌似我的工作大部分應該還是針對 netlist 做事?

個人還是覺得 lex/yacc 的方法比較正統,不像我的 code 為了解決縮排,使用者 Code 亂以及空白字元等問題,需要一些 if/else 來處理(取工作字串 89 行程式碼中,大部分都是在處理這些事情),這樣的 code 看起來也不開心XD

2024/06/21 更新

前天進公司後,想了一下還是加上多維陣列的功能,大概花了不到 5 分鐘吧。

沒想到這兩天拿它來試試其他手上有的 netlist,陸續又發現了一些問題,也順便修了 pin net 中,有 range 及 array 情況下,Rex 沒下好導致 capture group 抓取不正確的問題,昨天下午看了 Verilog 2001 Spec 後還發現我搞錯順序了,應該是先陣列才是 range,目前應該都沒問題了吧?

為了這個多維陣列,code 多了 30 幾行,程式執行時間也多了 20 幾秒,目前 parsing 大概要跑 245 秒左右。

單純 parsing


單純 parsing 加上處理多維陣列結果


最後想嘗試一下把我這個 parser 用到之前拔電路的小程式中,一般來說,我有兩個選擇:

1. 將我目前用的簡單資料結構轉成 pyverilog ast 結構再加上個別 class visit function,這樣我不用去改原本的 code。

2. 配合我 parser 用的簡單資料結構改寫我原本的 code。

目前是嘗試使用方法二,今天應該就能知道結果了。

對了,這個 600 多萬行的 Verilog,我的 parser 執行時會用掉 10G 多一點的記憶體,離開好像也是要花個幾秒等記憶體釋放。

跟之前用 pyverilog 的小程式比較,大概快了 35 分鐘,也不枉費我這幾天的努力XD


我的程式總共建了 9 條 Rex。

因為我的程式把行打散了,故我無法得知行數資訊,先前簡單用個 group 概念好讓自己的輸出接近 pyverilog 格式。

之前是用 yosys read_verilog + write_verilog 方式來驗證我的 parser 正確性,我們可以用 design -reset command 將兩個要比較的檔案寫在同一個 script 讓 yosys 幫忙轉檔,同一個檔案,讀加寫要花 30 分鐘(沒記錯的話,寫檔就花了 20 幾分鐘)。

由於之前就知道要怎麼改,故最後還是把 module.port_list 再包一層,裡面儲存另一個 list,這樣我就能讓同 group 的在同一行輸出,加上這個功能之後,我的輸出基本上就跟 pyverilog 一致,除了多維陣列還未驗證過 pyverilog 格式長怎樣。

也因為這樣輸出 verilog 函數行數再度減少,最終版本 parser 包含測試 main 函數只有 701 行(先前的行數統計也是包含 main)。

目前只剩一個謎題待解?

我能理解 pyverilog 因為比對緣故所以花了很多時間,但為什麼單純輸出 verilog 也要花上 10 來分鐘,對比我的 60 秒確實是有不小的差距!我猜 pyverilog 應該是使用 template file 方式產生 verilog,故浪費了很多時間在 File IO 。

其實 yosys 寫檔時間比 pyverilog 還更誇張,我能想到的就是它又二次轉了資料結構以利 verilog 輸出?

剛剛看了一下,輸出是在 yosys/backends/verilog/verilog_backend.cc 這支檔案,看起來是用 RTLIL::Design *design 來儲存整個 netlist,並直接用 std::ostream *&f 寫到 output,看來想知道事情緣由還是要把整個程式碼看過一遍才行。

2024/06/23 更新

快速的看了一下 yosys code,backend - write_verilog 呼叫順序為:

yosys/kernel/driver.cc - main 函數入口
中間未看…
yosys/kernel/register.cc - Backend::execute(這個應該沒有,因為被 verilog_backend 繼承了)
yosys/backends/verilog/verilog_backend.cc - execute,這裡會呼叫 Backends::extra_args,裡面會把 
原本是 NULL 的 std::ostream 在這裡開檔,之後便能寫檔了,這也是為什麼 execute 會接受一個 std::ostream *&f 的緣故,因為需要在這裡 new instance。

2024/06/25 更新

yosys 可以吃 tcl script file,故有用到 Tcl 提供的介面,script 裡面要執行的 command 其 callback 在 kernel/yosys.cc - tcl_yosys_cmd。

在 Pass::call 的過程中,便會呼叫到繼承 Pass 的相關 struct。

2024/06/26 更新

沒用 C++ 寫過大型程式,別說你懂 C++!

從以前到現在沒有認真記過 C++ 語法,導致看 yosys code 很吃力!很多執行順序不是現在的我看的出來的!

The virtual function of base class means inheritance class can override it, you could use override to tell compiler the function is overrided.

baes - virtual void function( )
inheritance - void function( ) override {}

The virtual function of base class equals 0 means the base class can't be created. The inheritance class must override this function.

base - virtual void function ( ) = 0
inheritance - void function ( ) override {}

另外,如果 class 有 static function,其 各個 Pass constructor 會在 main 之前就被呼叫,可能要看 C++11 3.6 節,這是我用 gdb 單步執行才發現的(我的理解可能有誤,至少我另外寫支小程式看不到這個現象?)。

kernel/register.cc - struct Pass 有一個成員 next_queued_pass,在 constructor 時會被設定,然後透過 register.cc global variable - first_queued_pass 記住最後一個 constructor 的 Pass。

接著 main 函數中會呼叫 yosys_setup,裡面會再呼叫 Pass::init_register(執行順序會倒著回來,之前的 first_queued_pass 記住的是最後一個 Pass constructor,沒記錯的話是 techlibs/sf2 - SynthSf2Pass)。

Pass::init_register 裡面會再呼叫 Pass::run_gister。

然後就是對 global variable - pass_register 設值,map 用的 key 就是 pass_name。

之後假設是執行 script 裡面的 command,最後就是在 Pass::call 裡面利用 pass_register 去執行該指令(pre_execute、execute、post_execute),這樣又會回到繼承 Pass 的 struct 裡的 execute 函數(backends/verilog/verilog_backend.cc - execute),因為已經被 override 了。


看到這邊對 yosys 怎麼呼叫有感覺了,應該不會再看下去了?

另外,今天針對同一個 netlist 呼叫 yosys read_verilog and write_verilog,真的要花 31 分鐘左右,這樣看來寫檔真的要 20 幾分鐘跑不掉。

接著把 yosys 儲存的 netlist 再用我的 parser 測試,parsing 時間又增加了 20 幾秒,寫 netlist 還是差不多 60 秒左右,總花費時間大概是在 360 秒內吧?

pyverilog 總執行時間則是暴增到 54 多分鐘(3275 seconds)。

其實這也很容易解釋,yosys write_verilog 對每個 wire declaration 都是單獨一行,故增加了 parsing 時間也是尚屬合理。

原本 netlsit - 340M,  618 萬行。
yosys netlist - 390M, 2166 萬行。

2024/06/27 更新

終於知道為什麼繼承 Pass 的 struct 都會在 main 之前 call constructor 了!跟 static member function沒有關係。

yosys 在每個繼承 Pass 的 struct 最後面宣告處宣告了一個 global static variable,所以才會在 main 之前 call constructor。

以工作站的 yosys 版本來說,總共有 235 Pass 被初始化了。

也就是下面圖片 Line 9 做的事。


下面是 GDB 下中斷的結果


我們可以用 grep -E -r '^\}\s*[a-zA-Z0-9]+\s*;' 找出所有這樣宣告的 Pass,這裡以 backends 為例。


2024/07/08 更新


parsing 106 秒
save netlist 22 秒

對比 Python 版

parsing 268 秒
save netlist 60 秒

搞定,收工XD

2024年6月8日 星期六

2024 week 23 新玩意

01. DC log level information

這兩天突然發現自己移植的 DC script 居然都沒原始專案的 log 輸出?明明該有的 output 檔案都在,但不論是螢幕還是 log 都看不到執行該 command 的顯示!

本來以為是自己多下了一個 tee -i 的參數,從 man 中又看不出有什麼關聯?

終於在昨天中午想通了,一般來說,我們會用 -f script 的方式來執行 DC,如果該 script 裡面有 DC command 便會顯示執行結果。

但我的 script 裡面又帶了一層 script,我真正的 command 都是位在第二層,所以當然什麼都看不到,也算是學了一課。

02. MBFF 

2010 我就有看到台大學生的論文在研究這個,所以應該不是新東西?難道 IC 產業是學術跑在實務前面?

03. Verilog Parser 待釐清事項

之前有簡單寫個用 Rex 來 parsing netlist 的 parser,雖然我只是測試抓取的部分,並未實際去產生對應的資料結構來儲存資料,實測的結果都不需要 3 分鐘。

昨天拿最近用 DC 跑完的 netlist 測試一下,速度依然很快,但在我只建 3 條表示式的 rule 中,就有兩條有些 statement 語句判斷不到,印象中我有處理 escaped identifier 這塊,DC 又有 rule command 可以避免使用奇怪的命名規則,理論應該會比 yosys netlist 來得好才對?改天 EDA 文件看煩了再來試試。

回到 pyverilog 本身,使用 lex/yacc 的方式應該是最正規了,問題是出在 match token 速度才那麼慢嗎?還是在 Python 建資料結構時 constructor 拖慢了速度?

明明其他 EDA parsing 都只花了不到 5 分鐘,難道只是 C/C++ vs Python 的差異?

昨天沒想到,現在 Profile 功能應該已經內建在 Python3,跑一下就知道原因發生在哪?

04. Windows 11 升級

最近微軟不知又發什麼神經,Team Classic 又要改版,偏偏新版又跟著作業系統,而我的電腦就是屬於需升級的那批。

之前為了加速開發,自己買了一顆 SSD 當作業碟,才發現空間已經用了快一半!既然現在已經轉部門半年了,很多軟體跟資料都用不到了,便趁此機會把軟體都移除,目前已用空間還有 15X G,但已經比之前好多了。

不過貌似 Windows 11 升級檢查軟體在 IT DC 環境下不能執行?所以我也不知道是否能升級,但單以 CPU 來看我的 10 年前電腦應該是不在支援清單中。

算了不升級也好,還要浪費半天時間不能做事,抱電腦回來又要再花半天整理工作環境,幸好目前部門我只需要 Vim,Python 跟遠端登入軟體即可,應該不用像以前一樣一堆東西要裝。

下次線上上課只能用 Team Web App,但要記得使用 FireFox,不要用 Chrome,不然就會像某年上資安課一樣一直斷線,被人事判斷沒有上課,導致一樣的課上了兩次,追根究柢都是微軟寫的軟體不好XD

2024年6月7日 星期五

AT 叛客

昨天差點被當成不法分子,真的是好氣又好笑,以後不那麼認真了XD

有鑒於 EDA 或是跟 IC Desing 有關的工具使用,動輒都是好幾個小時或是天起跳,連個 Verilog Parser 都要快半小時!

昨天不知為什麼突然想到(應該是一直看 EDA 文件很容易分心XD),既然純 Python code 很慢,用像是 PyInstaller 的工具包成執行檔後,執行速度是不是會比較快?

印象中之前有寫個等公車的小程式,裡面就有使用 PyInstaller,我就不用再去找參數怎麼用了,下載下來後,一執行安裝 batch,Windows Defender 就一直跳出警告,說是判斷有病毒,稍微查了一下應該是被當成惡意程式,調整了參數,還是會被誤判,後來去忙別的事我也就忘了XD

下午 4 點多時突然接到 IT 郵件,說是發現在執行惡意程式,於是寫信回復事情發生原由(突然想到,郵件裡有 CC 主管嗎?昨天沒特別注意,沒有的話要報告一下)。

原來我已經轉型成駭客我都不知道了XD

對了,昨天是自己耍白癡,PyInstaller 只是包成執行檔,並沒有重新編譯,應該是對執行時間沒有幫助,昨天不知道為什麼會突然覺得有用?一定是太久沒寫程式,腦袋都僵化了,來到新部門後,似乎還沒發現寫程式在這邊有甚麼用?可能是我還太嫩了吧,目前只感覺這些東西很吃經驗,至於能不能寫程式幫助其他同事,我還真的不太肯定XD

突然好懷念 AT 叛客這個暱稱,離開會計本業也快 20 年了,現在的路也不知道到底走得對不對?

後記

用家裡訂閱的小紅傘測試了一下,也是跳出差不多的警告,這樣我就放心了XD

俗話說的好,寧願錯殺也不要錯放,畢竟不管是家裡還是公司電腦,都是拿來做事的,最怕的是什麼都偵測不出來,這樣我才會害怕XD


話雖如此,昨天下班前還是不放心地針對整個 Python 安裝目錄掃瞄了一下,理所當然的是回報沒有問題?

唉,程式設計師不可能永遠自己造輪子,現在第三方函式庫又常有漏洞,除了有專門的團隊每天去追蹤這些資安資訊,一般程式設計師還記的自己用過什麼函式庫已經很厲害了,怎麼可能還定期去看是否有更新,自己沒待過像是 Google 這樣的大公司,不知道他們都是怎樣解決的?

2024年2月26日 星期一

cell library parser

看了好多天的文件,有點阿雜XD

因為工作站無法自行安裝 Python module,想要檢查 cell library 的目標一直無法達成。今天簡單用 regex + stack + FSM 寫個 parser,parser 部分花了 3 個小時,另外又花了半小時將之前用 Python module 寫的 code 複用。

兩個 Open cell library 檔案加一個 TSMC cell library 看起來都可以 parsing,只是不知為何工作站 parsing TSMC 69 M 大小的檔案大概要花 7 秒鐘,可能是先 parsing 到 list 再從 list iterate loop 花了一點時間,但整體還算滿意。

有機會還是要學 Compiler 使用正統的 parsing 方式,雖然要利用第三方工具,但之後擴充應該比較容易?

目前 cell library 這樣的格式看起來擴充性還行?

2023年12月6日 星期三

離職交接真是門大學問

最近最讓我頭痛的一個交接項目是我剛來這家公司參與的專案,這個專案的目的是要管理 Android based 設備,因為 OTA 等特殊操作緣故,我們的 app 需要 sign key。除了 Client 端,我們 Server 端將 API 與 DB API 切開,故整體又分為兩大 Server。

當初我負責的是 DB 部份,一開始只會寫 C 和把 PHP 當 script 的我,對 Web 架構並沒有那樣熟悉,故使用 C 來寫 Apache 的 plug-in,中間使用 FastCGI protocol 來溝通,這樣的好處是 Web Request 流量可以由 Apache 來承擔,只要頭過身就過?當然我自己本身的處理能力要夠快,這部份的瓶頸一開始只會出現在 DB 端,只要 device 數量不要太誇張,理論上都沒什麼問題。印象當初透過模擬器測試,1000 ~ 2000 台是沒什麼大問題,除了上下載的檔案不能過大否則容易 timeout。

因為最新 Android 版本和當初開發版本已經離很遠了,有些 API 或權限改變不能用那都是可預期的,再加上現在都是用 Android Studio 當開發環境,故這個專案交接其實只要知道 Code 跟文件放在哪裡就好,坦白說這很合理,這個專案應該不會再有重見天日的一天XD

但既然要交接,想說至少讓 Server 端拉最新 Code 下來,配合現在 Node.js 等版本,讓他可以無痛跑起來,避免以後真的要用沒人可以處理,這樣也算是我的小小心意。

沒想到就是這個決定,害我邁向偉大航道的計劃一直無法順利展開,假日除了忙家人的事、土炮結構光比較外,其餘時間都在想怎樣讓 Server 在新的開發環境版本下能夠繼續存活,避免改動更多的 Code。

Web Server

這部份是當初前同事寫的,完全都用 Node.js 開發,但他當初離職交接文件有註明:因為要混淆 code 關係,Node.js 只能用很舊的版本(6.X -> 0.12),而目前最新 LTS 版本是 20.10.0。從這可以看出這中間變化一定不小,為了更貼近現況,我決定使用我目前手上的版本 18.X,這是兩年內的版本,還算可以接受,理論上應該要跳到最新版本,但顧慮到其他人手上版本大概也是介於 18.X 前後,便決定使用這個版本。

前同事很貼心的寫了批次檔可以一鍵安裝,但安裝後一直無法順利執行,原本以為是同事離職文件提到的 npm issue,在多次安裝後依然無法解決。後來靜下心來一看,錯誤雖然是說找不到模組,但確實是有安裝成功,還好在經歷了之前幾個交接項目的荼毒,認定是版本問題,去 N 年前的開發資料夾找到版本號並更新到 package.json,大概改動了幾項,執行便不再有問題。故問題的本質是不要用 * 號當版本號。

其實這會有資安問題,但除非一直用最新版本 daily build 每日做檢查,不然隔一段時間一次進最新版的問題會讓你想哭,由於我沒待過像亞馬遜那樣的大公司,我本身也不是寫 Node.js 的,目前還沒想到怎樣的方式才是最好的?

Device Simulator

搞定 Server 後,雖然已經沒有當初的 Android device 可以跑,但 N 年前我寫了一個可以模擬多台 device 的模擬器,雖然我只實作測試 peformance 需要的指令,但拿來驗證 Server 綽綽有餘!

無奈 socket.io 一直斷線,依稀記得似乎是兩邊的版本要一致?老樣子,找到當初 socket.io 相關模組用版本號,同時更新 Server 及 Simulator package 後,這部份就搞定了。

Record Server

坦白說在搞定上面兩項後,我已經一夜白髮了XD

但路都走到這裡了,還是想完成當初內心承諾,於是再接再勵的勇往直前!原本以為這是最簡單的,畢竟是當初自己開發的,沒想到安裝和設定雖然簡單,但透過 UI 設定 Record Server 的最後步驟一直無法成功?

雖然我都有 Log,但全部架構已經遺忘的差不多了,回頭看文件也是一頭霧水,故一時間也看不出所以然,再加上之前判斷錯誤那一行寫的不嚴謹,多往下做了幾個無謂動作,最後將 Log filter 開到最細並且回過頭來從 request 端看到出問題地方的 code,才讓我發現問題不是出在接收端,而是在我必須發 API 給 Web Server 取 token 那端發生錯誤,由於我使用的是很有名的 libcurl 函式庫,故用我當初最粗 Log filter 的關鍵字就可以 google了,而這個錯誤就是 error code 35。

A problem occurred somewhere in the SSL/TLS handshake. You really want the error buffer and read the message there as it pinpoints the problem slightly more. Could be certificates (file formats, paths, permissions), passwords, and others.

從官方文件可以得知問題是出在 HTTPS 握手階段,只可惜雖然我有將 libcurl debug mode 打開,但並未看到更多錯誤訊息。

我依稀聽過這似乎是 HTTPS 安全性政策更新造成的問題,最初的 SSL 早就被禁用,還好我當初就有留指定 TLS 版本的 code,將註解打開並重新編譯執行檔即可。但不論我指定 1.1 還是 1.2,error code 35 依舊發生?

這不禁讓我懷疑是不是又是 Web Server 某些模組版本需要調整?思考了一下,還是看看之前自己來公司到現在寫的測試資料夾裡面是不是有什麼可以快速發 Web Request 的 code 來利用,我應該至少要有 Node.js、Python、Golang 的資料夾可以搜尋?

剛好第一個找到的就是 Node.js example,用的又是內建模組 https,完全是我需要的,這樣可以先排除版本問題XD

不試不知道,Web Server 居然有收到 API?但我還是很不敢相信,還好當初這個專案開發完後,有鑒於用 C 開發 Web Service 真是自討苦吃,故當初有稍微自學一下 Golang,並稍微的開發 Golang 版的 Record Server,雖然只實作了 3 個 API,但剛好也是 UI 打過來的 API,拿來驗證也是綽綽有餘,最後發現我的 Golang 版 Server 也是可以順利的發 API 給 Web Server。

事已至此,我也認命了,一定是 libcurl 的問題,雖然我不知道為什麼 TLS 1.2 會有問題就是?

之前用了好幾個第三方 C/C++ 模組,除了一個是 C++ Template 外,每個都要用我慣用的 GCC 重新編譯。

本想直接使用 vcpkg + VC 來搞定,但鑒於之前的使用經驗,我也不會期待可以一次搞定!幸好天公疼憨人,想到去年當 C++ 講師時,為了讓學員最後一堂課作業方便使用,當初網路爬蟲沒有使用 boost 而仍舊使用 libcurl,記得當初所用版本打開 TLS 1.2 是正常的?

最後直接使用官方下載的最新編譯好版本(8.4.0_9)配合我舊版的 TDM-gcc(9.2.0)也是無痛接軌,且此版本似乎不再依賴 openssl?至少我只有 link libcurl.dll.a 加上執行時期的 libcurl.dll 便可以執行 HTTPS request。

終於整體 Server 架構都已搞定,看著訊息打來打去,DB 也如預期的記錄系統使用率歷史資料,今天只要順利跑過一整天測試,我終於可以完成最後一項交接項目了!

後記

一來辦公室就開始壓力測試,昨天下班前無聊順手點了一下 screenshot 指令,device simulator 居然會 crash,雖然多做了錯誤檢查避開這個奇怪錯誤,但想說還是在壓力測試前試著搞定本來可以用的指令?還好昨天洗澡時就覺得這個問題好像跟兩年前幫另一個同事解決 issue 的狀況很像,都是 multiparty form-data empy?

邊喝咖啡邊看之前的 Tech-Note,看來是 Node.js 14 開始,某些平台 stream 會有問題,指定 multiparty = 4.2.2 即可。

今天終於可以輕鬆一下了,只要測試沒有其他大問題,我可以慢慢地為這最後一個交接項目收尾了,一切真是得來不易呀,畢竟也從上星期開始搞到今天XD

放張多台 device screenshot command result 圖留作紀念。


下午還是花了點時間確認一下 openssl 版本,如下圖所示,1.0.1 才算正式支援。我 N 年前使用的 libcurl link 的是 1.0.0o,這也是為什麼不支援 TLS 1.2 的真正原因。


要下班了,留個記錄先,看起來大部份元件有定期回收機制,故會重啟 process,目前只有我的 Record App 和 node.exe 記憶體增加了,但應該尚屬合理,只有大量且多日的壓力測試才能做更進一步的分析。


2023/12/08 更新

前天電腦沒關機讓他又跑了一天,直到昨天 7 點多下班才關掉所有測試,留下最後記錄XD