查看: 1308|回复: 0
收起左侧

蜂鸟E203 IFU模块

[复制链接]

  离线 

  • TA的每日心情
    奋斗
    2021-3-3 12:32
  • 签到天数: 10 天

    [LV.3]

    发表于 2021-3-6 14:51:33 | 显示全部楼层 |阅读模式

    有人预言,RISC-V或将是继Intel和Arm之后的第三大主流处理器体系。欢迎访问全球首家只专注于RISC-V单片机行业应用的中文网站

    您需要 登录 才可以下载或查看,没有帐号?立即注册

    x
    本帖最后由 皋陶 于 2021-3-6 14:59 编辑

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

    • IFU的PC生成单元产生下一条指令的PC。
    • 该PC传输到地址判断和ICB生成单元,就是根据PC值产生相应读指请求,可能的指令目的是ITCM或者外部存储,外部存储通过BIU访问。
    • 该PC值也会传输到和EXU单元接口的PC寄存器中。
    • 取回的指令会放置到和EXU接口的IR(Instruction register)寄存器中。EXU单元会根据指令和其对应的PC值进行后续的操作。
    • 因为每个周期都要产生下一条指令的PC,所以取回的指令也会传入Mini-Decode单元,进行简单的译码操作,判别当前指令是普通指令还是分支跳转指令。如果判别为分支跳转指令,则在同一周期进行分支预测。最后,根据译码的信息和分支预测的信息生成下一条指令的PC。
    • 来自commit模块的冲刷管线请求会复位PC值。


    因为蜂鸟IFU要在同一个时钟周期完成取指,译码,分支预测,生成PC等多个操作,所以时序上的关键路径会制约它的最高主频。

    国内芯片技术交流-蜂鸟E203 IFU模块risc-v单片机中文社区(1)

    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 中
    1. genvar i;
    2.   generate
    3.    if(1) begin: jump_to_ram_gen
    4.        // Just jump to the ITCM base address
    5.       for (i=0;i<1024;i=i+1) begin: rom_gen
    6.           if(i==0) begin: rom0_gen
    7.               assign mask_rom[i] = 32'h7ffff297; //auipc   t0, 0x7ffff
    8.           end
    9.           else if(i==1) begin: rom1_gen
    10.               assign mask_rom[i] = 32'h00028067; //jr      t0
    11.           end
    12.           else begin: rom_non01_gen
    13.               assign mask_rom[i] = 32'h00000000;
    14.           end
    15.       end
    16.    end
    17.    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
    1. //  This signal will be passed to the main domain, since this is kind of pad selected signal
    2.   //    we dont need to sync them in main domain, just directly use it
    3.   assign pc_rtvec = aon_io_bootrom ? 32'h0000_1000 :
    4.       // This is the external QSPI flash base address
    5.                                      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
    1. // For multiplicaiton, only the MUL instruction following
    2. //    MULH/MULHU/MULSU can be treated as back2back
    3. ( minidec_mul & dec2ifu_mulhsu)
    4. // For divider and reminder instructions, only the following cases
    5. //    can be treated as back2back
    6. //      * DIV--REM
    7. //      * REM--DIV
    8. //      * DIVU--REMU
    9. //      * 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响应置高后,恢复取指令。
    1. // The halt request come from other commit stage
    2. //   If the ifu_halt_req is asserting, then IFU will stop fetching new
    3. //     instructions and after the oustanding transactions are completed,
    4. //     asserting the ifu_halt_ack as the response.
    5. //   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
    复位信号





    上一篇:E203 bypass buffer
    下一篇:E203 译码模块(1)
    RISCV作者优文
    全球首家只专注于RISC-V单片机行业应用的中文网站
    回复

    使用道具 举报

    高级模式
    B Color Image Link Quote Code Smilies

    本版积分规则

    关闭

    RISC-V单片机中文网上一条 /2 下一条



    版权及免责声明|RISC-V单片机中文网 |网站地图

    GMT+8, 2024-4-25 07:57 , Processed in 0.805264 second(s), 48 queries .

    快速回复 返回顶部 返回列表