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);

always@(*)
	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);

always@(*)
	if(more_than_64)
		byte_update = (byte_add + byte_save ) - 8'd64 ;
	else 
		byte_update = 8'd0;
		

//----------------------right and recommended code end----------------------//

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值