天天看点

CPU设计实战 第4章 实践任务三前言一、实验内容

CPU设计实战-汪文祥 邢金璋

第4章 实践任务三

实验环境 lab4.zip

文章目录

  • 前言
  • 一、实验内容

前言

在lab4的实验环境下,增加相应代码用前递技术解决相关引发的冲突,最后使得仿真时间相比实践任务二更少。

一、实验内容

在译码级判断当前时刻处于执行级、访存级或者写回级的指令的目的操作数的寄存器号是否与译码级源操作数的寄存器号是否相同后,表示已经发生了数据相关,需要将执行级、访存级或者写回级的数据前递到译码级。代码如下:

EXE_stage:		
	output [31:0] EXE_result, 
	assign EXE_result      = es_alu_result;
	
MEM_stage:	
	output [31:0] MEM_result
	assign MEM_result      = ms_final_result;
	
WB_stage:		
	output [31:0] WB_result
	assign WB_result         = ws_final_result;
	
ID_stage:
	input  [31:0] EXE_result,
	input  [31:0] MEM_result,
	input  [31:0] WB_result,
           

别忘了在mycpu_top相应模块的实例化中添加对应的信号。

我们在译码级得到了当前时刻处于执行级、访存级和写回级的指令需要最终写回到寄存器的目的操作数后,接下来就要产生相应的逻辑来判断需要前递的是执行级、访存级还是写回级的数据。在译码级修改的代码如下:

/*数据前递增加/修改代码*/

//修改-begin
assign rs_value = rs_wait ? (rs == EXE_dest ?  EXE_result :
                             rs == MEM_dest ?  MEM_result : WB_result)
                            : rf_rdata1;
assign rt_value = rt_wait ? (rt == EXE_dest ?  EXE_result :
                             rt == MEM_dest ?  MEM_result : WB_result)
                            : rf_rdata2;

assign ds_ready_go    = ds_valid & ~load_stall;  
//load_stall在实践任务二就已经添加,表示第i条指令是load指令,第i+1条指令
和load指令发生数据相关,此时需要前递的数据还未准备好,需要流水线暂停。

//修改-end
/*---------------*/