五级流水线CPU之低功耗设计 (一) :Bypassing(旁路)

五级流水线整体图示:

某些指令执行的流水线级数:    

由上面两幅图可知,流水线的第四级是Data Memory,用于数据的存入和读取,但是CPU的指令集中除了LOAD指令和STORE指令在第四级流水线使用了Data Memory里的数据,其他的指令并没有在这一级流水线进行了任何的操作(并没有使用Data Memory里的数据),也就是说,流水线第四级对除LOAD指令和STORE指令之外的指令并没有实质意义,但却导致了不必要的功率损耗。因此,对于LOAD、STORE之外的指令,四级流水线(将WB级提前一级)的采用可以减少不必要的功率损耗。实现过程图如下:




但是由于某些指令需要五级流水线,而某些只需四级流水线(将WB阶段提前一级),但在实现的过程中要注意冲突问题。

为更清晰的表达利用旁路实现低功耗的原理和讨论冲突问题,先将25条指令(27条指令除去NOP和HALT指令)分为四类:

 

第一类:

指令:LOAD

IF

ID

EX

MEM

WB

 

第二类:

指令:STOREJMPRBZBNZBNBNNBCBNC

IF

ID

EX

MEM

NOP

 

第三类:

指令:LDIH、ADD、ADDI、ADDC、SUB、SUBI、SUBC、OR、AND、SLL、SRL、SLA、SRA

IF

ID

EX

NOP

WB

 

第四类:

指令:CMPJUMP

IF

ID

NOP

NOP

NOP

 

         由上面的分类可知:第一类指令必须采用五级流水线;第二类指令,空操作NOP处于流水线第五级(流水线最后一级),没有办法对流水线提前一级;第四类指令,空操作NOP处于流水线第四第五级,也没有办法对流水线提前一级;第三类指令,空操作NOP只处于流水线第四级,可提前一级流水线,但当前指令为第三类中的指令时,上一条指令的WB阶段不为NOP时,若把当前指令的WB阶段提前一级,会出现冲突,也就是说把当前指令的WB阶段提前一级的前提是上一条指令是第二类或者第四类指令,不能为第一类指令。

算术类指令并没有使用到流水线第四阶段,data memory. 同时,STORE指令并不需要WB这一级流水线,而LOAD指令通过了五级流水线。在无用的阶段中的转化会造成额外的功率消耗,这些不必要的转化可以通过在无用的阶段中旁路来实现减少。在算术类指令中不需要访问内存,因此由EX阶段得到的数据可以直接传给第五阶段WB。在此过程中,EX/MEM的流水线寄存器均为0因此保证了没有寄存器的跳转

 

代码如下:

         `define idle 1'b0
`define exec 1'b1
`define NOP 5'b00000
`define HALT 5'b00001
`define LOAD 5'b00010
`define STORE 5'b00011


`define LDIH 5'b00100 
`define ADD 5'b00101
`define ADDI 5'b00110
`define ADDC 5'b00111
`define SUB 5'b01000
`define SUBI 5'b01001
`define SUBC 5'b01010


`define CMP 5'b01011


`define AND 5'b01100
`define OR 5'b01101
`define XOR 5'b01110
`define SLL 5'b01111
`define SRL 5'b10000
`define SLA 5'b10001
`define SRA 5'b10010 


`define JUMP 5'b10011
`define JMPR 5'b10100
`define BZ 5'b10101
`define BNZ 5'b10110
`define BN 5'b10111
`define BNN 5'b11000
`define BC 5'b11001
`define BNC 5'b11010


module Bypassing(
input clk,reset,enable,start,
input [15:0] d_datain,i_datain,
output wire [7:0] i_addr,
output reg [7:0] d_addr,pc,
output reg [15:0] d_dataout,
output reg d_we 
);


reg state,nextstate;
reg [15:0] gr[0:7];
reg [15:0] id_ir,ex_ir,mem_ir,reg_A,reg_B,reg_C,ALUo,smdr,smdr1,reg_C1,wb_ir;
reg dw,zf,nf,cf;

assign i_addr = pc;


//************* CPU control(双过程) *************//
always @(posedge clk or negedge reset)
begin
if (!reset)
state <= `idle;
else
state <= nextstate;
end


always @(*)
begin
case (state)
`idle : begin
if ((enable == 1'b1) && (start == 1'b1))
nextstate <= `exec;
else
nextstate <= `idle;
end
`exec : begin
if ((enable == 1'b0) || (wb_ir[15:11] == `HALT))//HALT 
nextstate <= `idle;
else
nextstate <= `exec;
end
endcase
end

//************* IF : Instruction fetch *************//
always @(posedge clk or negedge reset)
begin

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值