在线咨询 切换到宽版
eetop公众号 创芯大讲堂 创芯人才网

 找回密码
 注册

手机号码,快捷登录

手机号码,快捷登录

搜全文
查看: 2643|回复: 7

[求助] 求助:加法变减法!ISE综合遇到相当诡异的bug!

[复制链接]
发表于 2012-6-6 15:16:18 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?注册

×
最近搞一个比较大的工程,用的是xilinx V5 110T的板子,资源占用率98%(不知道是不是因为资源占用太多引起的),在综合以下语句时出现了诡异的bug,对addrb_2采样后发现,明明是addrb_2 <= addrb_2 + 64,却显示为由0变为了-64,也就是说明明是加法却综合成了减法,而将64改为2后能正确综合,由0变为了2,而改成65之后却由0变为了-63!!真是莫名其妙的bug啊,请教高人该如何解决?
代码如下:
always @(posedge clk_rc or negedge rst) begin
        if(!rst) begin
          addrb_1 <= 14'b0;
          addrb_2 <= 14'b0;
          addrb_3 <= 14'b0;
          addrb_4 <= 14'b0;
        end
        else if(srset==1'b1) begin
            addrb_1 <= 14'b0;
            addrb_2 <= 14'b0;
            addrb_3 <= 14'b0;
            addrb_4 <= 14'b0;
        end
        else if(read_nen == 1'b0)begin
        case(genaddr_fsm)
            add_sample: begin
                case(level)
                   3'b000: begin
                       case({start_ram4,start_ram3,start_ram2})
                                       3'b001:    begin
                                             
                                                     addrb_2 <= addrb_2 + 64
                                                  end
                                       3'b010:    begin
                                                     addrb_3 <= addrb_3 + 64;
                                                  end
                                       3'b100:    begin
                                                     addrb_4 <= addrb_4 + 64;
                                                  end
                                     default:     begin
                                                     addrb_2 <= addrb_2;
                                                     addrb_3 <= addrb_3;
                                                     addrb_4 <= addrb_4;
                                                    end
                       endcase                           
                   end
                    3'b001: begin
                        case({start_ram4,start_ram3,start_ram2})
                                       3'b001:    begin
                                                     addrb_2 <= addrb_2 + 32;
                                                  end
                                       3'b010:    begin
                                                     addrb_3 <= addrb_3 + 32;
                                                  end
                                       3'b100:    begin
                                                     addrb_4 <= addrb_4 + 32;
                                                  end
                                     default:     begin
                                                     addrb_2 <= addrb_2;
                                                     addrb_3 <= addrb_3;
                                                     addrb_4 <= addrb_4;
                                                    end
                         endcase
                    end
                    3'b010: begin
                        case({start_ram4,start_ram3,start_ram2})
                                       3'b001:    begin
                                                     addrb_2 <= addrb_2 + 16;
                                                  end
                                       3'b010:    begin
                                                     addrb_3 <= addrb_3 + 16;
                                                  end
                                       3'b100:    begin
                                                     addrb_4 <= addrb_4 + 16;
                                                  end
                                     default:     begin
                                                     addrb_2 <= addrb_2;
                                                     addrb_3 <= addrb_3;
                                                     addrb_4 <= addrb_4;
                                                     end
                        endcase
                    end
                    3'b011: begin
                        case({start_ram4,start_ram3,start_ram2})
                                       3'b001:    begin
                                                     addrb_2 <= addrb_2 + 8;
                                                  end
                                       3'b010:    begin
                                                     addrb_3 <= addrb_3 + 8;
                                                  end
                                       3'b100:    begin
                                                     addrb_4 <= addrb_4 + 8;
                                                  end
                                     default:     begin
                                                     addrb_2 <= addrb_2;
                                                     addrb_3 <= addrb_3;
                                                     addrb_4 <= addrb_4;
                                                     end
                        endcase
                    end
                    3'b100: begin
                        case({start_ram1,start_ram4,start_ram3,start_ram2})
                                       4'b0001:    begin
                                                     addrb_2 <= addrb_2 + 4;
                                                  end
                                       4'b0010:    begin
                                                     addrb_3 <= addrb_3 + 4;
                                                  end
                                       4'b0100:    begin
                                                     addrb_4 <= addrb_4 + 4;
                                                  end
                                       4'b1000:    begin
                                                     addrb_1 <= addrb_1 + 4;
                                                  end         
                                     default:     begin
                                                     addrb_2 <= addrb_2;
                                                     addrb_3 <= addrb_3;
                                                     addrb_4 <= addrb_4;
                                                     addrb_1 <= addrb_1;
                                                     end
                        endcase
                    end
                    default: begin
                        addrb_2 <= addrb_2;
                        addrb_3 <= addrb_3;
                        addrb_4 <= addrb_4;
                        addrb_1 <= addrb_1;
                    end
                endcase
            end
            add_column: begin
                case(level)
                    3'b000: begin
                             case({start_ram4,start_ram3,start_ram2})
                                  3'b001:  begin
                                             addrb_2 <= addrb_2 - 192 + 1;                                            
                                           end
                                  3'b010:  begin
                                             addrb_3 <= addrb_3 - 192 + 1;
                                           end
                                  3'b100:  begin
                                             addrb_4 <= addrb_4 - 192 + 1;
                                           end
                                 default:    begin
                                              addrb_2 <= addrb_2;
                                              addrb_3 <= addrb_3;
                                              addrb_4 <= addrb_4;
                                               end
                             endcase                                                      
                    end
                    3'b001: begin
                             case({start_ram4,start_ram3,start_ram2})
                                  3'b001:  begin
                                             addrb_2 <= addrb_2 - 96 + 1;                                            
                                           end
                                  3'b010:  begin
                                             addrb_3 <= addrb_3 - 96 + 1;
                                           end
                                  3'b100:  begin
                                             addrb_4 <= addrb_4 - 96 + 1;
                                           end
                                 default:    begin
                                              addrb_2 <= addrb_2;
                                              addrb_3 <= addrb_3;
                                              addrb_4 <= addrb_4;
                                               end
                             endcase                                                      
                    end
                    3'b010: begin
                             case({start_ram4,start_ram3,start_ram2})
                                  3'b001:  begin
                                             addrb_2 <= addrb_2 - 48 + 1;                                            
                                           end
                                  3'b010:  begin
                                             addrb_3 <= addrb_3 - 48 + 1;
                                           end
                                  3'b100:  begin
                                             addrb_4 <= addrb_4 - 48 + 1;
                                           end
                                 default:    begin
                                              addrb_2 <= addrb_2;
                                              addrb_3 <= addrb_3;
                                              addrb_4 <= addrb_4;
                                               end
                             endcase                                                      
                    end

                    3'b011: begin
                             case({start_ram4,start_ram3,start_ram2})
                                  3'b001:  begin
                                             addrb_2 <= addrb_2 - 24 + 1;                                            
                                           end
                                  3'b010:  begin
                                             addrb_3 <= addrb_3 - 24 + 1;
                                           end
                                  3'b100:  begin
                                             addrb_4 <= addrb_4 - 24 + 1;
                                           end
                                 default:    begin
                                              addrb_2 <= addrb_2;
                                              addrb_3 <= addrb_3;
                                              addrb_4 <= addrb_4;
                                               end
                             endcase                                                      
                    end
               
                    3'b100: begin
                             case({start_ram1,start_ram4,start_ram3,start_ram2})
                                  4'b0001:  begin
                                             addrb_2 <= addrb_2 - 12 + 1;                                            
                                           end
                                  4'b0010:  begin
                                             addrb_3 <= addrb_3 - 12 + 1;
                                           end
                                  4'b0100:  begin
                                             addrb_4 <= addrb_4 - 12 + 1;
                                           end
                                  4'b1000:  begin
                                             addrb_1 <= addrb_1 - 12 + 1;
                                           end
                                          
                                 default:    begin
                                              addrb_2 <= addrb_2;
                                              addrb_3 <= addrb_3;
                                              addrb_4 <= addrb_4;
                                              addrb_1 <= addrb_1;
                                               end
                             endcase                                                      
                    end

                    default: begin
                        addrb_2 <= addrb_2;
                        addrb_3 <= addrb_3;
                        addrb_4 <= addrb_4;
                        addrb_1 <= addrb_1;
                    end
                endcase
            end
            add_stripe: begin
                case(level)
                    3'b000,3'b001,3'b010,3'b011: begin
                              case({start_ram4,start_ram3,start_ram2})
                                  3'b001:  begin
                                             addrb_2 <= addrb_2 + 1;
                                           end
                                  3'b010:  begin
                                             addrb_3 <= addrb_3 + 1;
                                           end   
                                  3'b100:  begin
                                             addrb_4 <= addrb_4 + 1;
                                           end
                                  default: begin
                                              addrb_2 <= addrb_2;
                                              addrb_3 <= addrb_3;
                                              addrb_4 <= addrb_4;
                                               end
                              endcase
                    end
                    3'b100: begin
                                            case({start_ram1,start_ram4,start_ram3,start_ram2})
                                                4'b0001:   begin
                                                           addrb_2 <= addrb_2 + 1;
                                                          end
                                                4'b0010:   begin
                                                           addrb_3 <= addrb_3 + 1;
                                                          end
                                                4'b0100:   begin
                                                           addrb_4 <= addrb_4 + 1;
                                                          end
                                                4'b1000:   begin
                                                           addrb_1 <= addrb_1 + 1;
                                                          end
                                                default:  begin
                                                           addrb_2 <= addrb_2;
                                                           addrb_3 <= addrb_3;
                                                           addrb_4 <= addrb_4;
                                                           addrb_1 <= addrb_1;
                                                             end
                                            endcase
                    end
                    default: begin
                        addrb_2 <= addrb_2;
                        addrb_3 <= addrb_3;
                        addrb_4 <= addrb_4;
                        addrb_1 <= addrb_1;
                    end
                endcase
            end
            add_block: begin
                case(level)
                    3'b000,3'b001,3'b010,3'b011: begin
                             case({start_ram4,start_ram3,start_ram2})
                               3'b001:    begin
                                              if((count_block_2==3)||(count_block_2==6)||(count_block_2==9)||(count_block_2==12)) begin
                                                addrb_2 <= 0;
                                              end
                                              else begin
                                                addrb_2 <= addrb_2 + 1;
                                              end                                                
                                          end         
                               3'b010:    begin
                                             if((count_block_3==3)||(count_block_3==6)||(count_block_3==9)||(count_block_3==12)) begin
                                                addrb_3 <= 0;
                                              end
                                              else begin
                                                addrb_3 <= addrb_3 + 1;
                                              end                                                
                                          end
                               3'b100:    begin
                                             if((count_block_4==3)||(count_block_4==6)||(count_block_4==9)||(count_block_4==12)) begin
                                               addrb_4 <= 0;
                                             end
                                             else begin
                                               addrb_4 <= addrb_4 + 1;                     
                                             end
                                          end
                               default:   begin
                                           addrb_2 <= addrb_2;
                                           addrb_3 <= addrb_3;
                                           addrb_4 <= addrb_4;
                                          end                                 
                            endcase
                    end   
                    
                    3'b100: begin
                                           case({start_ram1,start_ram4,start_ram3,start_ram2})
                                               4'b0001:   begin

                                                                     addrb_2 <= addrb_2 + 1;
                                                     
                                                          end   
                                               4'b0010:   begin
                                                            
                                                                     addrb_3 <= addrb_3 + 1;
                        
                                                          end
                                               4'b0100:   begin
                        
                                                                     addrb_4 <= addrb_4 + 1;
                    
                                                          end
                                               4'b1000:   begin
                        
                                                                     addrb_1 <= addrb_1 + 1;
                    
                                                          end

                                              default:   begin
                                                          addrb_2 <= addrb_2;
                                                          addrb_3 <= addrb_3;
                                                          addrb_4 <= addrb_4;
                                                          addrb_1 <= addrb_1;
                                                         end
                                           endcase
                    end                                          

                    default: begin
                              addrb_2 <= addrb_2;
                              addrb_3 <= addrb_3;
                              addrb_4 <= addrb_4;
                              addrb_1 <= addrb_1;
                             end

                endcase        
            end
            
            
            default: begin
                       addrb_2 <= addrb_2;
                       addrb_3 <= addrb_3;
                       addrb_4 <= addrb_4;
                       addrb_1 <= addrb_1;
                     end
            endcase
            end            
    end
发表于 2012-6-6 16:04:24 | 显示全部楼层
把所有的16修改成14'd16,64修改成14'd64.这种格式,你再试试了。
回复 支持 反对

使用道具 举报

发表于 2012-6-6 16:05:17 | 显示全部楼层
溢出了吧 是几bit的数据呢
回复 支持 反对

使用道具 举报

发表于 2012-6-6 16:06:15 | 显示全部楼层
你的数据宽度,看一下
回复 支持 反对

使用道具 举报

发表于 2012-6-6 16:09:05 | 显示全部楼层
1. 看一下综合后是否有 timing violation;

2. 看一下声明 addrb_2 的位宽是否为 14 bit。

3. 采样时,sample clock 是否比 run 的 clock 高出 2 倍。

Ps:建议你该一下 coding style,可以分几步完成这个的操作,这样的写法不容易 debug,且丢给 tool 的工作量太大。
回复 支持 反对

使用道具 举报

发表于 2012-6-6 17:22:31 | 显示全部楼层
LS解答很好·,LZ代码风格确实不好,可以多几个always块~
回复 支持 反对

使用道具 举报

发表于 2012-6-6 19:50:52 | 显示全部楼层
你在观察数值的时候,数组的进制从signed换成unsigned就好了。
回复 支持 反对

使用道具 举报

发表于 2012-6-7 10:47:33 | 显示全部楼层
8成是信号定义的问题,你别看10进制数,多想想二进制数
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

站长推荐 上一条 /1 下一条


手机版| 小黑屋| 关于我们| 联系我们| 隐私声明| EETOP 创芯网
( 京ICP备:10050787号 京公网安备:11010502037710 )

GMT+8, 2025-9-15 09:23 , Processed in 0.018703 second(s), 6 queries , Gzip On, Redis On.

eetop公众号 创芯大讲堂 创芯人才网
快速回复 返回顶部 返回列表