Verilog和SystemVerilog定義了4種描述信號狀態(tài): 1, 0, X, and Z。1和0無疑是真實存在的信號狀態(tài). 而Z用來表示高阻態(tài),X用來表示不確定的狀態(tài)。
X信號可以有意或無意地被創(chuàng)建,最常見的X信號存在于未被初始化的memory register,這里X用來表示這些memory在reset之前的的未知狀態(tài) 。其他一些可以產(chǎn)生X的場景包括了不同的driver驅(qū)動同一塊邏輯到不同的邏輯值,或者是在low power中的關(guān)斷信號,又或者是一些超過選擇范圍的多比特信號。 有些設(shè)計者會對design中那些dont care的信號設(shè)為X,讓綜合工具在做優(yōu)化的時候來隨機(jī)選擇0或者1進(jìn)行優(yōu)化。也有些設(shè)計者為了debug的目的在設(shè)計中對那些不會用到的邏輯值設(shè)X,這樣在做仿真的時候如果使用到這些邏輯,說明電路有問題,而仿真工具產(chǎn)生的X可以檢查到這些邏輯。有意地設(shè)置一些X信號是比較有爭議的做法。在做lint檢查的時候也會被標(biāo)識出來。但是有些X狀態(tài)由于仿真器識別的原因(verilog X optimism)會產(chǎn)生錯誤的仿真結(jié)果。這就屬于RTl的bug了。
第一個verilog X optimism的例子來自if...else語句:
1 2 3 4 5 6 |
always_ff@(posedge clk)begin if(cond) c <= a; else c <= b; end |
Verilog LRM 指出如果if...else的條件是X狀態(tài),那么這個條件就會被當(dāng)作false處理,在這里只有else語句會被執(zhí)行。
在實際設(shè)計中有一種情況可能會產(chǎn)生這種問題:cond信號來自于memory。比如漢明碼SECDED(single error correction double error detection)解碼器,其檢測的序列是儲存漢明碼的寄存器,這段序列是否錯誤的cond是由這些寄存器經(jīng)過一段組合邏輯產(chǎn)生,當(dāng)cond為TRUE時輸出錯誤信號error=1。在reset之前這些寄存器都是X狀態(tài),原本錯誤信號應(yīng)該是error=1,但是在仿真中由于verilog X optimism這種特性,寄存器的X經(jīng)過組合邏輯傳播到cond,導(dǎo)致最后將cond=X判斷為FALSE,輸出錯誤信號為0,這就與實際電路行為相違背了。
Verilog X optimism的另外一個例子是case語句:
1 2 3 4 5 6 |
always_ff@(posedge clk)begin case(cond) 1'b0 : c = a; 1'b1 : c = b; endcase end |
在case語句中如果cond為X的話,c將會保留原值。這里原本是描述了一個mux的行為,但由于X optimism的原因,仿真行為與RTL描述不一致。
此外,Verilog X optimism還會影響到0/1->X/Z的處理。下面的這些狀態(tài)轉(zhuǎn)移都會被視為posedge:
0->1, 0->X, 0->Z, X->1, Z->1
0->X or X->1實際上不一定是posedge,但在仿真中,他們都會被當(dāng)作posedge處理。
-
寄存器
+關(guān)注
關(guān)注
31文章
5271瀏覽量
119654 -
Verilog
+關(guān)注
關(guān)注
28文章
1335瀏覽量
109860
原文標(biāo)題:verilog——X optimism
文章出處:【微信號:ic_frontend,微信公眾號:數(shù)字前端ic芯片設(shè)計】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
相關(guān)推薦
評論