CPU指令分析-1

1 Instruction Fetch(IF)阶段

IF阶段的操作有取指令,并决定下一条PC寄存器的内容。IF阶段由流水线寄存器与总线接口组成。

1.1 IF阶段的流水线寄存器(if_reg)

首先PC、指令寄存器以及流水线数据有效标志都设置为初始值以及对应的无效值:

if_pc = 0;  
if_insn = NOP[32'd0];  
if_en = DISABLE;  

流水线寄存器的刷新要在延迟信号stall无效的时候才能刷新,刷新有以下三个动作* flush有效,对流水线寄存器进行刷新操作 本操作包括设置新的PC地址,指令寄存器设置为NOP,流水线数据有效标志置为无效 * 分支处理 分支信号有效的时候,PC设置为分支地址,指令寄存器设置为读取的指令,流水线数据有效标志设置为有效 * PC步进处理 在既没有延迟,也没有分支的情况下,PC地址+1,指令寄存器和流水线数据有效标记和分支处理中的保持一致
指令insn等于rd_data,rd_data来源于两个地方:要么是spm里面的数据,要么是总线上的bus_rd_data。if_pc回去控制address,来控制总线的地址。IF阶段的总线信号会连接到总线0上。

  • 程序计数器PC的控制
    ROM会根据程序计数器的值读出数据,然后读出的数据会传到指令寄存器if_insn上,这个指令寄存器以及pc会传到ID指令译码阶段进行后续的操作,同时,还会传送一个enable信号if_en。if_en会在flush有效的时候拉低,其他时间都置为有效。

1.2 取指阶段的状态控制

首先在BUS_IF_STATE_IDLE状态,在刷新信号flush无效,address选通信号as_n有效的时候进行判断(flush是mem_flush,上电之后是无效的,as_n一直有效的[常量]) :

Created with Raphaël 2.2.0StartBUS_IF_STATE_IDLE(~flush)&(~as_n)&(s_index!=BUS_SLAVE_1)?BUS_IF_STATE_REQbus_grant_n = 0 ?BUS_IF_STATE_ACCESSstall=1 ?BUS_IF_STATE_STALLstall=0 ?yesnoyesnoyesnoyesno
  • 空闲状态 : BUS_IF_STATE_IDLE
    当state处于空闲状态时,本状态一旦检测到内存访问有效则跳入下一个状态,所谓的内存访问有效实际上就是指地址选通信号有效as_n,刷新信号flush无效,并且此时的slave的index不是slave 1[SPM存储空间],此时会把总线请求置为有效[req_n = 0],并且将cpu总线信号和bus信号相连[诸如读写使能、地址以及数据等],然后调到下哦那个先请求状态BUS_IF_STATE_REQ

  • 请求总线状态 : BUS_IF_STATE_REQ
    总线请求状态等待总线获取授权[grant_n = 0],则跳到总线访问状态,并且将bus_as_n置为有效,否者一直等待。此时,总线忙信号busy信号有效。

  • 访问总线状态 : BUS_IF_STATE_ACCESS
    一旦进入访问总线状态,则首先把地址选通信号as_n拉低[即保持一个周期],然后等待总线ready信号有效[rdy_n = 0]。一旦ready有效,则置请求、地址、写数据等为无效,总线的rw使能置为READ。如果此时rw为read,则将bus_rd_data数据保存到rd_buf中,如果延迟信号stall有效,则跳到延迟状态,否则调到空闲状态。
    当ready信号还未有效的时候,busy信号置为有效,表示总线正忙。
    总线ready信号bus_rdy_n的值直接等于对应的slave bus的ready信号。这里如果slave_index为0的话,则选择的是s0,s0的信号连接到了rom上,rom的ready信号处理如下:

always @(posedge clk or `RESET_EDGE reset) begin
        if (reset == `RESET_ENABLE)
            begin
                rdy_n   <= `DISABLE_N;
            end 
        else begin
            if ((cs_n == `ENABLE_N) && (as_n == `ENABLE_N))
                begin
                    rdy_n   <= `ENABLE_N;
                end 
            else
                begin
                    rdy_n   <= `DISABLE_N;
                end
        end
    end

从上述代码可看出,一旦cs和as同时有效,则s0的ready信号就有效,它们之前会有一个clock的延时。

  • 延迟
    如果处于延迟状态并且rw是READ,则同上一状态中一样的操作,将数据保存到rd_buf。当stall无效的时候,则跳回IDLE状态

1.2 Instruction Decode(ID)阶段

ID阶段对指令进行解码并生成必要的信号。数据的直通,Load冒险检测、分支的判定都在这一阶段进行。ID阶段由指令解码器decoder和流水线寄存器id_reg构成。

1.2.1 指令解码器


版权声明:本文为xuyeyue000原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。