OR1200指令Cache使用举例

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

12.4 ICache中的特殊寄存器

通过ICache的接口可知其具有特殊寄存器,并且是不可读的特殊寄存器,OR1200处理器中ICache实现的特殊寄存器如表12.1所示。

可见只实现了一个特殊寄存器——ICBIR(InstructionCache Block Invalidate Register),即指令缓存块无效寄存器,且是不可读寄存器。一般而言,特殊寄存器的地址是16位,高5位存放的是组号,低11位存放的是特殊寄存器在组中的索引,但是从表12.1中发现ICBIR的索引是任意的,这是由于第4组中只实现了这一个特殊寄存器,所以只要特殊寄存器地址的高5位是0x4,那么一定是ICBIR,这样就没必要限定一个索引,此外,从图12.5可以发现ICache没有spr_addr接口,原因同样。ICBIR格式如表12.2所示。

如果向ICBIR中写入一个地址,设为Addr,那么将使得ICache目录表中第Addr[12:4]个line的V为0,表示该line无效,实际实现就是将IC_TAG中第Addr[12:4]项的V设置为0。

12.5 ICache使用情景

同第10章分析MMU的方法一样,本章也是采用情景分析法,通过对使用ICache的各种情景的分析以实现对ICache模块剖析。使用ICache的情景有如下几种:

(1)l.mtspr指令写ICBIR

(2)指令取指阶段ICache失靶

(3)指令取指阶段ICache命中

(4)指令取指阶段,目的指令所在的内存页禁止缓存

上述四种情景中,情景(1)在流水线的执行阶段使用到了ICache,情景(2)、(3)、(4)在流水线的取指阶段使用到了ICache。本章在后续部分将给出一个示例程序,其中涉及到了ICache的全部使用情景,然后结合该示例程序分析在上述几种情景下ICache的工作过程,从而理解ICache的代码与原理。

12.6 分析用例

本节将给出一个示例程序,其中涉及到了ICache的全部使用情景,该程序运行在第11章建立的简单SOPC上,代码如下:

       .section .text,"ax"
       .global _start
       .org 0x100
#######################           第1步            #########################
_start:
      #初始化r0-r3,都清零,同时可以观察此时l.addi指令执行需要的时钟周期数
      l.movhi r0,0x0
      l.addi r1,r0,0x0
      l.addi r2,r0,0x0
      l.addi r3,r0,0x0

#######################           第2步            #########################
_IC_Init:
      # ICache初始化,将IC_TAG中512个表项的V都设置为0,表示无效,设置方法就
      # 是向ICBIR寄存器中依次写入0x0、0x10、0x20……0x2000
      l.mtspr r0,r1,0x2000          #ICBIR寄存器的组内索引可以任意,只要地址
                                    #的高5位是0x4即可,此处取0x2000

      l.sfeqi r1,0x2000             #当r1等于0x2000时表示已经设置完毕IC_TAG中
                                    #全部512个表项

      l.bnf _IC_Init                #如果r1不等于0x2000,表示还没有设置完毕,
                                    #继续循环

      l.addi r1,r1,0x10             #延迟槽指令,r1加0x10
      l.movhi r1,0x0                #ICache初始化完毕后,将r1清零,因为后面还要
                                    #使用r1

#######################           第3步            ########################
      l.ori r3,r0,0x1             #r3等于0x1
      l.mtspr r0,r3,0x1200        #向地址0x1200的SPR写入0x1,0x1200对应的SPR
                                  #是ITLBW0MR0,所以此处就是设置ITLBW0MR0,对
                                  #应MR表的第0项放置0x1,
                                  #其中VPN为0,Valid为1

      l.ori r3,r0,0x00C0          #r3等于0x00C0
      l.mtspr r0,r3,0x1280        #向地址0x1280的SPR写入0x00C0,0x1280对应的SPR
                                  #就是ITLBW0TR0,所以此处就是设置ITLBW0TR0,对
                                  #应TR表的第0项放置0x00C0,其中PPN为0x0,
                                  #sxe为1,uxe为1,ci为0

      #上述设置使得有效地址0x0-0x1fff被翻译为物理地址0x0-0x1fff,两者相等

########################           第4步            ########################
      l.ori r3,r0,0x8051          #r3等于0x8051
      l.mtspr r0,r3,0x11          #设置SR寄存器为0x8051,即SR[IME]、SR[ICE]都为1,
                                  #使能IMMU、ICache
      l.nop

########################           第5步            ########################
_loop:
      #此时ICache已经使能,第一次运行下面的循环,读取第1条指令时会发生ICache
      #失靶,于是读入第一条指令所在的内存块,共16个字节,含4条指令,这样执行第
      #2条、第3条、第4条指令时就会ICache命中,同时在后面的循环中都会ICache
      #命中
      l.addi r1,r1,0x1            #每次循环r1加1
      l.sfeqi r1,0x10             #判断是否循环了16次
      l.bnf _loop                 #如果循环了16次,则退出循环
      l.addi r2,r2,0x1            #r2记录总循环次数

#########################           第6步            #########################
      l.addi r1,r0,0x0            #r1清零

      l.ori r3,r0,0x00C2
      l.mtspr r0,r3,0x1280        #向地址0x1280的SPR写入0x00C2,0x1280对应的SPR
                                  #就是ITLBW0TR0,所以此处就是设置ITLBW0TR0,对
                                  #应TR表的第0项放置0x00C2,其中PPN为0x0,sxe为1,
                                  #uxe为1,ci为1,表示0x0-0x1fff对应的内存页禁止
                                  #缓存

      l.j _loop                   #此时0x0-0x1fff对应的内存页禁止缓存,再次执行
                                  #第5步中的循环,观察此时的执行效果

上述程序可以分为6步,每一步的主要工作如下:

第1步:初始化寄存器r0-r3,都清零。

第2步:初始化ICache,因为ICache中IC_TAG的实现主体就是单口RAM,在系统启动的时候,RAM中的内容是不确定的,所以需要初始化ICache,初始化的方法就是依次设置IC_TAG中每个表项的V为0,表示该表项无效。指令l.mtspr向特殊寄存器ICBIR中依次写入0x0、0x10、0x20……0x2000,就会依次设置IC_TAG中每个表项的V为0,参考之前对ICBIR的介绍。

第3步:设置ITLB的第一个表项,使得有效地址0x0-0x1fff被翻译为0x0-0x1fff,实际就是有效地址等于物理地址,示例程序代码很短,从地址0x100开始,不会超过0x1fff,所以在示例程序运行的时候,IMMU地址翻译的结果就是物理地址与有效地址相等,IMMU所发挥的作用在第6步中会有所体现。

第4步:设置SR寄存器,使能IMMU、ICache。

第5步:这是一个只有4条指令的循环体,并且通过计算可知循环体中4条指令地址分别是0x140、0x144、0x148、0x14C,所以这4条指令位于同一个内存块。第一次执行循环体,读取循环体中第1条指令时,会发生ICache失靶异常,于是会读入这四条指令(因为位于同一个内存块)到ICache,此时ICache中数据部分如图12.9所示。这样在执行循环体中第2、3、4条指令时就会ICache命中,并且在接下来的循环中都会ICache命中,从而循环体中每条指令执行只需要一个时钟周期,循环一共执行16次,然后退出。

第6步:再次设置ITLB的第一个表项,使得该页的属性标志位CI为1,即禁止缓存,然后再转移到第5步中的循环体执行。观察此时循环体的执行,预期效果应该是虽然此时所需指令在ICache中,但是由于设置了禁止缓存,所以还是会从RAM中取指,与没有ICache时一样,指令执行需要多个时钟周期。

在第6步转移到第5步的循环体之前会将r1清零,所以循环体中r1会重新从0x1加到0x10,但是r2会接着之前的值递增,也就是r2记录的是总的循环次数。这样当r2等于0x0-0x10时,应该是第一次执行循环体,此时CI为0,当r2为其余值时,表示不是第一次执行循环体,此时应该已经设置CI为1,在观察ModelSim仿真波形的时候可以根据r2的值判断此时是第几次执行循环体,同时可以知道此时CI是否为1。

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

##############################           第1步            #####################
       指令地址             指令                      指令对应的二进制
_start:
        0x100              l.movhi r0,0x0                0x18000000
        0x104              l.addi r1,r0,0x0              0x9c200000
        0x108              l.addi r2,r0,0x0              0x9c400000
        0x10C              l.addi r3,r0,0x0              0x9c600000
##############################           第2步            #####################
       指令地址             指令                      指令对应的二进制
_IC_Init:
        0x110              l.mtspr r0,r1,0x2000          0xc0800800
        0x114              l.sfeqi r1,0x2000             0xbc012000
        0x118              l.bnf _IC_Init                0x0ffffffe
        0x11C              l.addi r1,r1,0x10             0x9c210010
        0x120              l.movhi r1,0x0                0x18200000
##############################           第3步            #####################
       指令地址             指令                      指令对应的二进制
        0x124              l.ori r3,r0,0x1               0xa8600001
        0x128              l.mtspr r0,r3,0x1200          0xc0401a00
        0x12C              l.ori r3,r0,0x00C0            0xa86000c0
        0x130              l.mtspr r0,r3,0x1280          0xc0401a80
##############################           第4步            #####################
       指令地址             指令                      指令对应的二进制
        0x134              l.ori r3,r0,0x8051            0xa8608051
        0x138              l.mtspr r0,r3,0x11            0xc0001811
        0x13C              l.nop                         0x15000000
##############################           第5步            #####################
       指令地址             指令                      指令对应的二进制
_loop:
        0x140              l.addi r1,r1,0x1              0x9c210001
        0x144              l.sfeqi r1,0x10               0xbc010010
        0x148              l.bnf _loop                   0x0ffffffe
        0x14C              l.addi r2,r2,0x1              0x9c420001
##############################           第6步            #####################
       指令地址             指令                      指令对应的二进制
        0x150              l.addi r1,r0,0x0              0x9c200000
        0x154              l.ori r3,r0,0x00C2            0xa86000c2
        0x158              l.mtspr r0,r3,0x1280          0xc0401a80
        0x15C              l.j _loop                     0x03fffff9

ModelSim仿真波形如图12.10-12.14所示。从仿真结果可知ICache的效果是符合预期的。本书光盘的Chapter12目录下包括ModelSim仿真工程,Chapter12/Code目录下包括示例程序源代码。

本章接下来将借助该程序详细分析ICache在各种使用情景下的工作过程。

OR1200指令Cache使用举例

时间: 2024-10-30 22:52:06

OR1200指令Cache使用举例的相关文章

OR1200数据Cache的通写、回写应用举例

以下内容摘自<步步惊芯--软核处理器内部设计分析>一书 13.3 DCache中的特殊寄存器 在DCache中定义了三个特殊寄存器:DCBFR. DCBIR.DCBWR,这三个寄存器都是只可写寄存器,即只能使用指令l.mtspr操作这三个特殊寄存器.其中在通写法策略下只能使用DCBIR.DCBFR,在回写法策略下可以使用全部三个特殊寄存器.各特殊寄存器的含义如表13.1所示,格式都如表13.2所示. 当使用指令l.mtspr向数据缓存块刷新寄存器DCBFR中写入地址时,有如下几种情况: 如果该

OR1200中指令Cache的结构

以下内容摘自<步步惊芯--软核处理器内部设计分析>一书 12.3 ICache结构 OR1200中实现ICache的文件有or1200_ic_top.v.or1200_ic_fsm.v.or1200_ic_tag.v.or1200_ic_ram.v.or1200_spram.v,分别实现了ICache模块.IC_FSM模块.IC_TAG模块.IC_RAM模块.单口RAM.在ICache中例化了IC_FSM.IC_TAG.IC_RAM模块,在IC_TAG.IC_RAM模块中例化了单口RAM.如图

OR1200数据Cache介绍

以下内容摘自<步步惊芯--软核处理器内部设计分析>一书 上一章剖析了ICache模块.本章将剖析DCache模块,首先指出DCache模块相比ICache的特别之处,因为这些不同,所以DCache的分析相对复杂.接着分析了OR1200中DCache的结构,给出了构成DCache的四个模块的关系,将这四个模块分为数据部分.控制部分,介绍了数据部分的工作过程.13.3节说明了DCache中特殊寄存器的作用与格式.13.4节指出使用到DCache的7种情景,13.5节给出一个示例程序,其中涉及了DC

Or1200中IMMU使用举例

以下内容摘自<步步惊芯--软核处理器内部设计分析>一书 5 IMMU使用情景 前几章通过对OR1200处理器中各类指令执行过程的分析,实现了对CPU模块的剖析,本章将采用情景分析法,通过对使用IMMU的各种情景的分析以实现对IMMU模块剖析.使用IMMU的情景有如下几种: (1)使用IMMU进行地址翻译,同时ITLB命中,且没有违反页保护策略 (2)使用IMMU进行地址翻译,但是ITLB未命中 (3)使用IMMU进行地址翻译,虽然ITLB命中,但是违反了页保护策略 (4)l.mtspr指令写特

OR1200数据Cache运用情景分析

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

Cache基本知识与OR1200中ICache简介

以下内容摘自<步步惊芯--软核处理器内部设计分析>一书 12.1 Cache基本知识 12.1.1 Cache的作用 处理器的设计者一般会声称其设计的处理器一秒钟能做多少次乘法.每条指令只占用xx个时钟周期,可是当我们实际使用处理器时,就会发现并不是那么回事,比如在第11章,从图11.8中可以发现,当程序运行在简单SOPC上时,原先设计在执行阶段只需要一个时钟周期的指令l.movhi却使用了6个时钟周期才完成执行,造成实际情况与设计不符的原因是由于实际情况是一个由多个模块.设备组成的系统,读者

Cache基础知识OR1200在ICache一个简短的引论

以下摘录<步骤吓得核心--软-core处理器的室内设计与分析>一本书 12.1 Cache基本知识 12.1.1 Cache的作用 处理器的设计者通常会声称其设计的处理器一秒钟能做多少次乘法.每条指令仅仅占用xx个时钟周期,但是当我们实际使用处理器时,就会发现并非那么回事.比方在第11章,从图11.8中能够发现,当程序运行在简单SOPC上时.原先设计在运行阶段仅仅须要一个时钟周期的指令l.movhi却使用了6个时钟周期才完毕运行.造成实际情况与设计不符的原因是因为实际情况是一个由多个模块.设备

汇编指令大全

blt   小于跳转 tst r0,#02 bne sleep ldr  r1,#0 解释:位比较,先进行and运算,如果r0第2位不为1,则与的结果为0,设置标志位zero=1,继续下面的ldr指令.反之,zero=0,跳转到sleep执行. bne指令: 非零则跳转 个人总结:tst 和bne连用: 先是用tst进行位与运算,然后将位与的结果与0比较,如果不为0,则跳到bne紧跟着的标记(如bne sleep,则跳到sleep处). tst 和beq连用: 先是用tst进行位与运算,然后将位

ARM汇编指令汇总

1.ARM汇编的格式:    在ARM汇编里,有些字符是用来标记行号的,这些字符要求顶格写:有些伪码是需要成对出现的,例如ENTRY和END,就需要对齐出现,也就是说他们要么都顶格,要么都空相等的空,否则编译器将报错.常量定义需要顶格书写,不然,编译器同样会报错.    2.字符串变量的值是一系列的字符,并且使用双引号作为分界符,如果要在字符串中使用双引号,则必须连续使用两个双引号.    3.在使用LDR时,当格式是LDR r0,=0x022248,则第二个参数表示地址,即0x022248,同