Hi Han Chao:
谢谢细致的指导!!
看来考虑流水线确实很麻烦
关于cycle types我还有一个问题不明白。
Ncycle 是否可以看做是random access
Scycle 是否可以看做是burst read 中的一个周期?
所以是不是Scycle可能只等于一个bus cycle, 但是Ncycle就是要有好几bus cycle来完成寻址,预充电等工作?
还有一个问题是官员SDRAM的。
我现在正在用skyeye模拟at91, 频率只有30MHz~70MHz, 这个频率比DRAM的频率还要低。 我的问题是在嵌入式应用中,内存的频率也像PC中的DRAM这么高吗? 66M,133M,200M? 还是会比较低一点?
麻烦了 谢谢
在 2013年4月8日星期一UTC-4上午2时28分42秒,HanChao写道:
Hi 传盛
别着急考虑复杂的流水线。
先要确认几个问题:
1. 关于ARM每条指令周期的数据,你是从哪里得到的?
根据现有的公开资料,ARM每条指令周期的数据,只有ARMv5E版本之前的
现在的处理器都是没有公开的。
不知道你是不是有内部的资料?
我用的是ARM7TDMI, 是armv4的,
指令周期数是从这个连接找到的
2. 指令的周期和运行时间不是乘一个系数关系
在大多数时间内,人们关心的后者。
从ARMv4的ARM7开始就有流水线
指令总周期 = 取指令+译码+执行
但是有了流水线之后,在没有跳转的情况下,典型的情况是
每个流水线干一件事情,所以平均下来“一条指令一个周期”
而这个周期也就简化为“指令的执行周期”
这是不是就是书里说的Cycles per Instruction? 我现在没有考虑流水线, 其实相当于认为是理想的流水线,一个指令一个周期。另外一个用到的假设就是, 访问特定地址空间(scratchpad memory 地址空间),会很块,用1个cycles,访问main memory 地址空间很慢,4个cycle。 现在的模型却是太粗糙了。所以我也想考虑进流水线,但是感觉应该会很难。
3.由于“取指令”“译码”的时间平摊到多流水线中
因此所以很多时候,根除指令的周期,其实就是执行周期。
比如,你可以看一下乘加指令的执行周期,就比一般的MOV,ADD等指令要长
这句话我不太明白
“因此所以很多时候,根除指令的周期,其实就是执行周期。”
是说 有写指令的周期(比较耗时的指令),就是执行周期,而不能像普通流水线中的指令(MOV, ADD)算作一个cycle?
4.即使只考虑三级流水线,由于跳转要清空流水线
因此,那时候的“取指令”“译码”就浪费了。
也就是说,如果想得到总执行时间,还和指令的顺需要关系
5.即使ARMv4的ARM9,也是五级流水线
这个问题其实就已经相当复杂了(同样频率,同样代码,在同一个体系结构的运行时间不一定相同)
到了ARMv6,ARMv7,有了更多级流水线,
这是在运行之前,基本不能计算的问题
不知道你有什么特别的思路吗?
现在我正在做一个关于嵌入式系统调度的东西,想要验证调度算法。 一开始没有意识到skyeye不能做cycle accurate的仿真,所以现在只能做些粗略的修改。
关于真实的运行时间,这个确实很麻烦,之前看过一些worst case execution time的东西,感觉只能估测出一个上限,具体的值应该算不出来。
有的软件aiT,sweet, 好像可以做这件事情,但是感觉在skyeye中考虑流水线是件很麻烦的事情。
我看一些wcet估测的东西还要考DRAM refresh的不确定性。好像确实很麻烦。