1、加法溢出導緻的功能錯誤
如下圖所示錯誤代碼中,當byte_add+byte_save等于256的時候,我們期望的的信号more_than_64應該為1,而實際上在錯誤代碼中(byte_add+byte_save)與8’d64比較,(byte_add+byte_save)可能會被了解為8’d0,即被了解成8bit信号,more_than_64等于0,功能錯誤。在晶片設計中,有可能因為EDA工具之間差異導緻對(byte_add+byte_save)>8’d64的了解不一樣,導緻VCS等工具RTL級仿真正确,而DC綜合後功能錯誤。例如:VCS将(byte_add+byte_save)了解為9bit的位寬,而綜合了解為8bit位寬。一旦綜合了解為8bit位寬,則會導緻網表與我們預期功能不一緻,而且網表仿真比較慢,一般很慢周遊所有RTL級仿真用例,是以此類問題不容易發現。
2、如何避免加法溢出導緻的功能錯誤
如下圖所示正确代碼中,将指派給9bit的add_byte_total,并且将add_byte_total與9’d64比較,而不是8’d64比較,這樣就不會發生溢出截斷比較的情況,
//----------------------Error code begin-------------------------//
wire more_than_64 ;
reg [7:0] byte_add ;
reg [7:0] byte_save ;
reg [7:0] byte_update;
assign more_than_64 = ( (byte_add+byte_save) > 8'd64);
[email protected](*)
if(more_than_64)
byte_update = (byte_add + byte_save ) - 8'd64 ;
else
byte_update = 8'd0;
//----------------------Error code end-------------------------//
//----------------------right and recommended code begin----------------------//
wire more_than_64 ;
reg [7:0] byte_add ;
reg [7:0] byte_save ;
reg [7:0] byte_update;
wire [8:0] add_byte_total ;
assign add_byte_total=(byte_add+byte_save);
assign more_than_64 = ( add_byte_total > 9'd64);
[email protected](*)
if(more_than_64)
byte_update = (byte_add + byte_save ) - 8'd64 ;
else
byte_update = 8'd0;
//----------------------right and recommended code end----------------------//