在线咨询
eetop公众号 创芯大讲堂 创芯人才网
切换到宽版

EETOP 创芯网论坛 (原名:电子顶级开发网)

手机号码,快捷登录

手机号码,快捷登录

找回密码

  登录   注册  

快捷导航
搜帖子
楼主: oldbeginner

开源软核学习笔记05(继续OpenMIPS开发笔记)——2014_1_31

[复制链接]
发表于 2014-2-8 17:08:03 | 显示全部楼层




    当时觉得在译码阶段要做的事情比较多,所以将“解决寄存器数据相关的过程”放在了执行阶段,也就是在执行阶段才能得到最终正确的ALU操作数,所以在译码阶段是无法判断new pc的,这一点在转移指令的执行过程中会更加清楚。
    后来发现这种设计方法与mips的标准有些出入,计划在后期改进,将“解决寄存器数据相关的过程”放在译码阶段,这样在译码阶段就可以判断是否转移等,new pc也就确定了。
发表于 2014-2-8 17:10:03 | 显示全部楼层
回复 10# oldbeginner


    您这个双节棍面包我没看明白,但openmips的多周期实际并不复杂,就是暂停取指、译码,其余流水线阶段正常进行
 楼主| 发表于 2014-2-8 19:25:59 | 显示全部楼层


回复  oldbeginner


    您这个双节棍面包我没看明白,但openmips的多周期实际并不复杂,就是暂停取指 ...
leishangwen 发表于 2014-2-8 17:10




    其它食品都是加工一次(周期为1),而双截棍面包(虚构的)是要分两步,先面包,然后用链子串在一起,对厨师相当于双周期指令。

图片和动画是按照对你的iu 文件流程而做的,pc 没有增加,相当于重复了一条指令,对吗?跟在 双周期指令后面的指令在执行阶段会被覆盖,相当于被删除了(尽管该指令被取指和译码),动画上的表现是面包覆盖了面条。

谢谢你的回复,双周期指令对我来说还是比较难理解的。
 楼主| 发表于 2014-2-8 20:00:23 | 显示全部楼层


当时觉得在译码阶段要做的事情比较多,所以将“解决寄存器数据相关的过程”放在了执行阶段,也就 ...
leishangwen 发表于 2014-2-8 17:08



明白了。从代码流程上,还有模拟结果上,更换顺序好像结果都一样。

下面是把判断放到译码阶段,
-----------------------------------------------------------------------
-- DECODE STAGE
-----------------------------------------------------------------------
    --调用过程inst_decode
      inst_decode(r.d.inst, v.e.wreg, v.e.rd, v.e.aluop, v.e.alusel,
                  v.e.rfe1, v.e.rfe2, v.e.rfa1, v.e.rfa2, v.e.imm, v.e.cnt, v.e.inst_valid);
  
    if(r.e.cnt /= "00") then     --在inst_decode过程中依据指令设置r.e.cnt的值
        ex_stall_for_multicycle_inst := '1';     --对于多周期指令,设置该值为"1",表示流水线因为
                                                 --多周期指令而暂停
        v.m.whilo := '0';
        v.m.wreg := '0';
      else
        ex_stall_for_multicycle_inst := '0';
    end if;


仿真结果图,
07.JPG

结果一样。
 楼主| 发表于 2014-2-8 20:06:51 | 显示全部楼层


回复  oldbeginner


    您这个双节棍面包我没看明白,但openmips的多周期实际并不复杂,就是暂停取指 ...
leishangwen 发表于 2014-2-8 17:10




    面包会覆盖后面跟随的指令,

   if(ex_stall_for_multicycle_inst = '1') then
      rin.e.reg1 <= ex_opdata1;
      rin.e.reg2 <= ex_opdata2;   
      rin <= r;
      rin.e.cnt <= cnt_temp;        
      rin.e.hilo <= hilo_temp;
      rin.m <= v.m;                   --访存阶段继续向前流转
      rin.w <= v.w;                   --回写阶段继续向前流转


所以动画中,面包(双周期指令)会覆盖面条(任一指令)。
双周期指令会覆盖紧随的后一条指令,所以让pc 值不变换,相当于后一条指令重复了一次(因为前一次被面包覆盖了)。
取指和译码没有停止过。
发表于 2014-2-8 23:55:31 | 显示全部楼层
回复 14# oldbeginner


    您这个理解是有问题的,像您这样改变了代码顺序,但是并没有实现在译码阶段判断,判断依据还是r.e.cnt,是执行阶段的变量
发表于 2014-2-8 23:57:01 | 显示全部楼层
回复 15# oldbeginner


     并没有覆盖下一条指令,取指、译码阶段是暂停的
 楼主| 发表于 2014-2-9 18:37:31 | 显示全部楼层
回复 16# leishangwen


    这个地方我用错了,不应该用r.e,它是执行阶段的参数。可以改成v.e,然后

更改如下,
    --依据乘法结果,给出新的hilo、whilo的值,以及cnt的值
    set_new_hilo(r, v, ex_mul_res, newhilo, hilo_temp, v.m.hilo, v.m.whilo, cnt_temp );   
   
if(r.e.cnt /= "00") then     
        v.m.whilo := '0';
        v.m.wreg := '0';
end if;
-----------------------------------------------------------------------
-- DECODE STAGE
-----------------------------------------------------------------------
    --调用过程inst_decode
      inst_decode(r.d.inst, v.e.wreg, v.e.rd, v.e.aluop, v.e.alusel,
                  v.e.rfe1, v.e.rfe2, v.e.rfa1, v.e.rfa2, v.e.imm, v.e.cnt, v.e.inst_valid);
  
    if(v.e.cnt /= "00") then     --在inst_decode过程中依据指令设置r.e.cnt的值
        ex_stall_for_multicycle_inst := '1';     --对于多周期指令,设置该值为"1",表示流水线因为
                                                 --多周期指令而暂停
      else
        ex_stall_for_multicycle_inst := '0';
    end if;


只要出现双周期,就进入该指令的死循环,不停执行该指令。

双周期死循环.gif

仿真结果图,7022 0000 指令不停执行,
08.JPG

从上面的结果上看,在译码阶段设置PC 值,确实早了一步,还是在执行阶段设置PC值好一些。
 楼主| 发表于 2014-2-10 19:54:17 | 显示全部楼层
*****************************
回到 MC8051

多周期CPU时序,但是非流水线
*****************************

开始没有区分多周期cpu时序 和 多周期 指令,当成一回事,所以理解不下去了,不过在《计算机原理与设计》第8章(浏览到的)
10.JPG

开始明白 要区分 多周期 时序 和多周期指令, day5-2 是 流水线时序中的多周期指令问题

而MC8051 就是多周期时序,
在笔记04最后部分,
96.JPG

放大指令,如下
09.JPG
   
这样找到了一个OPENMIPS 和MC8051的一个主要区别,还有另外的区别是寄存器堆和堆栈结构(目前还没有太注意到)。
 楼主| 发表于 2014-2-10 22:41:56 | 显示全部楼层
******************************
day 5-3 学习

加入除法的流水线
*******************************


对除法本身如何实现暂时略过,还是考虑流水线的更新,同样基于 精简后的day4-2 ,这样流水线简单

首先是,需要增加 div 一个component,和iu 的结构如下(省略dmem),
11.JPG

其实流水线变动很小,执行阶段多了一个和 div 模块的互动,同时也是双周期指令,

day5-3流水线.gif
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

站长推荐 上一条 /2 下一条


小黑屋| 手机版| 关于我们| 联系我们| 在线咨询| 隐私声明| EETOP 创芯网
( 京ICP备:10050787号 京公网安备:11010502037710 )

GMT+8, 2024-11-28 10:41 , Processed in 0.022879 second(s), 8 queries , Gzip On, Redis On.

eetop公众号 创芯大讲堂 创芯人才网
快速回复 返回顶部 返回列表