自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(27)
  • 资源 (1)
  • 收藏
  • 关注

原创 E203自测试样例复现

推荐使用VMware虚拟机,在虚拟机中安装Linux操作系统。蜂鸟E203处理器的仿真环境支持VCS和iverilog两款工具,因此在运行仿真前,请确保运行环境中已安装VCS或者iverilog仿真工具,若安装iverilog仿真工具,请确保其版本号为V12.0。需要注意的是,在x86-64的众多版本当中,需要选择2020.08这个版本,否则会在接下来的编译链接的步骤中报错:commond not found。需要注意的是,iverilog仿真工具的版本必须为12.0,有些教程使用如下的代码安装。

2023-12-25 17:14:29 442

原创 RISC-V异常处理机制以及e203异常处理源码学习

狭义的异常和中断是根据引起异常的原因来区分的,狭义的异常一般是由内因引起的,例如程序故障或者执行特殊的指令,狭义的中断一般是由外因引起的,例如外部中断。广义的异常包括狭义的异常和中断。下面的讨论的异常无特殊说明,都指的是广义的异常。RISC-V有四种工作模式,下面只讨论机器模式(RISC-V处理器核必备的模式)下的异常处理机制。

2023-12-11 09:46:14 526

原创 e203存储器子系统介绍

LSU:负责接受来自AGU以及协处理器的请求,并访问ITCM、DTCM或系统内存,将访问的结果传输给AGU或者协处理器。同时负责load-Reserved以及store-Conditional指令的实现,具体可见。ITCM:指令紧耦合存储器,是e203用于存储指令的单元,同时也可以作为数据访存单元接受LSU的访问,具体可见。AGU:主要负责读写指令以及A扩展指令集的访存地址,同时实现amo原子操作指令。DTCM:数据紧耦合存储器,是e203用于存储数据的单元,具体可见。

2023-12-06 16:11:54 178

原创 e203总线接口单元介绍

本文章简介了e230的ICB总线协议和BIU的架构

2023-12-06 15:34:20 408

原创 e203存储器子系统—lsu_ctrl源码实现

该监测器能够保证只有当互斥读(Load-Exclusive)和互斥写(Store-Exclusive)指令成对地访问相同的地址,且其间隙中没有任何其他的写操作(来自于任何一个线程)访问过同样的地址,互斥写(Store-Exclusive)指令才会执行成功。• 当有任何一个写指令(包括普通的写或者 Store-Conditional)执行时,如果写指令访问存储器的地址和互斥检测器中存储的地址一样,则将互斥检测器的有效标志清除掉。)指令执行的存储器写操作之间并不会将总线锁定,因此并不会造成系统性能的下降。

2023-12-04 11:19:04 155

原创 e203存储器子系统模块-DTCM以及源码学习

本文简要介绍了e203 DTCM模及其源码

2023-11-29 14:41:54 246

原创 E203存储器子系统——ITCM模块源码学习

本文简要介绍了e203的ITCM模块及其源码

2023-11-29 11:42:33 287

原创 E203存储器子系统-lsuagu模块学习

AGU是ALU的一个子单元,根据 RISC-V 架构定义,读/写指令需要将其第一个寄存器索引的源操作数和符号位扩展的立即数相加,得到最终的访存地址,因此理论上需要使用到加法器。e203在软件层面支持对于地址未对齐的读写指令的处理:产生异常标志,并将此标志传递给交付模块,交付模块据此产生异常。为了能够支持 RISC-V 架构中定义的 AMO 指令的行为,蜂鸟 E203 在 AGU 单元中使用了状态机将 AMO 指令拆分为若干个不同的微操作,其步骤分别为如下。

2023-11-29 09:56:06 180 1

原创 RISC-V存储器原子操作——RV32A指令子集简介

SC(Store-Conditional)指令用于向存储器(地址为 rs1 寄存器的值指定)中写入一个32 位数据,数据的值来自于 rs2 寄存器中的值。此类指令用于从存储器(地址为 rs1 寄存器的值指定)中读出一个数据,存放至 rd 寄存器中,并且将读出的数据与 rs2 寄存器的值进行计算,再将计算后的结果写回存储器(存储器写回地址与读出地址相同)。LR(Load-Reserved)指令用于从存储器(地址为 rs1 寄存器的值指定)中读出一个 32位数据,存放至 rd 寄存器中。

2023-11-22 11:36:37 286 1

原创 E203执行阶段——运算数据通路(dpath)模块学习

2.异或器的复用:按位逻辑运算和比较运算(比较是否相等)使用统一的异或器来进行实现。3.加法器复用:比较运算、加减乘除等算数运算都使用统一的加法器来实现。运算数据通路模块是 ALU 真正用于计算的数据通路模块。子单元的请求进行具体运算,然后将计算结果返回给其他子单元运算数据通路。1.左移指令和右移指令统一用左移操作来进行实现。运算数据通路的功能比较简单,它被动地接受其他。

2023-11-20 17:24:03 105 1

原创 E203执行阶段——乘除模块(muldiv)模块学习

比如,上一条指令是divu操作,操作数为32和5,则商为6,同时不恢复余数法还会顺带计算得到余数为2.因此,若下一条指令为remu,且操作数同样为32和5,则可以直接单周期返回余数2的结果。对于有符号整数除法操作,可以使用常用的加减交替法(又名不恢复余数法),然后使用迭代的方法,个周期使用加法器生成部分余数,经过多个周期的迭代之后得到最终商和余数。MDV模块主要通过实现统一的状态机来实现乘除法操作,状态机有5个状态:第一周期状态,执行状态,余数检查状态,商纠正状态,余数纠正状态。

2023-11-20 16:53:59 144 1

原创 蜂鸟e203执行阶段——最终写回仲裁模块(wbck)以及长指令写回模块(longpwbck)学习

本文介绍了蜂鸟e203的两级写回模块的写回机制,以及源码

2023-11-15 17:45:01 110

原创 E203基本整数指令集(RV32I)简介

假设只支持机器模式,MPP 的值永远为 11。由于在进入异常时,MPIE 的值曾经被更新为 MIE 的值(MIE 的值则更新为 0 以全局关闭中断),因此通过这个机制则意味着 mret 指令执行后处理器的 MIE 值被更新回了之前的值(假设之前的 MIE 值为 1,则意味着中断被重新全局打开)。由于在之前进入异常时,mepc 寄存器被同时更新以反映当时遇到异常的指令的 PC,因此通过这个机制则意味着 mret 指令执行后处理器回到了当时遇到异常的指令的 PC 地址,从而可以继续执行之前被中止的程序流。

2023-11-13 17:02:59 503

原创 e203执行阶段——普通ALU模块源码学习

所有模块共享数据通路,运算数据通路是真正进行数据计算的模块,普通ALU模块主要负责常规的ALU计算(逻辑运算、加减法和移位等),此模块完全由组合逻辑构成,其主要逻辑是根据普通ALU的指令类型,发起对共享数据通路的操作请求,并且从共享的运算数据通路中取回计算结果。蜂鸟e203处理器核的ALU包括5个模块:普通ALU模块、地址生成单元模块、分支预测解析模块、CSR读写控制模块、多周期乘除模块。普通ALU模块:普通ALU模块主要负责常规的ALU计算(逻辑运算、加减法和移位等)以下是普通ALU模块的源码以及注释。

2023-11-06 17:24:03 145

原创 e203源码学习——oitf模块学习

为了检测出RAW以及WAW相关性,蜂鸟e203使用了一个滞外指令追踪FIFO(OITF),OITF默认深度为两个表项,每派遣一个长指令,就会在分配一个表项用于存储该长指令的源操作数寄存器以及结果操作数寄存器。

2023-11-06 11:01:17 149

原创 e203取指阶段——ALU模块的学习

e203的派遣规则指定,所有的指令都必须先被派遣到ALU,然后由ALU派遣给其他的子运算单元(例如普通ALU,AGU等等)。由于所有的指令都要经过ALU,所以实际的派遣发生在ALU的内部,disp模块所做的是消除数据的依赖性,出来来自外部的终止信号,将指令根据类型进行大体分类,分别派遣到ALU或者FPU进行进一步的派遣。注:笔者认为:这里所说的所有指令因该指的是进行整数操作的所有指令,进行浮点数操作的指令不在此列,这些指令应该由FPU进行派遣,令人遗憾的是,e203开源代码并没有实现FPU。

2023-11-01 16:14:52 130 1

原创 e203执行阶段——派遣disp模块源码学习

e203执行阶段——派遣disp模块源码学习

2023-10-30 16:17:57 118 1

原创 e203执行阶段——整数通用寄存器组模块 Regfile源码学习

整数通用寄存器组模块(Integer_Regfile)主要用于实现RISC-V架构定义的整数通用寄存器组。e203实现了顺序的发射派遣以及顺序的写回,而且一次之发射派遣一条指令,写回一条指令,因此e203通用寄存器组只需要实现一个写端口,两个读端口。通用寄存器可以通过锁存器来实现,由宏E203_REGFILE_LATCH_BASED来进行配置;如果没有配置此宏,则由D触发器实现。通用寄存器写端口的逻辑是通过比较结果寄存器的寄存器索引号与当前寄存器的索引号是否相等来生成写使能;

2023-10-26 16:18:04 127 1

原创 E203执行阶段——译码模块e203_exu_decode学习

e203的译码模块完全由组合逻辑组成,其主要逻辑根据RISC-V架构的指令编码规则进行译码,产生不同的指令类型的信息、操作数寄存器索引等。RSIC-V指令集相关可以参见蜂鸟《手把手教你RISC-V CPU处理器设计》附录ARSIC-V指令编码相关可以参见蜂鸟《手把手教你RISC-V CPU处理器设计》附录F第六部分附上了本模块的源码以及注释。

2023-10-25 16:20:30 189 1

原创 E203取指模块——Ifetch模块的学习

Ifetch模块的功能是根据简单译码器以及分支预测单元的结果来生成下一个指令的PC值。下面是ifetch模块的源码以及注释。

2023-10-23 17:19:47 183

原创 E203取指模块——简单BPU模块的源码学习

对于无条件跳转连接指令jalr,需要判断源操作数1的寄存器索引,如果为x0,则总是判断为跳转;简单BPU模块的主要功能是根据简单译码模块的结果来进行预测,预测下一个指令的PC,E203实现了一个简单的静态分支预测功能,即对于条件分支跳转指令,如果是向后跳转,则预测为跳,向前跳转预测为不跳。1.判断OITF是否为空,如果OTIF不为空,证明有长指令正在执行,这条长指令可能会写入当前指令的源操作数1寄存器,E203对于这种情况保守地预测为不跳。如果存在数据依赖性,IFU会挂起直到数据依赖性被消除。

2023-10-23 16:28:52 90

原创 E203取指模块——简单译码miniDecode模块源码解析

E203取指模块——简单译码miniDecode模块源码解析

2023-10-23 15:44:45 86

原创 E203取指架构解析

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

2023-10-23 15:23:30 80

原创 蜂鸟E203-取值模块-e203_ifu_ift2icb源代码学习

蜂鸟E203-取值模块-e203_ifu_ift2icb源代码学习

2023-10-23 11:43:00 263

原创 Java用foreach语法遍历三维数组

1.定义三维数组的方法声明格式并分配空间:数据类型 数组名[ ][ ][ ] =new 数据类型[ ][ ][ ] 例如:int a[][][]=new int [][][]初始化1)使用for循环进行初始化例如:for(int i=0;i<3;i++) for (int j=0;j<4;j++) for(int k=0;k<5;k++) a[i][j][k]=i*j*k;2)直接初始化例如、int a[][][]=new ...

2021-10-23 23:37:18 897

原创 java修饰词总结

java修饰词总结前言 `在Java中修饰词至关重要,正确地使用修饰词是Java开发必不可少的。我参照了很多网站上的、书上的以及老师讲的内容,简要地对修饰词进行了总结,本人为初学者,有不对的或者需要补充的地方,请不吝指出。公共类型public:可以修饰类、成员变量、成员方法、构造方法。是java中权限最大的一个修饰符,可以在不同的包之间访问,且访问不同的包时需要用到类的全名 私有类型private:可以修饰成员变量、成员方法、构造方法,被private修饰的成员只能在本...

2021-10-23 23:14:24 1841

原创 利用java calendar类实现日历和万年历

java calendar类在java.util包中,这是一个抽象类,它提供了YEAR、MONTH、DAY_OF_MONTH、DAY_OF_WEEK等字段以及get(),set(),getInstance()等方法,利用这写方法很容易对时间字段进行操作,从而得到一个日历或万年历

2021-10-23 09:08:42 575

CalendarIo.java

利用java calendar类实现万年历

2021-10-23

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除