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

12.4 ICache中的特殊寄存器

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

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvbGVpc2hhbmd3ZW4=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" alt="">

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

ICBIR格式如表12.2所看到的。

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvbGVpc2hhbmd3ZW4=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" alt="">

假设向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次,然后退出。

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvbGVpc2hhbmd3ZW4=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" alt="">

第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仿真project。Chapter12/Code文件夹下包含演示样例程序源码。

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

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvbGVpc2hhbmd3ZW4=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" alt="">

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvbGVpc2hhbmd3ZW4=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" alt="">

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

  1. [ Linux ] 釋放記憶體指令(cache) - 轉載

    1. [Linux]釋放記憶體指令(cache) http://jeffreyy.pixnet.net/blog/post/84333764-%E3%80%90linux%E3%80%91%E9%87 ...

  2. OR1200中指令Cache的结构

    下面内容摘自<步步惊芯--软核处理器内部设计分析>一书 12.3 ICache结构 OR1200中实现ICache的文件有or1200_ic_top.v.or1200_ic_fsm.v.o ...

  3. OR1200数据Cache运用情景分析

    以下摘录<步骤吓得核心--软-core处理器的室内设计与分析>一本书 13.7DCache使用情景之中的一个--存储指令运行阶段DCache失靶 存储指令运行阶段DCache失靶这样的情景 ...

  4. OR1200数据Cache介绍

    以下摘录<步骤吓得核心--软-core处理器的室内设计与分析>一本书 上一章剖析了ICache模块. 本章将剖析DCache模块.首先指出DCache模块相比ICache的特别之处.由于这 ...

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

    以下摘录<步骤吓得核心--软-core处理器的室内设计与分析>一本书 12.1 Cache基本知识 12.1.1 Cache的作用 处理器的设计者通常会声称其设计的处理器一秒钟能做多少次乘 ...

  6. [ZZ] Cache

    http://blog.sina.com.cn/s/blog_6472c4cc0102duzr.html 处理器微架构访问Cache的方法与访问主存储器有类似之处.主存储器使用地址编码方式,微架构可以 ...

  7. OpenRisc-39-ORPSoC,or1200的memory hierarchy整体分析

    引言 前面我们简单分析了ORPSoC的整体结构,or1200_top的整体结构,or1200_cpu的整体结构. 并对ORPSoC的启动过程,ORPSoC的debug子系统,clock子系统进行了介绍 ...

  8. cpu性能探究 :cache line 原理

     參考: 一个解说Direct Mapped Cache很深入浅出的文章: http://www.cs.umd.edu/class/sum2003/cmsc311/Notes/Memory/dir ...

  9. ARM体系结构和汇编指令

    第一节 可编程器件的编程原理 1. 可编程器件的特点 1 . CPU在固定频率的时钟控制下节奏运行 2 . CPU可以通过总线读取外部存储设备中的二进制指令集,然后解码执行 3 . 这些可以被CPU解 ...

随机推荐

  1. Android控件-Fragment+ViewPager(高仿微信界面)

    什么是Fragment? Fragment是Android3.0后新增的概念,Fragment名为碎片,不过却和Activity十分相似,具有自己的生命周期,它是用来描述一些行为或一部分用户界面在一个 ...

  2. MySQL Pool

    创建连接池 function SqlPool() { this.flag = true;//是否连接过 this.pool = mysql.createPool({ host : 'localhost ...

  3. 关于【搭建LAMP环境时,php测试页面打不开】解决

    关于[搭建LAMP环境时,php测试页面打不开]解决 〇.我的测试页面是: http://172.30.124.10/index.php 用火狐打不开,如下图. 一.httpd已经启动了(system ...

  4. JS关键字 import

    今天开发时使用import作为方法名,报错 后查明报错原因:import是js中的关键字,在取方法名时不能取import

  5. 洛谷 P1719 最大加权矩形

    P1719 最大加权矩形 题目描述 为了更好的备战NOIP2013,电脑组的几个女孩子LYQ,ZSC,ZHQ认为,我们不光需要机房,我们还需要运动,于是就决定找校长申请一块电脑组的课余运动场地,听说她 ...

  6. Dynamics CRM2013/2015 插件注冊工具登录后无法显示assembly列表问题的解决的方法

    自微软从2013版本号推出新的插件注冊器后,随着UI的重大更新后,问题也多了非常多.前面已有博客提到注冊assembly时看不到注冊button(http://blog.csdn.net/vic022 ...

  7. NStimer 被堵塞

    我们在界面上滚动一个scrollview,那么我们会发如今停止滚动前,会发现NSTimer未被运行.就好像scrollView在滚动的时候将timer暂停了一样,在查看对应文档后发现,这事实上就是ru ...

  8. 迷茫了好一阵决定做WEB前端

    前两个学期事实上总是每一个学期给自己做一个计划.可是计划都付诸流水,不是自己不坚持,仅仅由于目标太不明白,总是不见成效.前一段时间最终感觉计划还得做,可是不能超过一个月,要把计划做到仔细到每一周每一天 ...

  9. javafx HTMLEditor

    public class EffectTest extends Application { //===================== private final String INITIAL_T ...

  10. OpenCV —— 视频播放控制

    创建滚动条,实现滚动条随视频播放移动. #include "cv.h" #include "highgui.h" CvCapture* capture=NULL ...