驗(yàn)證工程師面試題:找出這個(gè)verilog中的bug(corner?case)
[導(dǎo)讀]下面是一個(gè)小的真實(shí)verilog代碼,具有異步set/reset邏輯(低電平有效)的觸發(fā)器模型。這個(gè)verilog模型可以正確地綜合,但在一個(gè)cornercase情況下仿真結(jié)果不正確。這個(gè)cornercase是什么?always_ff@(posedgeclkornegedgers...
下面是一個(gè)小的真實(shí)verilog 代碼,具有異步set/reset邏輯(低電平有效)的觸發(fā)器模型。這個(gè)verilog模型可以正確地綜合,但在一個(gè) corner case情況下仿真結(jié)果不正確。這個(gè) corner case是什么?
當(dāng)rst_n變低,它可以正確地異步復(fù)位觸發(fā)器。然后拉低set_n,在rst_n和set_n同時(shí)為低的情況下,觸發(fā)器將正確地保持復(fù)位,因?yàn)樵?a href="/tags/verilog" target="_blank">verilog代碼中復(fù)位的優(yōu)先級(jí)比置位的優(yōu)先級(jí)高。
到目前為止,一切都很好。接下來(lái),rst_n變高,set_n保持低。由于敏感度列表只對(duì)rst_n和set_n的負(fù)邊沿敏感,因此rst_n的拉高不會(huì)觸發(fā)敏感列表。這意味著,當(dāng)只有set_n為低電平時(shí)觸發(fā)器仍然處于復(fù)位狀態(tài)!?這個(gè)問(wèn)題引入的關(guān)鍵在于,實(shí)際的異步置位/復(fù)位是電平敏感的,因此當(dāng)復(fù)位信號(hào)rst_n被拉高時(shí)仍然會(huì)正確地發(fā)生置位。這就使得仿真和綜合后的電路行為mismatch。
?為了避免這種麻煩,有兩種推薦的編碼風(fēng)格:第一種方法:1)在敏感度列表中新增一個(gè)敏感條件。2)使用條件編譯(`ifdef/`endif)或綜合選項(xiàng)(translate_off/translate_on)對(duì)綜合工具隱藏。
always_ff @( posedge clkor negedge rst_n // active-low resetor negedge set_n // active-low set)if (!rst_n) // reset has priority over set q_out <= '0; // reset all bits to zeroelse if (!set_n) q_out <= '1; // set all bits to oneelse q_out <= data_in; // d input assignment這個(gè)verilog模型按預(yù)期正確地進(jìn)行綜合,然而在某些仿真條件下功能錯(cuò)誤。當(dāng)rst_n變低,它可以正確地異步復(fù)位觸發(fā)器。然后拉低set_n,在rst_n和set_n同時(shí)為低的情況下,觸發(fā)器將正確地保持復(fù)位,因?yàn)樵?a href="/tags/verilog" target="_blank">verilog代碼中復(fù)位的優(yōu)先級(jí)比置位的優(yōu)先級(jí)高。
到目前為止,一切都很好。接下來(lái),rst_n變高,set_n保持低。由于敏感度列表只對(duì)rst_n和set_n的負(fù)邊沿敏感,因此rst_n的拉高不會(huì)觸發(fā)敏感列表。這意味著,當(dāng)只有set_n為低電平時(shí)觸發(fā)器仍然處于復(fù)位狀態(tài)!?這個(gè)問(wèn)題引入的關(guān)鍵在于,實(shí)際的異步置位/復(fù)位是電平敏感的,因此當(dāng)復(fù)位信號(hào)rst_n被拉高時(shí)仍然會(huì)正確地發(fā)生置位。這就使得仿真和綜合后的電路行為mismatch。
?為了避免這種麻煩,有兩種推薦的編碼風(fēng)格:第一種方法:1)在敏感度列表中新增一個(gè)敏感條件。2)使用條件編譯(`ifdef/`endif)或綜合選項(xiàng)(translate_off/translate_on)對(duì)綜合工具隱藏。
always_ff @( posedge clkor negedge rst_n // active-low resetor negedge set_n // active-low set`ifndef SYNTHESIS // non-synthesizable simulation codeor posedge (rst_n 




