Rocket - debug - TLDebugModuleInner - Abstract Command State Machine

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

 

简单介绍TLDebugModuleInner中处理抽象命令时的状态机。

 

 

1. CtrlState

 

定义抽象命令相关的四个状态:

 

1) ctrlStateReg

 

ctrlStateReg是一个寄存器,记录了当前的状态:

 

2) ctrlStateNxt

 

ctrlStateNxt记录了ctrlStateReg的下一个状态:

 

其值会输出到ctrlStateReg寄存器中:

 

3) reset

 

当io.dmactive为假时,ctrlStateReg的值设置为Wating。

 

2. hartHalted

 

表示选择的核心是否处于暂停状态:

 

3. Waiting

 

等待执行抽象命令的状态:

a. 如果存在命令输入,则进入CheckGenerate状态;

b. 如果输入的抽象命令类型不支持(目前仅支持access register),则不改变状态,把errorUnsupported置为真;

c. 如果要自动执行抽象命令,但是命令不支持,则不改变状态,而把errorUnsupported置为真;

 

4. CheckGenerate

 

在CheckGenerate状态检查生成的抽象命令:

a. 如果抽象命令不支持,则返回Waiting状态,而把errorUnsupported置为真;

b. 如果命令合法,而核心不在暂停状态,则返回Waiting状态,而把errorUnsupported置为真;

c. 抽象命令没有问题,则根据访问的寄存器是在Custom节点,还是GPR,把状态转为Custom或者Exec;

 

5. Exec

 

在这个状态下,抽象命令正在执行:

a. goReg === false: 核心在执行抽象命令之前,会写地址GOING,进而goReg的值变为false。表示核心已经在执行抽象命令了;

b. hartHaltedWrEn && (hartSelFuncs.hartIdToHartSel(hartHaltedId) === selectedHartReg)表示选择的核心又进入了暂停状态;

c. 两者结合,表明抽象名录执行结束了。可以返回Waiting状态;

 

如果在执行抽象命令过程中,发生了异常,则返回Waiting状态,把errorException置为真:

 

6. Custom

 

表示正在读Custom源节点中的寄存器:

如果读取结束(custom.ready && custom.valid),则返回Waiting状态。

 

posted @ 2020-03-29 22:04  wjcdx  阅读(189)  评论(0编辑  收藏  举报