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状态。