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. 【XML】XPath表达式

    XPath简介 XPath即为XML路径语言(XML Path Language),它是一种用来确定XML文档中某部分位置的语言. XPath基于XML的树状结构,提供在数据结构树中找寻节点的能力.起 ...

  2. 记录C#-WPF线程中如何修改值

    new Thread(() => { Application.Current.Dispatcher.BeginInvoke(DispatcherPriority.Normal, new Acti ...

  3. Spring Cloud Netflix Ribbon详细介绍及自定义规则策略

    之前文章我们介绍了如何配置具有Ribbon轮询机制的负载均衡策略的消费者,这次来具体了解一下Ribbon的一些细节,以及如何自定义负载均衡策略等. 说一下Ribbon实现负载均衡的大致思路.它通过用@ ...

  4. 8.python3实用编程技巧进阶(三)

    3.1.如何实现可迭代对象和迭代器对象 #3.1 如何实现可迭代对象和迭代器对象 import requests from collections.abc import Iterable,Iterat ...

  5. 基于Spark.NET和ML.NET Automated ML (自动学习)进行餐厅等级的检查预测

    简介 Apache Spark是一个开源.分布式.通用的分析引擎.多年来,它一直是大数据生态系统中对大型数据集进行批量和实时处理的主要工具.尽管对该平台的本地支持仅限于JVM语言集,但其他通常用于数据 ...

  6. itest(爱测试) 3.3.7 发布,开源BUG 跟踪管理& 敏捷测试管理软件

    v3.3.7 下载地址 :itest下载 itest 简介:查看简介 V3.3.7 增加了 5个功能增强,和8个BUG修复 ,详情如下所述. 5个功能增强 :(1)任务看板中,除了显示任务外,增加测试 ...

  7. AWVS破解安装

    参考大佬@pirogue的安装步骤及awvs安装包,@pandahks的安装依赖,在本地虚拟机安装awvs,艰辛历程记录如下. 虚拟机操作系统:CentOS Linux release 7.7.190 ...

  8. pytest-2:allure 的安装、使用

    版本对应: python3.4==>allure-pytest2.7.0 python3.6==>allure0pytest2.8.6 环境安装: 1.先安装好对应的python,准备好p ...

  9. pycharm安装pymysql包

    1.为什么? 每个程序连接数据库,python开发2.*版本可以直接使用MySQL,python3.*版本需要下载使用PyMySQL包才能连接数据库... 2. 怎么做? 2.1. 更改源:pycha ...

  10. 2019.6.11_MySQL进阶一:索引

    所谓索引就是为特定的mysql字段进行一些特定的算法排序,比如二叉树的算法和哈希算法,哈希算法是通过建立特征值,然后根据特征值来快速查找.MySQL索引的建立对于MySQL的高效运行是很重要的,索引可 ...