流水线控制
下面这个是状态机,uncond表示无条件转移。
我们来看看control的控制信号给了些谁:
fetch
fetch就是计算指令地址(inc或者jar),然后等待SDRAM读取结束后输出fetch_enable_out信号,该信号控制decode。
等待SDRAM读取结束由MCU外部的mem control给出。
下面是细节说明:
在control里面:
取指结束后发出fetch_enable_out,通知decode处理。
decode
这里基本上都是组合逻辑,直接工具RISCV指令格式进行译码输出,所以主要看一下输出信号:
例如:
收到fetch_enable_out后,解码然后发出ctl指令控制exe部分。
再来看一个跳转指令
还没太看懂这个跳转地址是怎么得到的,这个后面再研究。
execution
这部分比较直接,就是根据IR的具体内容进行运算,得到不同的指令控制和数据信号,用来控制其他模块工作。
主要也是组合电路,其中乘除法由单独模块实现,时间较长。
这部分还包括寄存器读操作。
data_access
这部分包括寄存器写操作和内存访问操作,以及CSR写操作。
寄存器写操作
但是rd的地址和内容都是由是一部传递过来的,放在data_access只是延迟了一个时钟。
内存访问其实包括两部分,一部分是内存地址访问SDRAM,一部分是外设地址访问外设:
内存访问完成信号由外部引入
外设地返回信号则由mm_reg返回:
FSM
如何实现odd and even的
我怎么看都觉得这是个单周期指令CPU,并不是真正的四级流水线结构,如果我看错了请指出。
arm控制suspend
因为处理器结构的原因,实现流水线级的suspend略微有些麻烦,所以这里实现指令级的suspend,保证发出suspend信号后,阻塞下一条指令。
如果要进行单步调试的话,只需要suspend拉高,然后给出一个clk的低电平脉冲就行了。