早上起床後有寫了支測試程式試了一下,看起來跟我想的一樣,但因為早上急著出門,一直到剛剛才有時間整理一下,馬上現學現賣早上學會的分割視窗功能,雖然這邊有點為用而用,畢竟 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。
我的理解應該是對的吧?
沒有留言:
張貼留言