Cache基本知识与OR1200中ICache简介

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

12.1 Cache基本知识

12.1.1 Cache的作用

处理器的设计者一般会声称其设计的处理器一秒钟能做多少次乘法、每条指令只占用xx个时钟周期,可是当我们实际使用处理器时,就会发现并不是那么回事,比如在第11章,从图11.8中可以发现,当程序运行在简单SOPC上时,原先设计在执行阶段只需要一个时钟周期的指令l.movhi却使用了6个时钟周期才完成执行,造成实际情况与设计不符的原因是由于实际情况是一个由多个模块、设备组成的系统,读者朋友应该都知道“短板效应”,一个水桶能装载的最大水量取决于组成水桶的最短木板的长度。同样,当其余模块速度很慢时,即使处理器速度很快,整个系统的速度也不会快。其中影响系统速度的一个重要模块就是存储器,第11章的简单SOPC就是由于从存储器取指需要多个时钟周期导致处理器暂停以等待指令取到,从而使得l.movhi指令用了多个时钟周期才执行完成。

处理器的工作频率一直都在突飞猛进,但是存储器(包含内存、硬盘等)的工作频率却增长缓慢,其实也可以将程序、数据都存储在处理器内部的存储空间中(就像本书第2章建立的最小系统,其将程序、数据都存放在OR1200内部的QMEM中,所以可以实现在一个时钟周期内读取指令,两个时钟周期内读取存储数据),但是处理器内部的存储空间可谓寸土寸金,为了在价格和性能之间找到一个平衡,现代计算机一般采用多级存储层次,如图12.1所示。硬盘是最便宜的,所以可以使用大容量的硬盘,但是速度是最慢的;Cache一般是处理器内部的SRAM,成本最高,可以使用的容量有限,但是速度很快,一般可以在一个时钟周期完成访问;内存位于两者之间,速度上优于硬盘,但不如Cache,成本上优于Cache,但不如硬盘。

在Cache中存放的是最近访问的或者可能即将访问的数据(此处的数据包括指令、数据),CPU需要数据时,首先在Cache中查找,如果在Cache中找到需要的数据,就直接访问Cache中的数据,如果在Cache中没有找到需要的数据,那么再到内存中查找,查找结束,将查找到的数据及其附近数据存放到Cache中,这样下一次查找同样内容或者附近内容时就可以在Cache中找到。

Cache提高处理器性能是利用了程序的局部性原理,包括时间局部性、空间局部性,如下:

  • 时间局部性:如果某个数据被访问,那么在不久的将来它很可能再次被访问,典型的例子就是循环,循环体代码被处理器重复执行,直到循环结束,第一次访问循环体代码时会从内存中读取,同时将该代码存放到Cache中,这样在后面的循环中CPU都能够在Cache中查找到所需代码,从而加速了取指过程
  • 空间局部性:如果某个数据被访问,那么与它临近的数据很可能很快被访问,典型的例子就是数组,数组中的元素常常按照顺序依次被程序访问

12.1.2 Cache的结构与工作过程

Cache是按照块进行管理的,内存被分割成大小相同的块,数据以块为单位调入Cache,Cache中设有一个目录表,该表的项称为line,line对应于内存中的一个块,包括该内存块的块地址高位部分,称为标识,line中还包括该内存块的内容,以及是否有效标志位V。如图12.2所示,图中假设内存块大小是16字节、目录表有512个line,此时也称为有8KB
Cache。

从12.1.1节对Cache作用的描述可知,Cache涉及到的主要操作就是查找、存放,查找操作就是给出一个地址判断该地址对应数据是否在Cache中,存放操作就是将从内存中读取的数据放到Cache中,这两个操作引入了两个问题:

(1)当把数据调入Cache时,放在目录表的哪个位置?

(2)Cache是如何通过目录表查找数据的?

上述两个问题的不同解决方法形成不同的Cache映射方式,有三种Cache映射方式:全关联映射、直接映射、分组关联映射。这一点与MMU的映射方式是一样的,在OR1200处理器中只实现了直接映射方式,所以本书也只介绍直接映射方式,读者朋友可以查阅书籍了解其余Cache映射方式。直接映射是指内存中的每一个块只能被放置到Cache中唯一的一个位置,这样方便查找。采用直接映射时,Cache查找过程如图12.3所示,此处还是假设内存块是16字节,Cache中目录表有512个line。

送入Cache中要查找的数据地址一般是物理地址(比如:在OR1200中Cache位于MMU之后,所以送入Cache的是物理地址),由于块大小是16字节,Cache中有512个line,所以使用该物理地址4-12位的值作为索引读出对应line,将line中的标识与物理地址的高19位比较,如果相等,且line中的标志位V为1,则Cache命中(Cache
hit),反之Cache失靶(Cache miss)。

当Cache命中且为读操作时,依据物理地址的低4位(即块内偏移)从line的16字节数据中读出对应的数据返回给处理器。当Cache失靶且为读操作时,需要从内存中读出对应地址的数据以及与其处于同一个内存块的数据,将需要的数据送往CPU,同时将所有读出的数据写入Cache,要写入的目录表索引由地址的4-12位决定。从上述过程可以更深刻的理解直接映射:直接映射方式中,内存的每一个块只能被放置到Cache唯一的一个位置。

如果处理器要执行写操作,并且要写的目的地址在Cache中能找到,称之为写命中,当处理器修改了Cache中的数据,内存中对应的数据如何改变,这涉及到写策略,常用的有通写法(Write
through)、回写法(Write back),不同的写策略决定了Cache不同的工作方式,在下一章剖析DCache时会详细说明。

12.2 OR1200中Cache简介

OR1200处理器采用Harvard结构,具有分开的指令Cache(ICache)、数据Cache(DCache)。参考图1.6可知ICache位于IMMU之后、DCache位于DMMU之后,所以送入ICache、DCache的地址都是物理地址。

ICache只有读操作,但是DCache可读可写。DCache涉及到写操作时的情况,较复杂,所以笔者分开分析,在本章只剖析ICache,在下一章剖析DCache。

ICache涉及到的宏定义如下,从中可知ICache能够配置为512B、4KB、8KB、16KB、32KB,默认是8KB,本章采用默认配置,后面分析时不再重复说明。此时内存块是16字节,采用直接映射,ICache目录表有512行,因此使用地址的4-12bit作为ICache目录表的查找索引。

or1200_defines.v
//`define OR1200_NO_IC           //是否有ICache,默认是注释掉,也就是有ICache

//`define OR1200_IC_1W_512B
//`define OR1200_IC_1W_4KB
`define OR1200_IC_1W_8KB         //配置ICache的大小,默认是8KB
//`define OR1200_IC_1W_16KB
//`define OR1200_IC_1W_32KB

`ifdef OR1200_IC_1W_32KB         //如果配置ICache是32KB,那么内存块大小是32字节
 `define OR1200_ICLS		5
`else
 `define OR1200_ICLS		4        //其余情况下,内存块大小都是16字节
`endif

`ifdef OR1200_IC_1W_8KB          //如果配置ICache为8KB,那么一些宏定义如下
`define OR1200_ICSIZE		13	//ICache是8KB,所以地址宽度是13
`define OR1200_ICINDX		`OR1200_ICSIZE-2	    // 11
`define OR1200_ICINDXH		`OR1200_ICSIZE-1	  // 12
`define OR1200_ICTAGL		`OR1200_ICINDXH+1	    // 13

//13位地址中的高9位是ICache目录表的索引
`define	OR1200_ICTAG		`OR1200_ICSIZE-`OR1200_ICLS	

//标识的宽度,包括物理地址的高19位、有效标志位V
`define	OR1200_ICTAG_W	20
`endif

Cache基本知识与OR1200中ICache简介,布布扣,bubuko.com

时间: 2024-12-24 00:21:41

Cache基本知识与OR1200中ICache简介的相关文章

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

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

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的使用情景分析

以下内容摘自<步步惊芯--软核处理器内部设计分析>一书 13.7DCache使用情景之一--存储指令执行阶段DCache失靶 存储指令执行阶段DCache失靶这种情景在通写法.回写法策略下有不同的执行过程,在通写法策略下直接写存储器中对应的地址,不操作DCache.在回写法策略下,首先判断目的地址对应的DCache中目录表的line是否被修改,如果是(Dirty为1),则将该line写回到内存,然后将目的地址所在的内存块读入DCache,填充到对应line,然后再修改DCache中对应目的地址

or1200中IMMU分析

以下内容摘自<步步惊芯--软核处理器内部设计分析>一书 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模块与其余模块的连接关系.ITLB结构. 1.1 I

Or1200中IMMU使用举例

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

Java开发知识之Java中的泛型

Java开发知识之Java中的泛型 一丶简介什么是泛型. 泛型就是指泛指任何数据类型. 就是把数据类型用泛型替代了. 这样是可以的. 二丶Java中的泛型 Java中,所有类的父类都是Object类.所以定义泛型的时候,设计长须的话传入的值与返回的值都是Object类型为主.如果是用具体的实例,就要进行转换了.具体参考向上转型,跟向下转型. JDK 1.5版本才有了泛型机制. 语法如下: class 类名<T >{ public T a; public T b; public void Set

C#语言基础知识(2):C#中多态

我的理解是:通过继承实现的不同对象调用相同的方法,表现出不同的行为,称之为多态. 1: OverRide 实现多态 1 public class Animal 2 { 3 public virtual void Eat() 4 { 5 Console.WriteLine("Animal eat"); 6 } 7 } 8 public class Dog : Animal 9 { 10 public override void Eat() 11 { 12 Console.WriteLin

or1200中IMMU分析(续)

以下内容摘自<步步惊芯--软核处理器内部设计分析>一书 2 IMMU中的特殊寄存器 OR1200处理器中的IMMU包含第2组特殊寄存器,如表10.1所示. ITLBW0MRx是指令TLB匹配寄存器,其格式如表10.2所示. 表10.2是OpenRISC 1000规范中的定义,实际在OR1200处理器中只实现了其中一部分字段,包括VPN(Virtual Page Number)的一部分.V(Valid标志位).ITLBW0MRx对应图10.7中MR_RAM的表项,每一个表项对应一个ITLBW0M

C#语言基础知识(1):C#中关于重载和重写

Overload:重载就是在同一个类中,方法名相同,参数列表不同.参数列表不同包括:参数的个数不同,参数类型不同. 1 using System; 2 using System.Collections.Generic; 3 using System.Text; 4 5 namespace OverLoading 6 { 7 class Program 8 { 9 public static int max(int i, int j) //静态方法 10 { 11 if (i > j) 12 re