OR1200处理器的Store Buffer分析

以下内容摘自《步步惊芯——软核处理器内部设计分析》一书

14.1 SB模块的作用与工作过程

ICache是直接与Wishbone总线接口单元WB_BIU相连的,但是在DCache与Wishbone总线接口单元WB_BIU之间插入了一个Store
Buffer(SB)模块,如图1.6所示。

SB的作用是通过缓冲存储操作,从而加快存储操作。其原理是这样的:当执行存储操作时,可能需要通过WB_BIU将要写的数据写入外部Memory,尤其是在通写法模式下,每次执行存储操作都要将数据写入外部Memory,这样会等待外部Memory完成存储操作,在此期间,CPU处于暂停状态,降低了CPU的效率,引入SB后,如果是存储操作,那么SB模块将本次操作保存起来,同时立即向DCache返回一个存储完成信号(dcsb_ack_o为1),使得CPU可以继续执行,然后SB模块会接着完成被其保存起来的存储操作。在SB内部有一个FIFO(先入先出队列)作为缓冲,如果是连续的多个存储操作,那么会将每个存储操作都存放在FIFO中,并向DCache返回存储完成信号,然后SB从FIFO中取出要保存的数据,完成存储操作。图14.1是存储操作时SB的工作过程。

上述设计会带来两个问题:

(1)SB直接向DCache返回存储完成信号,但如果在SB通过WB_BIU模块向外部Memory存储的过程中发生错误如何处理?

(2)如果存储操作还在SB中缓存,也就是SB没有完成存储操作,但此时DCache又发起了加载操作,如何处理以避免可能出现的数据不一致的情况?

SB模块没有处理第一个问题,读者在使用SB模块的时候需要注意,处理第二个问题的方法是:在加载操作执行前进行判断,只有FIFO为空才可以进行加载操作,这样就可以避免出现数据不一致的情况。并且加载操作不会被SB保存到FIFO中,而是直接交给WB_BIU模块。图14.2是加载操作时SB的工作过程。

SB是存储缓冲模块,从名称上理解只是缓冲存储操作,而ICache不会有存储操作,只有读取指令操作,所以在ICache与WB_BIU模块之间不需要插入SB模块。

14.2 SB模块的结构

14.2.1 SB模块的对外连接关系

为了对SB模块有一个整体的认识,本小节给出SB模块的对外连接关系,如图14.3所示。从图中可知,SB与DCache、SB与WB_BIU之间都是Wishbone总线接口,并且CPU有一个sb_en信号输入到SB,该信号为SB使能信号,当该信号为1时,表示SB使能,如果sb_en为0,那么SB禁止,此时相当于DCache与WB_BIU模块直接相连。

此外,SB与DCache之间的接口名称都是dcsb_xxx_x的形式,SB与WB_BIU之间的接口名称都是sbbiu_xxx_x的形式,因此,通过接口名称就可以知道该接口位于哪两个模块之间。

14.2.2 SB模块内部结构

构成SB的源代码文件有:or1200_sb.v、or1200_sb_fifo.v,分别对应SB、FIFO模块,FIFO模块实现了一个先入先出队列,其在SB模块内例化,例化语句如下:

or1200_sb.v
……
or1200_sb_fifo or1200_sb_fifo (
	.clk_i(clk),	           //输入的时钟信号
  .rst_i(rst),	                    //输入的复位信号
  .dat_i(fifo_dat_i),	           //要保存到FIFO中的数据
  .wr_i(fifo_wr),	                    //FIFO写操作
  .rd_i(fifo_rd),                     //FIFO读操作
	.dat_o(fifo_dat_o),	 //从FIFO中读出的数据
  .full_o(fifo_full),	          //FIFO满标志位,为1表示FIFO满,反之FIFO不满
  .empty_o(fifo_empty)                //FIFO空标志位,为1表示FIFO空,反之FIFO中有数据
);
……

参考上述例化语句得到图14.4,其中给出了FIFO模块的接口,以及各个接口连接到SB的对应变量,每个模块的左边是输入接口,右边是输出接口,每个模块内部是接口名,外部引脚上的名称代表SB中的对应变量。本章后面在分析SB时需要参考该图,图中各个变量的含义在上面例化语句的注释中已经说明。

14.2.3 SB模块有关的宏定义

OR1200中有关SB模块的宏定义如下:

or1200_defines.v
`define OR1200_SB_IMPLEMENTED       //默认没有实施SB,需要去掉注释才可以使用SB
`define OR1200_SB_ENTRIES	    4	//FIFO的深度
`define OR1200_SB_LOG	    2	//OR1200_SB_ENTRIES以2为底的对数

14.3 示例程序

本节将给出一个简单的示例程序以验证SB模块的效果,因为这里主要验证SB模块对存储指令的影响,希望消除取指操作的影响,所以还是使用第13章分析DCache时修改过的简单SOPC作为验证平台,此时,代码存储在QMEM中,取指操作可以在一个时钟周期完成,不影响指令执行。

有一点需要注意,要修改OR1200中的一个错误,参考图14.3可知,SB使能信号sb_en来自CPU模块,参考CPU模块可知sb_en等于如下:

or1200_cpu.v
`ifdef OR1200_SB_IMPLEMENTED        //可见即使实施了SB,但是sb_en的代码被注释掉了
//assign sb_en = sr[`OR1200_SR_SBE];
`else
assign sb_en = 1'b0;
`endif

这是OR1200的一个错误,作者可能原本希望使用特殊寄存器SR的一个标志位OR1200_SR_SBE来控制SB的启动与停止,但是在OR1200的特殊寄存器SR定义中并没有OR1200_SR_SBE这个标志位,将上述代码改为如下:

or1200_cpu.v
`ifdef OR1200_SB_IMPLEMENTED
assign sb_en = 1'b1;
`else
assign sb_en = 1'b0;
`endif

这样只要定义了宏OR1200_SB_IMPLEMENTED,sb_en就为1,也就是SB使能。

示例程序如下:

       .section .text,"ax"
       .global _start
       .org 0x0         #修改后的简单SOPC在复位后,会从QMEM的0x0处读取指令,所以代码从0x0开始
_start:
      l.movhi r0,0x0     #初始化r0、r1、r2、r3,分别设置为0x0、0x1、0x2、0x3
      l.addi r1,r0,0x1
      l.addi r2,r0,0x2
      l.addi r3,r0,0x3

      l.sw 0x0(r0),r0    #依次将0x0、0x1、0x2、0x3保存到RAM的地址0x0处
      l.sw 0x0(r0),r1
      l.sw 0x0(r0),r2
      l.sw 0x0(r0),r3

上述代码很简单,就是向RAM的0x0处依次存入0x0、0x1、0x2、0x3。

在Ubuntu中新建文件Example.S,内容就是上述代码,拷贝ram.ld、Makefile、Bin2Mem.exe到Example.S所在目录,其中的Makefile选择在10章中修改过后的Makefile,也就是不会使用OR1KSim进行模拟。打开终端,调整路径到上述文件所在目录,输入“make
all”得到可以在ModelSim仿真中使用的存储器初始化文件mem.data。修改后的简单SOPC就使用该文件初始化QMEM。为了便于知道仿真波形中if_insn、id_insn、ex_insn等信号对应的指令,下面列出指令与其对应的二进制,分为三列,分别是指令地址、指令、指令对应的二进制。

 指令地址               指令                指令对应的二进制
  0x800000          l.movhi r0,0x0               0x18000000
  0x800004          l.addi r1,r0,0x1             0x9c200001
  0x800008          l.addi r2,r0,0x2             0x9c400002
  0x80000C          l.addi r3,r0,0x3             0x9c600003

  0x800010          l.sw 0x0(r0),r0              0xd4000000
  0x800014          l.sw 0x0(r0),r1              0xd4000800
  0x800018          l.sw 0x0(r0),r2              0xd4001000
  0x80001C          l.sw 0x0(r0),r3              0xd4001800

注释掉OR1200_SB_IMPLEMEMTED这个宏定义,也就是不使用SB模块,ModelSim仿真波形如图14.5所示。不注释掉OR1200_SB_IMPLEMEMTED这个宏定义,也就是使用SB模块,ModelSim仿真波形如图14.6所示。从两个波形比较可知,SB模块确实减少了存储操作所需要的时钟周期,达到了设计目的。

本书光盘的Chapter14目录下包括ModelSim仿真工程,Chapter14/Code目录下包括示例程序源代码。由于SB模块比较简单,所以本章接下来直接对SB模块的源代码进行分析,按照自底向上的顺序分析,先分析FIFO模块,再分析SB模块。

OR1200处理器的Store Buffer分析,布布扣,bubuko.com

时间: 2024-10-13 00:07:11

OR1200处理器的Store Buffer分析的相关文章

OR1200处理器的可编程中断控制器PIC分析

以下内容摘自<步步惊芯--软核处理器内部设计分析>一书 16.3可编程中断控制器PIC分析 16.3.1 PIC介绍 可编程中断控制器Programmable Interrupt Controller(PIC)用来响应各种中断事件,如:键盘事件.串口数据到达等,PIC收集所有的中断,并通知CPU中断到达,后者转入到中断处理例程进行处理.OR1200最多支持32个中断.其功能实现主要依靠两个特殊寄存器:中断屏蔽寄存器PICMR.中断状态寄存器PICSR.通过PICMR可以设置是否屏蔽某些中断,通

OR1200处理器的计时器模块TT介绍

以下内容摘自<步步惊芯--软核处理器内部设计分析>一书 16.2.1 TT介绍 计时器模块(Tick Timer:TT)一般用在操作系统的进程调度.用户程序的定时参考等.TT内部会对时钟周期计数,当计数值达到一个预设值时,会产生中断,通知处理器进行处理.其实现的主体是两个特殊寄存器:计时器单元计数寄存器TTCR.计时器单元模式寄存器TTMR,通过这两个SPR的不同配置,实现不同的工作模式,以及计时中断的产生.TTCR.TTMR是第10组特殊寄存器,如表16.4所示.TTCR.TTMR的格式分别

OR1200处理器中Wishbone总线接口模块WB_BIU介绍

以下内容摘自<步步惊芯--软核处理器内部设计分析>一书 WB_BIU模块是OR1200处理器与外部Wishbone总线连接的接口模块,15.1节给出了WB_BIU模块的对外连接关系,并指出WB_BIU模块的三个作用.因为OR1200处理器支持Wishbone B3版本,所以在15.2节介绍了Wishbone B3版本中的寄存反馈总线周期,重点说明了其中的周期类型识别地址标签CTI_O/CTI_I.突发类型扩展地址标签BTE_O/BTE_I的作用. 15.1 WB_BIU模块的对外连接关系 通过

or1200处理器的异常处理类指令介绍

以下内容摘自<步步惊芯--软核处理器内部设计分析>一书 我们在计算机体系结构的学习中知道:中断实质上包括由外部事件引起的硬中断(又称外中断)和由内部预先安排的特定指令或内部异常引起的软中断(又称内中断或异常)两大类.在OR1200处理器中将中断称之为异常(exception),硬中断是其中的一种异常,当然这只是说法的不同而已.当异常发生时,有关处理器的状态信息被存储到某些寄存器,OR1200处理器转移到事先定义好的一个地址,在那个地址中往往有异常处理例程,在其中进行异常处理,这个地址称为异常处

OR1200数据Cache运用情景分析

以下摘录<步骤吓得核心--软-core处理器的室内设计与分析>一本书 13.7DCache使用情景之中的一个--存储指令运行阶段DCache失靶 存储指令运行阶段DCache失靶这样的情景在通写法.回写法策略下有不同的运行过程,在通写法策略下直接写存储器中相应的地址,不操作DCache. 在回写法策略下.首先推断目的地址相应的DCache中文件夹表的line是否被改动,假设是(Dirty为1).则将该line写回到内存,然后将目的地址所在的内存块读入DCache,填充到相应line,然后再改动

Speculative store buffer

A speculative?store?buffer is speculatively updated in response to speculative store?memory operations buffered by a?load/store?unit in a microprocessor. Instead of performing dependency checking for?load?memory operations among the?store?memory oper

or1200处理器的数据流图

以下内容摘自<步步惊芯--软核处理器内部设计分析>一书 完整的OR1200处理器流水线数据通路图,如图9.12所示,图中显示了数据处理类.特殊寄存器访问类.转移类.异常处理类.乘法除法类.加载存储类指令处理过程中流水线各个阶段的数据流转. (1)取指阶段:GENPC模块计算指令地址,然后通过指令Wishbone总线从指令存储器中取得指令,取得的指令送入IF模块,该指令进入流水线. (2)译码阶段:取出指令需要的通用寄存器的值dataa.datab,同时对指令中可能有的立即数进行符号扩展或零扩展

在基于or1200处理器的SoC上移植linux

经历了前端的艰苦奋斗.SoC前端设计已经调试完毕,如今直接进入uboot移植   首先cd入u-boot-master 找到子文件夹include下得de2_115.h文件进行改动: (下一步计划:加入flash固化uboot:加入网卡替代串口下载uImage) Cd 进入u_boot_master: 1)      $  make de2_115_config 2)      $  make 3)      生成u_boot文件,然后用or1ksim.cfg进行仿真 生成的u_boot; 得到

or1200于IMMU分析

以下摘录<步骤吓得核心--软-core处理器的室内设计与分析>一本书 1 IMMU结构 OR1200中实现IMMU的文件有or1200_immu_top.v.or1200_immu_tlb.v.or1200_spram.v,当中使用or1200_immu_top.v实现了IMMU模块,使用or1200_immu_tlb.v实现了ITLB模块,or1200_spram.v是一个单口RAM.使用事实上现了ITLB的表项.如图10.5所看到的. 本小节将分别介绍IMMU模块与其余模块的连接关系.IT