CPU调试中要抓去的信号以及如何看这些信号

1. valid和PC信号必不可少

通过指令的PC可以快速地将指令序列与抓取的信号联系起来。《CPU设计实战》给出的参考设计将PC从取值阶段沿着流水级一路传递下去。因为每一级流水线的缓存中都会保存这一级流水当前正在处理的指令的PC,将各级PC信号抓取到波形窗口中,就可以一目了然地看出一条指令是如何在流水线中前进的。
除了各级的PC信号外,在我们的参考设计中,每一级流水的valid为也要抓取出来。对于任意一个流水级,不要在其valid为0的周期内分析流水级的其他信号,除非你的设计意图是希望这个周期内valid为1,而你正在分析为什么他没有置一。
其余经常要抓去的信号还有:指令在写回级通用寄存器堆的使能信号、地址、数据,指令RAM和数据RAM访问接口上的信号,以及取指或译码流水级上的指令码。

2. 各流水线信号要分组有序摆放

强烈建议大家将同意流水级的信号放在同一个组当中,然后按照流水级顺序将各组信号自上而下或自下而上依次摆放。

3. 先遍历指令再遍历流水线

  • 要先找到源头错误对应的那条指令,再分析这条指令具体对应的是逻辑电路的哪个部分有错。
    在第一部定位指令的过程中,建议你重点观察流水线的一级,通常选择写回级。根据写回级的valid和PC信号,结合反汇编中查明的指令序列,再波形中前后移动以确定出错指令。如果移动跨度超过视界,可以考虑用查找信号值来加快移动速度和精确度。
  • 找到可以指令之后,根据它的PC查看反汇编代码,明确他是写通用寄存器堆的,写内存的,还是分支跳转类的。
    |类别|操作|
    |–|–|
    | 写内存 |从这条指令在执行级时访问数据RAM的信号开始查看 |
    |写通用寄存器堆|从这条指令在写回级时访问寄存器堆的信号开始查看|
    | 分支跳转| 从这条指令在译码级时生成的影响nextPC的taken和target信号开始查看 |

之后就按照CPU设计中的数据通路逆向追查下去。
如果发现这条指令不是错误的源头,那么就要回到定位指令的过程继续沿时间轴向前或向后定位指令。

你可能感兴趣的:(fpga开发)