pretty code

2025年7月3日 星期四

fsdb 替代方案

雖然在 github 找了幾個關於 fsdb 的替代方案,不過 Windows 上並沒有合適的檔案可供測試,故暫時無法得知一些替代方案是否可以解決?

看起來除了控制 VCD 的 level 與 instance 層級之外,目前的最好解法便是在適當的地方,呼叫系統指令暫時關掉不想要的 dump 動作。

跑起來的感覺大概就像下面那張圖一樣。

從 100 ns 開始,呼叫 $dumpoff 停止 dump,接著在 200 ns 開始,呼叫 $dumpon 恢復 dump。


另外,下午在找資料的過程中,無意間發現當初開發 fsdb 的人。

一般來說,我都會很佩服這樣的人!

不過,唉,不說了…

但是有機會我還是會去買他或是她的書來看,至少在 coding 這一項,對方一定是比我強沒錯!

正所謂海納百川,不以人廢言。

《灌籃高手》電子書今日正式上線

中午吃飽飯立刻在公司電腦下單XD

本想早上就買的,但今日要早點去公司測試,只好忍痛放棄?

雖然這套漫畫排不上我想買的漫畫前三名,但看在我在 2014 年也有短暫觀看 NBA 的過往,還是掏出魔法小卡勇敢地買下去。

順便在線上閱讀一下最後一集,不得不說感覺還是很熱血,下午想做的測試也不禁讓我熱血沸騰起來。

哪天才能等到我的黑豹列傳呀!

2025/07/03 晚上更新

雖然人是熱血沸騰起來沒錯,但只多過了 2 種測試,有些地方無法解釋且跟文件對不起來,待我晚上連回公司時好好想想。

順便附上嘿嘿後的最後一集封面!
要是現在放棄的話,比賽就結束了XD

2025年7月2日 星期三

xmhelp

DC 有 man 可以查詢錯誤,NCVerilog 則是 xmhelp 指令。

比如我在 simulation 的過程中,出現一個 *W,BIGIDX 的錯誤訊息,原本的 log 可以知道是哪個檔案,但如果我們想多了解一點,可以用下面指令來查詢。

xmhelp xmelab BIGIDX

另外,xrun or ncverilog 都是一個統包的指令,其實他會分別作編譯,elaborate 以及跑模擬。

這其實會分別對應到另外 3 支程式。

第一支程式是 xmvlog,接著是 xmelab,最後則是 xmsim。

對應到 iverilog 便是 iverilog + vvp。

另外,NCVerilog 是舊版本名稱,現在應該是 Xcelium。

2025/07/03 更新

上面只是舉例用法,xmhelp 後面的參數要看你是哪一階段的錯誤,就要填上對應的程式名稱。

比如 xmhelp xmvlog NOINUF。

2025年7月1日 星期二

沒事多讀規格書

原本我以為 timescale 是可以細到針對個別 Verilog 設定XD

昨天在 2005 規格書好像沒有看到?可能是跟我邊分心連到工作站做事有關,不過卻意外多知道一個函數 $printtimescale( ),可以印出目前檔案的 timescale 設定。

今天突然想到,自己寫個 Testbench 來驗證不就好了!

於是我對 Verilog 又多懂了一點點…

今日重點

01. $printtimescale 可以印出目前 timescale。
02. 看起來所有檔案只能用同一個,後面會覆蓋前面(待確認?)。


2025/07/02 更新

下午因為硬碟空間不足,苦等原本測試未果,無法繼續下一個測試。

乾脆跟 Google AI 對談,順便切磋一下彼此對 EDA 軟體心得,後來順口問了一句有關 `timescale 的想法,居然發現 AI 給的例子完美證明了 `timescale 是可以對個別 module 做設定。

我本來的例子由於是 include,因此會原地展開,才會有我後者取代前者的結論。

下面是 AI 給的例子,因為是個別編譯,故分別保留各自的 `timescale。


雖然我昨天又看了一次規格書,實在看不出這樣的結論?

不過,我跟 AI 都一致認為這樣容易產生 bug,最好的方式還是有一個統一的 include 檔案,大家才能都用同樣的設定。

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 都過不了?