五级经典流水线执行 时间统计

五级经典流水线执行

时间统计

forwarding策略:


来自EX/MEM 和 MEM/EX 流水线寄存器的ALU结果总是被反馈回ALU的输入端

也就是,下一条指令,直接可以从上一条指令的EX中获得数据



但是,forwarding算法并不是完美的

它需要停顿的数据冒险:

LD/LW 的数据要在MEM结束以后才能将数据传给下一个指令的ALU(即EX环节)



所以载入指令需要增加一种称为流水线互锁 , 以保持正确的执行模式

流水线互锁检测冒险 , 并在该冒险被清除之前使流水线停顿

每个时钟周期只能添加一条指令




关于指令类型:

本实验提供的指令序列文件,不包含跳转指令,只涉及到ALU指令和load/store指令,Trace中会出现的指令类型主要是如下的几种:

ALU类型:DADD, DSUB, AND, OR, XOR

Load/store类型:LD, SD, LW, SW


模拟器正确性的验证:

trace4.txt:

DADD R2, R3, R1
DSUB R4,, R2, R1
LW   R7, 0(R1)
DADD R6, R5,, R7
XOR   R5, R6, R4
AND  R3, R5, R2
AND  R3, R5, R2



注意点:

1、只有当LD/LW 的 目的操作数 , 作为下一条指令的元操作数时 , 才会发生停顿!!!!

2、每个始终周期只能执行一条指令

这也是为什么,最后一条指令要往后再退一格




代码:


#include
   
   
    
    
#include 
    
    
     
     
#include 
     
     
      
      
#include 
      
      
       
       
#include 
       
       
         #include 
        
          using namespace std; int main() { string buffer; string str[4]; string temp = "normal"; int index = 0;//判断是否 int num = 0; ifstream in("trace4.txt"); if (! in.is_open()) { cout << "Error opening file"; exit (1); } //初始 num = 4; while (!in.eof() ) { //每执行一条指令至少多一个cycle num++; //cout << buffer << endl; getline空格也算一个字符 getline(in, buffer);/*要用#include 
         
           */ int s = 0, i; istringstream stream(buffer); stream >> str[0] >> str[1] >> str[2] >> str[3]; //一个字符串一个字符串地取出 //去掉逗号 size_t found; for(i=1 ; i<4 ; i++){ found = str[i].find(','); while(found != string::npos){ str[i] = str[i].erase(found,1); found = str[i].find(','); } } //去掉括号,去掉多余的数字 if(str[0] == "LD" || str[0] == "LW" || str[0] == "SD" || str[0] == "SW") str[2] = str[2].substr(str[2].find("(")+1 ,str[2].find(")")-str[2].find("(")-1); //输出检验 //cout << str[0] << str[1] << str[2] << str[3] << endl; //如果是Load的时候,做标记,因为只有在lod的时候会导致 , 整个流水线出现停顿的情况 if(str[0] == "LD" || str[0] == "LW"){ temp = str[1]; } else{ if(temp == "normal") continue; else{ //只有当上一个是LD / LW ,且LD / LW 的下一条命令中 , 有上一条命令的目的操作数时 //会对下一条命令产生影响,否则不会 if(str[0] == "SD" || str[0] == "SW"){ if(str[1] == temp || str[2] == temp ) num++; temp = "normal"; }else{ if(str[1] == temp || str[2] == temp || str[3] == temp) num++; temp = "normal"; } } } } cout << "num of cycles =" << num << endl; return 0; } 
          
         
       
      
      
     
     
    
    
   
   



  • 3
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值