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等多个操作,所以时序上的关键路径会制约它的最高主频。

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

复位信号

蜂鸟E203 IFU模块的更多相关文章

  1. E203 译码模块(1)

    E203是两级流水线结构,第一级是IFU进行取指操作,第二级包括译码.执行.交付和写回等功能.架构图如下: https://www.cnblogs.com/images/cnblogs_com/mik ...

  2. 蜂鸟E203系列——Linux开发工具

    欲观原文,请君移步 Vivado安装 vivado是运行工程的工具,所以必须安装 后台回复[vivado2017]可获取vivado 2017.4 | 后台回复[vivado2020]可获取vitis ...

  3. 蜂鸟E203系列——Linux调试(GDB+Openocd)

    欲观原文,请君移步 本文基于文章<蜂鸟E203系列--利用 Hbrid-E-SDK 环境开发程序> GDB 简介 GDB(GNU Project Debugger),是 GNU 工具链中的 ...

  4. E203 译码模块(2)

    常用的alu算术运算指令(包括ecall和 ebreak)在regular alu单元处理.regular alu单元为alu单元的一个子单元.regular单元的信息总线共21位,格式如下图所示,其 ...

  5. 蜂鸟E203系列——Linux下运行hello world例程

    欲观原文,请君移步 创建程序 在 -/hbird-e-sdk-master/software 路径下创建一个"helloworld"中文件夹 在 -/hbird-e-sdk-mas ...

  6. E203译码模块(3)

    下面的代码译码出指令的立即数,不同的指令有不同的立即数编码形式. //I类型指令的imm,[31:20],符号位扩展成32位. wire [31:0] rv32_i_imm = { {20{rv32_ ...

  7. 真正的RISC-V开发板——VEGA织女星开发板开箱评测

    前言 由于最近ARM公司要求员工"停止所有与华为及其子公司正在生效的合约.支持及未决约定",即暂停与华为的相关合作,大家纷纷把注意力投向了另一个的处理器架构RISC-V,它是基于精 ...

  8. RISCV 入门 (学习笔记)

    文章目录 1. risv 相关背景 1.1 arm 授权费 1.2 riscv 发展历史 1.3 riscv 风险 2. 指令集 2.1 可配置的通用寄存器组 2.2 规整的指令编码 2.3 简洁的存 ...

  9. E203 CSR寄存器

    RiscV架构则定义了一些控制和状态寄存器(CSR),用于配置或记录一些运行的状态.CSR寄存器是处理器内核内部的寄存器,使用专有的12位地址编码空间,对一个hart,可以配置4k的CSR寄存器. 蜂 ...

随机推荐

  1. 安装Ubuntu系统后的配置工作

    目录 卸载webapps和LibreOffice 修改软件更新和安装的apt源 修改安装python库的pip源 安装并设置搜狗输入法 安装vim.git.pip和tweak软件 修改用户主目录下的文 ...

  2. USB通信协议深入理解

    0. 基本概念 一个[传输](控制.批量.中断.等时):由多个[事务]组成: 一个[事务](IN.OUT.SETUP):由一多个[Packet]组成. USB数据在[主机软件]与[USB设备特定的端点 ...

  3. fiddler---Fiddler接口测试

    前面介绍了Fiddler一些简单的使用功能,Fiddler不仅可以抓包也可以做接口工具使用,在没有接口文档的时候我们也可以通过Fiddler查看接口具体有哪些内容 Fiddler发送请求 在Fiddl ...

  4. Linux 中find命令

    1.在当前目录下找以txt结尾的文件 find . -name '*.txt' 2.在当前目录下找以所有字母开头的文件 find . -name '[a-z]*' 3.在/etc 目录下找以host开 ...

  5. Python学习笔记2基本语法规则_20170611

    # 1.print 显示示例 print('Hello, World!') 逗号分割变量,输出插入空格 name = 'BB' print('AA', name) # output: >> ...

  6. remote: http basic: access denied fatal: authentication failed for '‘解决办法

    问题描述 由于这个项目代码使用https 进行clone,为什么?因为代码库ssh有问题!fuck! 导致在push代码的时候出现了 remote: http basic: access denied ...

  7. Bootstrap分页查询

    前台方法: function show() { $('#reportTable').bootstrapTable({ method: 'get', url: "@Url.Action(&qu ...

  8. SQL Server 修改数据库

    1. 可视化界面修改数据库 (1)右击数据库,然后选择属性. (2)在工具选项卡中,选择[文件]页,可以更改所有者,文件大小,自增量等参数. 2.  使用ALTER Database修改数据库 (1) ...

  9. 2019 SDN阅读作业(2)

    1.过去20年中可编程网络的发展可以分为几个阶段?每个阶段的贡献是什么? 可编程网络的发展可以分为以下三个阶段: (1)主动网络(Active networking,20世纪90年代中期到21世纪初) ...

  10. vue 使用key唯一令牌解决表单值混乱

    vue在渲染元素时,出于效率考虑,会尽可能地复用已有元素的而非重新渲染,如果你不希望这样可以使用Vue中提供的key属性,它可以让你决定是否要复用元素,key值必须是唯一的 代码: <!doct ...