嵌入式大赛的工程,用来看仿真波形
2021/11/19周五组会ppt
<aside> 😀 总图下面是一些细节分析,如果想搞明白整个内核,还是要先看书,然后对照代码看下自己理解的对不对
</aside>


LSU模块为什么会用到itcm呢?它只用到dtcm,nice,biu,alu/agu不就行了吗? 读和写指令主要用于程序的上电初始化,比如通过load,store指令将程序从flash里面读入到itcm,在程序运行过程中LSU不会访问itcm
数据对齐
为了解决数据对齐的问题?itcm是23位输出,为什么会存在位宽一致性问题呢?它怎么知道有没有对齐? 地址对齐这部分不是在这里做的,地址对齐检测是在agu单元,如果生成的地址最低位不是0,那么这个数据肯定和半字节(16bit)对不齐,同理,如果生成地址的最低两位不是0,那必然和一条32位的指令对不齐,这就会产生异常,交到commit模块里面,由软件代码进行处理。 LSU解决的是数据对齐的问题,也就是在写回寄存器前的对齐处理,因为寄存器是32位的,但是返回值(可以想象不同函数的返回值)可能是8位或16位,signed或者unsigned,这里需要按照扩展成32位
ALU中有五个模块:普通ALU,地址生成单元模块,分支预测解析模块,CSR读写控制模块, PC地址的生成由ifu模块自己完成,AGU只负责数据地址生成吗? 是的,AGU主要负责Load Store和A扩展指令地址的生成
为什么disp模块会用到寄存器组的数据呢?因为ALU的数据要经过disp派遣过来,指令在派遣阶段就已经完成了取值 disp模块如何判断一个指令是否是长指令呢? 派遣模块不做判断,将指令交付到alu后,alu判断,然后输出i_longwb再返回给disp模块,然后disp返回给oitf将该指令表项存下,其实整个过程都在一个周期内进行,因为alu解码本身也就是个组合逻辑,然后引一根线出去,disp也只是将这根线引入oitf. 整个过程的连线很绕,以NICE为例: exu_csr(固定输出nice_xs_off=0)→exu(nice_xs_off=0)→alu/alu_nice(输出nice_o_longpipe=1)→alu(i_long==1)→disp→oitf 因此NICE是长周期指令,因为csr固定输出这个0
CSR寄存器功能: 真就一堆寄存器,除了存数据毫无作用