Xilinx两块开发版PCIe link up时间相差很大,Virtex-6开发版PCIe link up时间超过60ms,而Virtex-7 PCIe link up时间只有~25ms.
 
分析过程:
1. 对比Virtex-6和Virtex-7两块开发板上电过程的LTSSM状态机。
首先看一下,Virtex-6开发版的LTSSM状态机,发现在多了一次Polling->Dectect的转换过程。
 
再来看Virtex-7开发版的LTSSM状态机,不同状态之间的转换符合PCIe Spec标准。
 
发现LTSSM状态机的异常点之后,然后结合详细的PCIe trace找到root cause.
 
2. 从Trace中看到,Upstream(Virtex-6)在Detect状态检查到RX存在之后,进入了Polling.Active状态,但是,之后由于一直未收到从Downstream下发的TS1序列,于是,就进入了Polling.Compliance状态. 此时,Upstream Lanes处于Electrical Idle。
 
3. 经过一段时间之后,Upstream Lanes看到EIOS之后,开始退出Polling.Compliance状态, 进入Polling.Active状态.
 
4. 接着,Downstream lanes进入Polling.Active状态,然后开始发送TS1序列。
 
5. 经过一段时间后,Upstream也进入了Polling.Active状态,然后开始发送TS1序列。
 
6. Upstream在Polling.Active状态实现了Bit Lock和Symbol Lock, 就转换进入到Polling.Configuration状态,并开始发送TS2序列。
 
7. 但是,问题来了,Downstream在Polling.Active状态未能成功实现了Bit Lock和Symbol Lock,在24ms
 timeout之后回到了Detect状态。
 
8. 此时,Upstream处于Polling.Configuration状态,在等待Downstream的TS2序列。由于Downstream已经回到Dectect状态了,Upstream在48ms内没有收到Downstream下发的TS2序列,也跟着返回Detect状态。
 
9. Downstream回到Dectect状态之后,就开始重新进行链路训练,在重新链路训练中,这次在Polling.Active状态成功实现了Bit Lock和Symbol Lock, 然后进入Polling.Configuration状态。最终成功实现PCIe链路训练。
 
从上面的分析过程中,我们看到,第7/8步中有两个timeout时间,分别是24ms和48ms,正是因为这两个timeout的存在,造成了Virtex-6开发版link up时间超过60ms。
 
Root Cause:
最后发现root cause是由于英特尔处理器中的一个bug造成的。如Intel Errata中的描述,由于Rx端过载保护电路的存在,可能会导致某些Device异常进入Polling.Compliance, 最后导致Downstream和Upstream之间状态出现偏差,引起Bit Lock/Symbol Lock错误。

PCIe link up bug 分析的更多相关文章

  1. Bug预防体系(上千bug分析后总结的最佳实践)

    Bug预防体系(上千bug分析后总结的最佳实践) 原创 2017-08-16俞美玲 光荣之路 吴老的<selenium webdriver 实战宝典>出版了!  web常见产品问题及预防 ...

  2. 关于bug分析与异常处理的一些思考

    前言:工作三年了,工作内容主要是嵌入式软件开发和维护,用的语言是C,毕业后先在一家工业自动化控制公司工作两年半,目前在一家医疗仪器公司担任嵌入式软件开发工作.软件开发中,难免不产生bug:产品交付客户 ...

  3. 文《左右c++与java中国的垃圾问题的分析与解决》一bug分析

    文<左右c++与java中国的垃圾问题的分析与解决>一bug分析 DionysosLai(906391500@qq.com) 2014/10/21 在前几篇一博客<关于c++与jav ...

  4. 线上bug分析

    昨天下午大神把组内几十号人召集在一起开Online bug分析大会,主要是针对近期线上事故从事故原因和解决方案两个维度来分析. 对金融软件来说,每一次的线上事故都有可能给公司带来重大的损失,少扣了用户 ...

  5. 【转】ProGuard的作用、使用及bug分析

    原文地址:http://blog.csdn.net/forlong401/article/details/23539123. http://www.trinea.cn/android/proguard ...

  6. 协议解析Bug分析

    协议解析Bug分析 源自邮件协议RPC(远程过程调用)处理的Request请求数据包的bug.        一.Bug描写叙述 腾讯收购的Foxmailclient能够作为outlookclient ...

  7. Oracle字符乱码、数据越界訪问典型Bug分析

    Oracle字符乱码.数据越界訪问典型Bug分析 前言:           作为乙方,在甲方客户那里验收阶段发现两个诡异Bug. 下面就问题来源.问题根因.解决方式.怎样避免做具体描写叙述. .且两 ...

  8. ProGuard的作用、使用及bug分析(转载)

    ProGuard的作用.使用及bug分析 本文主要ProGuard的作用.使用及bug分析.1.ProGuard作用ProGuard通过删除无用代码,将代码中类名.方法名.属性名用晦涩难懂的名称重命名 ...

  9. 软件测试之BUG分析定位概述(QA如何分析定位BUG)

    你是否遇到这样的场景? QA发现问题后找到DEV说: 不好了,你的程序出问题了! DEV(追查半小时之后): 唉,是你们测试环境配置的问题 唉,是你们数据不一致 唉,是你们**程序版本不对 唉,是** ...

随机推荐

  1. 执行yum提示错误:rpmdb: BDB0113 Thread/process 424227/139826856310848 failed

    [问题]在执行yum安装或者其他命令时,有如下提示: [解决办法:重新构建rpm数据库] [root@cly ~]# cd /var/lib/rpm [root@cly rpm]# ls Basena ...

  2. php函数形参传值与传引用

    传值 ------------------------------------------------- function example( $m ){     $m = $m * 5 + 10;   ...

  3. uva_answers

    uva202: https://blog.csdn.net/lecholin/article/details/70163148 uva1589: https://blog.csdn.net/qq_42 ...

  4. Python课程第二天作业

     一.统计字符串格式 要求: # 1.统计元组中所有数据属于字符串的个数,提示: isinstance() # 数据: t1 = (1, 2, '3', '4', 5, '6') # 结果: 3 代码 ...

  5. python-web自动化-鼠标操作

    鼠标操作由ActionChains类来完成鼠标操作 perform() 执行鼠标操作move_to_element() 鼠标悬浮:最常用的操作double_click() 双击操作context_cl ...

  6. [java,2019-01-28] 枪手博弈,谁才是最后赢家

    什么是枪手博弈: 枪手博弈指彼此痛恨的甲乙丙三个枪手准备决斗.甲枪法最好,十发八中.乙枪法次之,十发六中.丙枪法最差,十发四中.假设他们了解彼此实力,也能做出理性判断. 问题一:如果三人同时开枪,并且 ...

  7. leetcode每日刷题计划-简单篇day6

    突发奇想&胡思乱想的一天 银行家算法证明错了并挂在黑板上的可怜希希 Num 53 最大子序和 Maximum Subarray O(n)的算法实现了,分治法有空补 class Solution ...

  8. windowNoTitle 无效

    在开发Dialog 时候如采用 Dialog Activity 方式可能会出现取消标题栏失效 以下针对两种情况说明 1.如果 extends AppCompatActivity 需要在setConte ...

  9. java序列化和反序列化中的serialVersionUID有啥用

     1.什么是序列化和反序列化 序列化就是将java对象转成字节序列的过程:反序列化就是将字节序列转成java对象的过程. java中,序列化的目的一种是需要将对象保存到硬盘上,一种是对象需要在网络中传 ...

  10. python大法好——飞机大战完整吧

    # -*- coding:utf-8 -*-import pygamefrom pygame.locals import *import time '''说明1.按下b键,让玩家飞机爆炸 2.爆炸效果 ...