zoukankan      html  css  js  c++  java
  • Rocket

    https://mp.weixin.qq.com/s/9nMo6IYmDCz7S-ALFx824g

     

    简单介绍TLDebugModuleOuter的实现。

     

     

    1. DebugModuleAccessType

     

    定义调试模块访问宽度:

     

    2. DebugAbstractCommandError

     

    定义抽象命令访问错误:

     

    3. DebugAbstractCommandType

     

    定义抽象命令类型:

     

    4. DebugModuleParams

     

    定义调试模块参数:

    其中:

    a. nDMIAddrSize:调试总线地址宽度;

    b. nProgramBufferWords:Program Buffer中包含的字数,每个字包含4个字节;

    c. nAbstractDataWords: 抽象命令数据的字数,每个字包含4个字节;

    d. nScratch:

    e. hasBusMaster:是否包含SBToTL模块;

    f. clockGate: 是否使用门控时钟;

    g. maxSupportedSBAccess: 支持访问系统总线的最大宽度;

    h. supportQuickAccess: 是否支持快速访问抽象命令;

    i. supportHartArray: 是否支持核心数组;

    j. hasImplicitEbreak: Program Buffer最后是否包含一个隐含的ebreak命令;

     

    限定条件:

    a. DMIAddrSize在7-32之间;

    b. nAbstractDataWords在0-16之间;

    c. nProgramBufferWords在0-16之间;

     

    5. DefaultDebugModuleParams

     

    默认调试模块参数:

    除了已有的默认值外:

    a. nAbstractDataWords: 根据总线宽度来决定支持的抽象命令数据字数;

    b. maxSupportedSBAccess: 根据总线宽度确定;

     

    6. DebugModuleParams

     

    定义用于获取配置的Key:

     

    7. DebugModuleHartSelFuncs

     

    定义hartid和hartsel之间的映射函数:

     

    8. DebugModuleHartSelKey

     

    定义用于获取配置的Key:

     

    9. DebugInternalBundle

     

    用于传递hartsel等信息的结构:

     

    10. DebugCtrlBundle

     

    调试模块顶层信号:

     

    11. WNotifyWire

     

    生成一个只写的寄存器域:

    其中:

    a. 宽度为n;

    b. 读出的数值为0;

    c. 值写入value变量,并以set作为写入标志;

     

    12. RWNotify

     

    生成一个读写寄存器域:

    其中:

    a. 宽度为n;

    b. 从rVal中读出值,并以rNotify作为读取标志;

    c. 值写入wVal中,并以wNotify作为写入标志;

     

    13. TLDebugModuleOuter

     

    1) 引入全局配置

     

     

    2) 多个diplomacy node

     

    A. intnode

     

    包含一个中断节点:

     

    B. dmiNode

     

    包含一个DMI节点,这是一个寄存器节点:

     

    3) lazy module

     

     

    A. 输出中断,但不接收中断

     

    B. 支持的核心数量:

    如果只有一个核心,则不需要支持核心数组;

     

    C. 定义模块IO:

     

    D. dmcontrol使用dmiClock时钟:

     

    E. dmcontrol寄存器

     

     

    a. 复位值:

     

    b. 更新值:

     

    c. 异步复位寄存器:

     

    d. 寄存器读取时使用的数据源:

     

    e. 接收写寄存器时写入的32位值:

     

    f. 把32位值解析成为带结构值:

     

    g. 读写使能标志:

     

    h. 根据dmactive的值,更新dmcontrol的值:

    如果不支持核心数组,则hasel=0;

     

    i. 写使能时更新dmactive的值:

     

    j. dmcontrol是一个可读写寄存器:

    其中:DMCONTROLRdEn, DMCONTROLWrEn指示正在读和正在写。

     

    F. hawindowsel & hawindow寄存器

     

     

    a. 每个核心一个掩码位,窗口宽度为32位:

     

    b. 读取hawindowsel寄存器时使用的数据源:

     

    c. 接收写寄存器时写入的值:

    - HAWINDOWSELWrDataVal接收写入的32位值;

    - HAWINDOWSELWrData把这个32位的值解析成带结构信息的值;

     

    d. hawindowsel寄存器的读写标志:

     

    e. hawindow寄存器相关变量:

     

    f. 如果支持核心窗口,hawindowsel等于当前选择的32个核心的窗口:

    为了防止写入值超过支持的值,需要一个掩码进行限定。这里使用的是:log2Up(nComponents) - 5。这个应该是有问题的,需要再取一次对数,如log2Up(log2Up(nComponents) - 5)。

     

    g. 支持的核心数量需要多少个32位窗口:

     

    h. 生成每个窗口的掩码:

    - 如果不是最后一个窗口,则32个核心都支持;如果是最后一个窗口,则根据数量计算包含多少个掩码位;

    - HAWINDOWRdData:读取时返回的值需要使用掩码进行限定;

    - 如果dmactive为假,则使用复位值;

    - 否则如果选择的是当前窗口,则把掩码值写入到hamask寄存器中;

     

    i. 更新包含全部掩码的hamask:

    - 把写入的新值更新到当前窗口;

    - 非当前窗口使用原值;

     

    G. 生成dmcontrol/hawindowsel/hawindow寄存器:

     

    H. Interrupt Registers

     

    每个核心对应一个中断线,通过intnode连接到每一个核心:

     

    中断的值等于haltreq的值:

     

    I. inner & ctrl

     

    把信号向inner传递:

    这里只使用了harsello,没有使用hartselhi,也就是支持1024个以内的核心,hartselhi默认为0.

     

     

  • 相关阅读:
    day14
    day13
    装饰器小题
    day12
    tes..
    1380 没有上司的舞会
    算法模板——KMP字符串匹配
    算法模板——Tarjan强连通分量
    3211: 花神游历各国
    1131: [POI2008]Sta
  • 原文地址:https://www.cnblogs.com/wjcdx/p/12287384.html
Copyright © 2011-2022 走看看