pretty code

2024年9月7日 星期六

又是 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。

我的理解應該是對的吧?

沒有留言: