团队编号:CICC2879
团队名称:八点起床读书
团队成员:黄良煜、苏桢毅
分享一下刚刚开始读E203源码时候,单条指令是如何被decode和execute的。
E203的指令,是存放在,即itcm当中的。通过
即取指模块的
端口传输到
的
端口,即执行模块当中。
需要注意的是,在ifu模块下,指令会先进行minidec,把指令的rs1值和rs2值先取出,然后传给exu模块,而在exu下的decode模块中,它就不做这个工作。
exu模块很大,他包含了regfile,decode,alu,wirteback,csr在内的多个模块,可以说是CPU的主要中心。
一条指令,从取值模块中取出以后,首先是进入了decode模块进行译码:
,
它首先会被判定是否为rv32格式的指令:
假设这条指令是rv32的addi指令,首先,这个信息会被存入alu_info_bus中:
同时,这条指令编码将会被分解:
addi指令一共提取出rs1,imm(rs2),
然后,它便从decode模块中输出,传给dispatch模块
,
需要注意的是,在dispatch模块中,rs1和rs2所索引的值直接从regfile中取出,而regfile中rs1和rs2的地址在exu模块的输入端口获取。
:
,
,
然后,它被正式传入alu模块:
在ALU当中,rd和rs1,rs2,imm的路径开始分开:
这些参数首先被传入alu_rglr,实际上相当于仲裁模块:
经过判断,该模块生成了alu所需的两个输入操作数,并传递给dpath模块:
这个模块是alu中执行运算功能的模块,在这里,指令将真正的需要进行计算
说先将操作数传递给mux_op
根据先前rglr模块传来的信号,判断是否为M类型指令。
在一轮又一轮的译码后,计算加法。
最终的结果统一筛选回alu_dpath_res中
到此,终于得到了加法器的结果,接下来要做的,是把计算结果写回regfile:
这样,计算结果被传递出了alu核心的部分,紧接着,它被传回rglr模块,包装成
引出,作为写回数据;同时,写回的rd在alu顶层模块中就已经被引出ALU模块了
对于非长指令而言,该指令直接进入wbck:
最后,写回regfile: