蜂鳥E203 IFU模塊


E203的IFU(instruction fetch unit)模塊主要功能和接口如下:

  1. IFU的PC生成單元產生下一條指令的PC。
  2. 該PC傳輸到地址判斷和ICB生成單元,就是根據PC值產生相應讀指請求,可能的指令目的是ITCM或者外部存儲,外部存儲通過BIU訪問。
  3. 該PC值也會傳輸到和EXU單元接口的PC寄存器中。
  4. 取回的指令會放置到和EXU接口的IR(Instruction register)寄存器中。EXU單元會根據指令和其對應的PC值進行后續的操作。
  5. 因為每個周期都要產生下一條指令的PC,所以取回的指令也會傳入Mini-Decode單元,進行簡單的譯碼操作,判別當前指令是普通指令還是分支跳轉指令。如果判別為分支跳轉指令,則在同一周期進行分支預測。最后,根據譯碼的信息和分支預測的信息生成下一條指令的PC。
  6. 來自commit模塊的沖刷管線請求會復位PC值。

因為蜂鳥IFU要在同一個時鍾周期完成取指,譯碼,分支預測,生成PC等多個操作,所以時序上的關鍵路徑會制約它的最高主頻。


image

IFU模塊的接口包括如下信號:

inspect_pc, output,  位寬:32

當前IFU所取指令的pc值,如果當前ifu_reset_req信號置高,則為pc復位值,即pc_rtvec值=0x1000,因為指令被放在itcm中,itcm起始地址為0x8000_0000,所以通常pc值為itcm的某個地址值。

當rom啟動系統時候,復位pc是0x1000=4096,通過指令0x7ffff297,auipc x5,0x7ffff, 當前x5=當前pc值+7ffff000=0x1000+0x7ffff000=0x8000_0000,指向了itmc的首地址。

然后通過指令jalr=0x28067, 指令跳轉到x5指定的地址。

rom的初始化在文件sirv_mrom.v 中

  genvar i;
  generate
   if(1) begin: jump_to_ram_gen
       // Just jump to the ITCM base address 
      for (i=0;i<1024;i=i+1) begin: rom_gen
          if(i==0) begin: rom0_gen
              assign mask_rom[i] = 32'h7ffff297; //auipc   t0, 0x7ffff
          end
          else if(i==1) begin: rom1_gen
              assign mask_rom[i] = 32'h00028067; //jr      t0
          end
          else begin: rom_non01_gen
              assign mask_rom[i] = 32'h00000000;
          end
      end
   end
   else begin: jump_to_non_ram_gen

ifu_active, output, 位寬1

這個輸出信號總是1,意味着ifu模塊會一直處於活動狀態。

pc_rtvec, input, 位寬32

pc復位值,如果用simulation,其值為0x1000, 如果用fpga,外部qspi flash地址為0x2000_0000。這個信號從常開域傳入。

sirv_aon_wrapper.v

  //  This signal will be passed to the main domain, since this is kind of pad selected signal
  //    we dont need to sync them in main domain, just directly use it
  assign pc_rtvec = aon_io_bootrom ? 32'h0000_1000 :
      // This is the external QSPI flash base address 
                                     32'h2000_0000;


ifu2itcm_holdup, input, 位寬1

上次訪問itcm的模塊是ifu,則設置該信號為高。

itcm_region_indic, input, 位寬32

itcm 起始地址指示信號,它的值為 0x8000_0000

該值在cpu_top.v中實例化e203_core時候,傳入宏E203_ITCM_BASE_ADDR的值。

ifu2itcm_icb_cmd_valid, output, 位寬1

ifu2itcm_icb_cmd_ready,input,位寬1

ifu和itcm命令通道通訊的握手信號,采用icb協議,icb協議會在單獨的文章中詳細介紹。

ifu2itcm_icb_cmd_addr,output,位寬16

ifu請求讀/寫itcm數據的起始地址,因為itcm是64K大小,所以itcm地址位寬為16位。

ifu2itcm_icb_rsp_valid, input, 位寬1

ifu2itcm_icb_rsp_ready,output,位寬1

ifu和itcm響應通道通訊的握手信號,采用icb協議,icb協議會在單獨的文章中詳細介紹

ifu2itcm_icb_rsp_err, input, 位寬1

讀或寫itcm反饋的錯誤標志,如果該信號為低,則ifu接受itcm的返回結果。

ifu2itcm_icb_rsp_rdata, input, 位寬64

從itcm返回的32位數據。

ifu2biu_icb_cmd_valid, output, 位寬1

ifu2biu_icb_cmd_ready,input,位寬1

ifu和biu命令通道通訊的握手信號,采用icb協議,icb協議會在單獨的文章中詳細介紹。這個接口用於從system memory中讀取數據

ifu2biu_icb_cmd_addr,output,位寬32

ifu請求讀/寫biu數據的起始地址,32位地址。

ifu2biu_icb_rsp_valid, input, 位寬1

ifu2biu_icb_rsp_ready,output,位寬1

ifu和biu響應通道通訊的握手信號,采用icb協議,icb協議會在單獨的文章中詳細介紹

ifu2biu_icb_rsp_err, input, 位寬1

讀或寫biu反饋的錯誤標志,如果該信號為低,則ifu接受biu的返回結果。

ifu2biu_icb_rsp_rdata, input, 位寬32

從biu返回的32位數據。

ifu_o_ir,output, 位寬32

指令寄存器中的值,是當前從itcm或biu中讀取的32位指令數據,傳輸到exu的decoder中進行解碼操作。

當指令來自於biu(system memory)時候,取得數據是32位,ifu_o_ir是ifu2biu_icb_rsp_rdata寄存一個周期。

當指令來自於itcm時候,因為itcm是64位所以ifu2itcm_icb_rsp_rdata,返回的數據是64位因為itcm是sram,上次訪問的數據會一直holdup住。但ifu每次只取其中32位數據。因為會連續兩次或多次在一個lane(64位對齊的數據成為一個lane)里面訪問。如果上次訪問的itcm的sram,下一次取指在同一個lane里面,則不會真的讀取sram,會利用sram holdup的特性,直接使用其保持不變的輸出如果順序取一個32位的指令其非對齊的地址跨越了64位邊界,那么會將sram當前輸出的最高16位放在leftover buffer之中。並發起新的itcm sram訪問操作,然后將新訪問itcm sram返回的低16位與leftover buffer中的值拼接成一個完整的32位指令。因此等效於一個周期讀取一條指令,不會造成性能損失。如果是非順序取指,比如分支或跳轉指令,且地址為非對齊地址跨越了64位邊界,那么就需要發起兩次itcm讀操作。第一個讀回的數據的高16位放入leftover buffer中,第二次讀回的數據的低16位和leftover buffer中的16位數據組合想成一個32位的指令。因此需要兩個周期才能取回指令。

ifu_o_pc,output,位寬32

當前的指令pc值,注意:ifu_o_pc和inspect_pc的區別,ifu_o_pc相當於被寄存一個周期的inspect_pc值。

ifu_o_pc_valid, output, 位寬1

pc信號是有效的

ifu_o_misalgn,output,位寬1

該信號總是0,在e203中,不會發生不對齊的情況。

ifu_o_buserr,output,位寬1

該信號=ifu_rsp_err

ifu_o_rs1idx,output,位寬5

當前指令 源寄存器rs1的索引,來自於mini decoder模塊的輸出

ifu_o_rs2idx,output,位寬5
當前指令 源寄存器rs2的索引,來自於mini decoder模塊的輸出

ifu_o_prdt_taken,output,位寬1
當前指令預測是否需要跳轉,來自於ifu中的bpu模塊。

ifu_o_mul2div_b2b,output,位寬1

// For multiplicaiton, only the MUL instruction following
//    MULH/MULHU/MULSU can be treated as back2back
 ( minidec_mul & dec2ifu_mulhsu)
 // For divider and reminder instructions, only the following cases
 //    can be treated as back2back
 //      * DIV--REM
 //      * REM--DIV
 //      * DIVU--REMU
 //      * REMU--DIVU

pipe_flush_ack,output,位寬1

總是1,

pipe_flush_req,input,位寬1

pipe flsuh請求,來自於exu模塊,沖刷現在管線,根據新的pc值從新取指。

pipe_flush_add_op1,input,32

pipe flsuh操作的op1,和op2一起決定新的pc

pipe_flush_add_op2,input, 32

pipe flsuh操作的op2,和op1一起決定新的pc

ifu_halt_req,input,位寬1

ifu_halt_ack,output,位寬1

ifu halt請求響應信號,請求置高后,ifu停止取新的指令,ack響應置高后,恢復取指令。

   

// The halt request come from other commit stage
//   If the ifu_halt_req is asserting, then IFU will stop fetching new 
//     instructions and after the oustanding transactions are completed,
 //     asserting the ifu_halt_ack as the response.
 //   The IFU will resume fetching only after the ifu_halt_req is deasserted


oitf_empty,input,位寬1

oitf為空,不用進行數據沖突判斷,肯定不存在RAW和WAW數據沖突

rf2ifu_x1,input,位寬32

當前x1寄存器的值

rf2ifu_rs1,input,位寬32

當前指令中rs1寄存器的值

dec2ifu_rden,input,位寬1

當前指令包括目的寄存器寄存器rd

dec2ifu_rs1en,input,位寬1

當前指令包括源寄存器rs1

dec2ifu_rdidx,input,位寬5

當前指令目的寄存器rd索引

dec2ifu_mulhsu,input,位寬1

當前指令為mulh,mulhsu, mulhu

dec2ifu_div,input,位寬1

當前指令為div

dec2ifu_rem,input,位寬1

當前指令為rem

dec2ifu_divu,input,位寬1

當前指令為divu

dec2ifu_remu,input,位寬1

當前指令為remu

clk,input,位寬1
時鍾信號

rst_n,input,位寬1

復位信號






免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM