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

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

手机号码,快捷登录

手机号码,快捷登录

找回密码

  登录   注册  

快捷导航
搜帖子
楼主: free-arm

[资料] 详细注释-高速版-兼容ARM9软核CPU处理器(6.1已更新注释)

[复制链接]
发表于 2012-12-3 17:22:44 | 显示全部楼层
回复 92# free-arm


    寄存器数量的确是优化了一些,可是令我费解的是,执行阶段, cond,opcode等这些都需要二次译码的话,经过组合逻辑后,肯定有delay,执行逻辑也需要time, 深亚微米工艺,寄存器的delay可以做到组合逻辑的1/10,所以如果把这些不必要的delay省去,对CPU而言,用一点点面积换速度,应该更值吧? 我尝试了将部分译码结果保留,寄存器耗费了200个左右,感觉这样做可以让 译码阶段做真正的译码的事情.由于是进行了部分测试,所以速度还没测.我猜想应该会有较大的改善,比较译码阶段只用来移位那真是有点浪费了.呵呵,个人愚见,多多指教.

另外,这种改进版流水线结构的确蛮好的,不过也有不少情况下会出现2个时钟停顿,比如 LDR R0,[R1], LDR R1,[R0]; 再比如 LDR R0,[R1]!, MOV R0,R1; 造成流水停顿的情况也挺多的,不过3级到4级的转变的确是个好注意.
希望楼主能出版带DCACHE和ICACHE的来造福下我们.呵呵
 楼主| 发表于 2012-12-3 17:36:57 | 显示全部楼层
不会有时间的延时。这是因为对cmd进行译码,和对rn,rm进行运算是同时进行的,在rn和rm进行加减或逻辑运算需要用到cmd_is_xxx时,cmd早就译码成功了。也就是说cmd_is_xxx的计算过程被rn,rm的延时掩盖住了,不会叠加在一起。
发表于 2012-12-4 16:45:53 | 显示全部楼层
FPGA Change the world!
发表于 2012-12-6 11:38:30 | 显示全部楼层
准备拜读一下大作,正好想学学FPGA编程和ARM,这本书合二为一了,妙哉
发表于 2012-12-6 16:27:44 | 显示全部楼层
本帖最后由 yp19890718 于 2012-12-6 17:04 编辑

再次发现流水线停顿 因素:
LDR R1,[R2];
STR R1,[R3];
在LDR 回写阶段,STR正处于执行阶段,  STR需要更新后的R1作为数据发送到地址为R3的空间里.然后LDR尚未完成回写,如果将LDR回写阶段的数据提前传给STR来执行,如果通过STR停一拍的话,那么这种改进版流水线就没什么优势了,如果提前使用回写结果,那么同样说明在处理  LDR R1,[R2] , MOV R2,R1 时,MOV指令的执行阶段也可以提前使用LDR的回写结果, 这样就完全没有优势了.
加上这个问题,目前发现5种因为数据冲突导致流水停顿.分别是
1
LDR R1,[R2];
MOV R1,[R3];
//LDR 回写阶段 与MOV 执行阶段发生冲突,R1数据未更新,需要让MOV停顿1拍
2
MOV R1, R2
MOV R3, R4 LSR #R1
//发生在指令1 的MOV 的执行阶段和指令2 MOV的译码阶段, 指令2译码 ,如果进行寄存器移位则必须等待R1更新,需要停顿1拍

3
LDR   R1,[R2]
LDR   R2,[R1]
//这个比较明显,发生在第一个LDR的回写阶段和第二LDR的执行阶段,R1未更新.必须停顿1拍(提前使用数据的话就必须减少访存时间确保在WB前出数据,这样就只会加大工艺难度)
4
B   LABEL
//在没有CACHE的情况,这个停顿是必须,至少两拍.

5
LDR R1,[R2]
STR R1,[R4]

大神,这么多的数据冲突,虽然都能通过流水线停顿在解决,还是效率肯定是增不了多少,LDR/STR指令多起来的话那得崩溃了.而且还多花了BOM去打这些补丁,就是不知道值不值得.

求大神分析下.
发表于 2012-12-6 16:41:49 | 显示全部楼层
回复 94# free-arm


    译码阶段 :
做的事情主要还是移位操作,
MOV R0, R1 LSL  R2
那么假设
1 译出指令需要2ns
2 读R1,R2,  传输需要 0.5ns,
3 移位输出 需要5ns
其他不计
总计>7.5ns
执行阶段:
1 译出指令需要2ns
2 执行算术需要 8ns
3 写R0 传输需要0.5ns
其他不计
总计>10.5ns

就算同时进行,流水线频率  至少是  1s/10.5ns,
如果省去执行阶段的译码,改由寄存器保存,假设寄存器读出来需要0.5ns,那就是执行阶段少了1.5ns,那么流水线最大频率 是 1s/9ns.
发表于 2012-12-6 16:58:06 | 显示全部楼层
回复 94# free-arm


    另外, 译码和执行虽然是并行,但却是在操作两条不一样的指令.

   比如
时刻1
  译码模块  操作 指令B  ->译码耗时2ns+移位+其他
  执行模块 操作  指令A  ->(寄存器传输只需耗时 0.5ns) 译码耗时2ns, 这2ns完全没必要,因为不是同一条指令
时刻2
  译码模块 操作 指令C
  执行模块 操作 指令B  

指令B 必须经过时刻1 和时刻2,如果在时刻已经完成译码,时刻2就不用再译码了.

元芳你怎么看?
 楼主| 发表于 2012-12-6 20:44:56 | 显示全部楼层
回复 97# yp19890718


    停顿绝对是最好的解决方案。在三级改进流水线中,如果不是因为读操作需要一个额外周期,就不会出现这样数据冲突的情况。这个额外周期既然是额外,就可以通过增加额外的周期来避开这个数据冲突。

   这些发生数据冲突的情况虽多,但在正常的编写C程序的情况下,这些冲突发生的概率比较小,增加额外周期不会带来太多的开销,相反因为结构的简化,导致执行容易。采用三级改进结构的1.2 DMIPS/MHz,要高于ARM9TDMI的1.1 DMIPS/MHz。
 楼主| 发表于 2012-12-6 20:48:20 | 显示全部楼层
回复 99# yp19890718


    其实综合器有的材料:AND, OR, NOR这些门是非常小的,也就是说一条路径的粒度是非常小的。因此,综合器对于路径的优化的余地是非常大的。比如给你100元,10元10元的花,自然会出现你这样情况;如果是一角一角的花,那综合器优化的策略,给你最优解的概率就非常大。
发表于 2012-12-7 08:42:46 | 显示全部楼层
回复 100# free-arm


    两种不同的工艺怎么能一起草率比较.  FPGA若工艺优于ARM9的, 性能大于ARM9 也是合情合理.
   
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

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

×

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

GMT+8, 2024-11-26 05:43 , Processed in 0.020740 second(s), 7 queries , Gzip On, Redis On.

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