• Rocket core ex_reg_xcpt_interrupt


    https://mp.weixin.qq.com/s/CS0dRvIfPCAiEH_tMVvpRw

     

    简单介绍ex_reg_xcpt_interrupt相关的实现。

     

    本文目录:

    1. ex_reg_xcpt

    2. ex_reg_xcpt_interrupt

     

    以下正文:

    1. ex_reg_xcpt

    ex_reg_xcpt表示在没有kill id阶段的情况下,把id_xcpt的值传给ex_reg_xcpt :

     

    1) ctrl_killd

    ctrl_killd的赋值如下:

    图示如下:

    ctrl_killd的意义为kill id阶段,不再向ex阶段进行传递。所以这里使用ctrl_killd过滤id_xcpt来决定是否向ex_reg_xcpt进行传值。

     

    2) ex_reg_xcpt中只包含id阶段传递过来的异常,而不包括中断

    从ctrl_killd的赋值中可以看出,csr.io.interrupt会触发ctrl_killd,所以如果发生中断,id_xcpt则不会向ex_reg_xcpt进行传值。而id_xcpt中包含两类情况:a) 中断;b) id阶段发现的异常;所以这里ex_reg_xcpt中只包含了id阶段传递过来的异常,而不包括中断。

     

    2. ex_reg_xcpt_interrupt

     

    首先,从名称上看:

    a. ex表示ex阶段;

    b. reg表示寄存器;

    c. xcpt表示异常;

    d. interrupt表示中断;

    如果把interrupt理解为对xcpt的进一步阐释,那么ex_reg_xcpt_interrupt的意义就是ex阶段寄存器记录的(异常中的)中断。

     

    1) 赋值

    代码如下:

    图示如下:

    其中:

    a. !take_pc表示没有要求从新的pc重新取指;

    b. ibuf…valid表示ibuf输出的指令是合法的;

    c. csr.io.interrupt表示发生了中断;

    综合起来,就是在流水线正常运行的情况下,发生了中断。

     

    2) 并非ex阶段发生了中断

    中断每时每刻都可能发生,流水线的各个阶段每时每刻也都存在。所以中断发生时,流水线每个阶段都可以检测到中断,只是有没有去检测的问题。某个阶段检测到了中断的发生,并不能认为中断发生在该阶段。

     

    3) 而是标识检测到了中断的变量,在ex阶段使用

    ex_reg_xcpt_interrupt在ex阶段使用:

    其中:

    a. 如果检测到发生了中断,则ex_pc_valid为真。ex_pc_valid控制ex阶段的寄存器是否向mem阶段传递。所以中断发生时ex阶段执行的指令,是可以向mem阶段流动的。

    b. ex阶段本身不会发生异常,所以只记录从id阶段传递下来的异常和中断到ex_xcpt中。

     

     

  • 相关阅读:
    HIVE(2) 之 常用函数
    HIVE的Shell操作
    HIVE常用函数(1)聚合函数和序列函数
    版本控制系统之SVN和GIT的区别
    【PyQt5】信号与槽+装饰器定义槽函数
    【PyQt5】信号与槽+多线程
    【PyQt5】信号与槽用法进阶
    【PyQt5】信号与槽用法入门
    【python之路】【5、函数学习】带装饰器的函数作业【老男孩第2期全栈】
    【python之路】【4、文件操作】数据类型、文件操作-作业 用文件储存三级菜单并执行
  • 原文地址:https://www.cnblogs.com/wjcdx/p/15913246.html
Copyright © 2020-2023  润新知