pretty code

2024年9月13日 星期五

十三號星期五

這個星期都在跟某個 EDA 奮戰,明明照著文件下了幾個 debug command,結果都不符預期!連想要透過 check point 存檔進入 GUI mode 也無法隨心所欲。

還好我沒聽文件在唬爛,使用快失效 command 的 session 指令存檔進入 GUI mode 以避免重複執行的等待時間。

由於之前還不知道有這兩個 command,所以這星期至少打了 10 幾次 make 有,打久了對 make 每次都有 Error 也不免感到困惑?

原本以為是不是因為 makefile 是從別人的專案來的,故裡面有地方沒有用到 tab 字元?後來拿掉沒用的 target 後情況依舊,我才恍然大悟跟 makefile 本身無關。

網路上查了一下,那是 make 在執行指令時指令本身回傳的,也就是 EDA tool 回傳的。

剛寫了個測試程式試了一下,果然是這樣沒錯,現在只差不清楚為什麼 $? 永遠回傳 2 就是了?

以我的例子來說,make test 執行我的 test_make 時,因為不是回傳 0,故其實 make 也不會往下執行了,因此為了避免 make 不如預期浪費時間,畢竟 EDA 隨便都要跑一個小時以上,我的建議是在 makefile 要執行的指令前一律加上 -@,另外在 makefile 裡面要印出 $?,記得要變成 $$?

- ignore error
@ not display command


2024/09/14 更新

早上不死心繼續 Google 了一下,看到一篇之前就看過的文章,先前可能被 EDA 搞得很累,沒有很認真看那篇文章,但至少是從那篇文章知道 Error Code 是從指令來的。

原來 $? 之所以永遠回傳 2,那是因為對 GNU make 來說,這就表示 make 執行其他指令時有問題,故 make 遇到有錯一律會回傳 2

所以在執行 Shell Script 時,我們只需要關心 return code  是不是 0 就好了。

當然如果你的 Makefile 是在編譯執行檔,Error Code 還是多少有點用處,不過除錯這件事嗎,只能 case by case,沒有一個放諸四海皆準的道理。

另外,昨天建議加上 -@,睡過覺起來覺得似乎也不太對,約耳說,要讓錯出現在錯的地方,忽略它繼續往下走,其實也沒什麼幫助就是。

2024年9月8日 星期日

經營 Github 專案還真需要愛

當初開發了幾個 Kobo 專案,其中 KoboPageturner 已經不太用了,自從去年參考 KOReader issue 討論串後,已經可以直接用我的 Logitecn R500 在 KOReader 翻頁,再加上我的自製硬體翻頁器因為拙劣的焊接技術已經燒掉了,故這個專案可能只剩沒帶翻頁器時,臨時可以用手機充當翻頁器用。

至於其他兩個專案,Clare 2E or Libra 2 一定要上我的 patch 不然不能用藍牙,KoboFileServer 則是拿來 Wi-Fi 傳檔用,故還算是我還蠻常用的兩個專案。

今早收到 KoboFileServer 的 css patch,照該網友說法,似乎在小螢幕上會有問題?

由於我也不是專門寫網頁的人,故我也不太懂我原來的 css 哪邊會有問題,我猜應該是用 pixel 指定字型大小?

我這已經是夠冷門的專案了,到現在也才只有 3 個人發 patch,但想到還要回覆就有點懶XD

要回覆前,我得先自己測試,如果需要編譯我還得準備環境,畢竟這已經是兩年多前的專案了,我的電腦還有沒有環境我都不確定了?

結論就是,要經營 Github 專案還真需要愛呀,還好我不靠這個吃飯,有沒有 stars 我也不會很在意?

左邊是我原本的,右邊是網友改的,本想用抓圖方式,還要搞定無痕模式抓圖的限制,不然就是要裝另一套瀏覽器,想想就懶,直接開筆電相機抓圖就好XD


2024/09/12 更新

前天該網友有回信,原來所謂的小螢幕超出是指上下會出現 scroller bar,想了一下,既然有人有需求,乾脆加上 button 切換,馬上 Google 一番,搞定收工。

雖然我自己是比較喜歡原本的,但該網友有讓表格的字離邊框遠點,確實是比較好看,但預設畫面限縮在正中間導致字體變小,個人覺得是對老人比較不友善XD

2024年9月7日 星期六

消失的記憶

一直覺得有哪件事忘了記錄,剛剛終於想起來了。

我手上 Kobo Elipsa 裝的 Plato 版本似乎有問題,只要沒回到 Kobo 本身 OS,即使 Plato 有進入休眠,但隔天電就會被耗光,不知道是不是跟舊版有關就是了?

又或許進入 Plato 後,預設會開啟 Wi-Fi?導致電被耗光?

我也懶得深入追究了,目前先記得有這回事就好!

又是 Verilog

前幾天為了快速讓 DC 可以往後跑下去驗證環境是否正常,還沒等到樓上同事的回覆,我就已經先改好了,在我看了大神的幾篇 race conditon 文章後,個人覺得從 = 改成 <= 的結果是一樣的,畢竟在那個 T 中,外面取 signal 的其他 module,如果本身判斷處也是 sequential logic,勢必要在下一個 T 才能收到這個變化,不會因為這裡寫成 blocking assignment 就會有所改變,至少我個人目前的理解是這樣。

早上起床後有寫了支測試程式試了一下,看起來跟我想的一樣,但因為早上急著出門,一直到剛剛才有時間整理一下,馬上現學現賣早上學會的分割視窗功能,雖然這邊有點為用而用,畢竟 VIM 本身就可以分割視窗,但這裡真的是分割視窗,視窗分別各開一個 VIM。


畢竟我手上沒有 code,m1 module 是我憑大意寫出來的,但應該有還原出原模組的用意?

m1 out[1:0] 使用 Blocking assignment
m2 out[1:0] 使用 Non-blocking assignment

test1 使用 sequential logic 判斷 m1 out[1:0] 值用
test2 使用 sequential logic 判斷 m2 out[1:0] 值用

test3 使用 combinational logic 判斷 m1 out[1:0] 值用
test4 使用 combinational logic 判斷 m2 out[1:0] 值用


因為我 0ns 沒有拿來幹嗎,故 testbench 在這個時間點都用 blocking assignment。

為了避免 5ns 使用 blocking assignment 跟 clk assignment 產生 race condtion,我將 d 跟 flag 設值提早到 4ns 處,因為我 m1 和 m2 就是要在 5ns 開始判斷訊號做事,不要拖到下一個 posedge clok。  

10ns 雖然也是使用 Non-blocking assignment,但我沒有 negedge clk 的 case,故這裡即使用 blocking assignment 也不怕 race condtion。


從 waveform 可以看出,5ns 時,不管是 test1 或是 test2 在 testbench 那端,因為是用 sequential logic 去接 data 訊號,故輸出是 x。

相反的 test3 和 test4 因為是用 combinational logic 去接 data 訊號,故輸出是 1。

因此,截至目前為止,我對 Verilog 的理解是:

01. 在 testbench 那端使用 blocking assignment 設值,大部分情況在另一個 module 的循序邏輯都可以看到該訊號變化,但如果 testbench 那端的 data 設值是跟 clk 在同一個時間點,有可能 clk 會先改變(看各家 simulation 實作,Spec 這裡順序是不確定的,看誰先從 active region 被取出),這意味著在別的 module 的循序邏輯會看不到該訊號變化。

02. testbench non-blocking assignment 沒有異議,一定是別的 module 循序邏輯的下一個 clock 才能捕捉到。

03. 如果 module 組合邏輯的輸出,跟本身模組裡面的循序邏輯設值有關,即使是透過組合邏輯輸出,testbench 或是其他使用的 module 那端,也是要在下一個 clk 才會反映出來,除非使用端也是用組合邏輯接,但只要這個訊號有被其他循序邏輯用到,就是要等下一個 clk。

我的理解應該是對的吧?

眼球果真是兵家必爭之地

現代人娛樂太多但擁有的時間又太少,如何在有限的時間內盡量吸引民眾注意力,並將流量轉成紅利,我想應該是所有網紅、媒體業甚至是廣告業者等的必做功課吧?

雖然我很喜歡可愛的小老婆,但偶爾看到豆花妹的影片還是會稍微點一下,剛點的第一首歌曲是《迷人的危險》,副歌還不錯,但主歌就不是我會喜歡的旋律,真是可惜了這一首歌…

接下來又隨意點了 Youtube 下面推薦的另外一首歌《煙火》,這次就是我的菜,趕緊更新到我的歌單之中。

雖然推薦清單還有豆花妹其他的歌,但我已經懶得點了,即使對象是憑良心說比小老婆漂亮的豆花妹!因為一來我不喜歡受演算法主導,二來我是老人體力有限,沒有天大的吸引力我連點一下遙控器都懶,就像平常吹頭髮滑 Google Play Movie 或 Netflix 一樣,有時候從頭滑到尾,即使會考慮租借或是按下加入待看清單,但沒有一部電影真的會讓我願意花費體力以及時間去點下購買或撥放,我想我是真的老了,廉頗老矣XD

講到這裡,又想罵 Youtube Music 兩句,更新了一些歌曲,但一直沒機會將所有歌唱撥放清單好好地加入待撥歌單中並隨機撥放,老婆我也是不願意只聽小老婆的歌呀,都是 Google 害我的?

假設現在待撥歌單有 200 首歌,一點下隨機撥放按鈕後,可能只會剩下 20 首歌,這不知道是哪門子的隨機撥放,重點是看 Google Play 評論這個問題已經很久了,Google 真的已經不是我 20 幾年前認識的 Google 了,連我用左腳都能改的 bug 居然要拖那麼久?

逼得我只好將小老婆的歌單再取其精華另建新歌單(只是沒事找事做,順便讓小老婆好聽的歌在更好聽,同一個撥放清單的按下隨機是正常的,只有加了一個以上才有問題),原本只想要湊 23 首,畢竟劍聖最後也只有使出劍二十三,沒想到越加越多加到 Top 50,這樣也好,取其精華的好處就是每首歌聽了都開心XD

歌手除了唱歌好聽以及個人魅力有沒有觀眾緣外,歌曲好不好聽也是很重要滴,這樣算起來小老婆還算幸運,至少我個人覺得好聽的歌還真不少就是XD

唉,除了工作及家人外,要我願意花費時間的事情真的是不多了…

WSL 分割視窗

上一次頻繁使用 WSL 是為了搞定 Kobo Libra2 藍牙問題

今年換了新部門,工作時大幅使用 Linux 工作站,雖然我 20 幾年前就把 Linux 當個人電腦用,但也只限於上網,BBS,MSN 以及幫媽媽燒錄 VCD 給同事?

最近終於比較不用一直看文件,故也要趕快找時間熟悉 C Shell or Tcl 變專家,不然一有需求,為了不想浪費晚上時間的運用,勢必要趕在下班前把環境或 script 準備好,忙中容易出錯不說,也容易耽誤了下班時間。

WSL 就是一個很方便的東東,讓我不需要多重開機就可以使用 Linux,不過 spfdisk 我也 10 幾年沒用過就是了!

有時候想把心得抓圖放到 Blog,愚蠢的我居然是開兩個 WSL 並排來抓圖,早上終於想到要 Google 了XD

其實這很合理,一開始沒必要最佳化,但當重複事件不斷發生,就要開始優化工作流程了,畢竟我們可是聰明的工程師,數十年如一日不是吾輩該有的工作態度!

Alt + Shift + plus 開啟右邊視窗
Alt + Shift + minus 開啟下邊視窗

Power Shell 也適用

帥呀老皮

2024年9月6日 星期五

Tcl 變數邏輯

繼昨天了解 env var 如何判斷後,今天拿了之前買的一本 Tcl 紙本書去辦公室,放在辦公室應該比較有機會翻閱?

我在工作站建了兩支檔案,test.csh 以及 test.tcl,把練習過的語法寫在裡面,以後要找也方便。

不過,可能是看得還不夠多,到現在還是不太能抓到 Tcl 變數在不同 command 下,到底何時要加 $?


就拿常用的 for loop 來說,incr i 就不需要加 $,但是 llength 和 lindex 後面的 list 變數就要加 $,似乎不能單純看變數是否要改變來決定是否要加 $,又或者是 list 有它自己的規則?

2024/09/07 更新

昨天晚上想睡了,回頭看好像自打嘴巴,感覺以這裡來說,因為 incr 有改變值,所以才不加 $,好像還蠻合理,但 info exists command 確實是不用加 $,我印象中紙本書前幾頁也是有不用加 $ 的 command?