天天看點

IC設計錯誤案例007:加法溢出導緻的錯誤

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----------------------//

           

繼續閱讀