cache控制器设计
姓名:xx | 学号:xxx | 班级:计xxx班 |
---|---|---|
实验名称:cache控制器设计 | 实验性质:验证性的实验 | 时间:11/27 |
一、实验目的
-
认识和掌握Cache控制器的原理及其设计方法;
-
掌握Cache控制器的实现方法,代码实现方法。
二、实验原理与内容
本实验采用的地址变换是直接相联映象方式,这种变换方式简单而直接,硬件实现很简单,访问速度也比较快,但是块的冲突率比较高。其主要原则是:主存中一块只能映象到Cache的一个特定的块中。
假设主存的块号为B,Cache的块号为b,则它们之间的映象关系可以表示为:
b = B mod Cb
其中,Cb是Cache的块容量。设主存的块容量为Mb,区容量为Me,则直接映象方法的关系如图1所示。把主存按Cache的大小分成区,一般主存容量为Cache容量的整数倍,主存每一个分区内的块数与Cache的总块数相等。直接映象方式只能把主存各个区中相对块号相同的那些块映象到Cache中同一块号的那个特定块中。例如,主存的块0只能映象到Cache的块0中,主存的块1只能映象到Cache的块1中,同样,主存区1中的块Cb(在区1中的相对块号是0),也只能映象到Cache的块0中,看图1。根据上面给出的地址映象规则,整个Cache地址与主存地址的低位部分是完全相同的。
直接映象方式的地址变换过程如图2 所示,主存地址分为三个部分:区号E、块号B和块内地址W;Cache地址分为两部分:块号b和块内地址w。主存地址中的块号B与Cache地址中的块号b是完全相同的。同样,主存地址中的块内地址W与Cache地址中的块内地址w也是完全相同的,主存地址比Cache地址长出来的部分称为区号E。
在程序执行过程中,当要访问Cache时,为了实现主存块号到Cache块号的变换,需要有一个存放主存区号的小容量存储器(称为区表存储器),这个存储器的容量与Cache的块数相等,字长为主存地址中区号E的长度,另外再加一个有效位。
从主存地址到Cache地址的变换过程中,首先用主存地址中的块号B去访问区表存储器(用块号B作为区表存储器的地址,访问它),然后,将读出来的区号与主存地址中的区号E进行比较,比较结果相等,有效位为1,则Cache命中,表示要访问的那一块已经装入到Cache中了,可以直接用块号及块内地址组成的缓冲地址到缓存Cache中取数,把读出来的数据送往CPU;如果比较结果不相等,有效位为1,可以进行替换,如果有效位为0,可以直接调入所需块。至于比较不相等情况,不论有效位是1或0均为Cache没有命中,或称为Cache失效,表示要访问的那个块还没有装入到Cache中,这时,要用主存地址去访问主存储器,先把该地址所在的块读到Cache中,然后CPU再从Cache中读取该地址中的数据。Cache和CPU以及存储器的关系如下图所示。
如图3所示,32位主存地址为AB31..AB0(地址总线),RD(为0,读)为Cache的读信号,CMWr(为1,写)为Cache和主存的写信号,MRd(为0,读)为主存的读信号,D31..D0为CPU与Cache的数据传送线,MD31..MD0为存储器RAM与Cache的数据传送线。
如图4所示,区号E取14位,块号B为14位,块内地址为4位,这样Cache地址就是18位了,其中Cache块号b为14位,块内地址w为4位,所以Cache容量为256KB(2^18)个单元,块号b取14位,那么Cache分为16KB(2^14)块,块内地址w取4位,则每块为16个单元(每个单元一个字节)。
实现Cache的存储体的方法是先实现一个8位的存储单元,然后用这个8位的存储单元来构成一个256Kb X 8位的Cache(地址18位)。
再实现一个15位(14+1)的存储单元,然后,用这个15位的存储单元来构成一个16k X 15位的区表存储器(地址14位与块号B相同),用来存放区号(14位)和有效位(1位)。在这个部分中,还要实现一个区号E比较器,也就是如果主存地址的区号E和区表存储器中按块号B取出的相应单元中的区号E相等,有效位标志为M,且有效位为1,M=1时,则Cache命中,否则Cache失效,M=0时表示Cache失效。
当Cache命中时,就将Cache存储体中相应单元的数据送往CPU,这个过程比较简单。当Cache失效时,就将主存中相应块中的数据读出写入Cache中,这样Cache控制器就要产生主存储器的读信号MRd(为0,读),由于每个Cache块占十六个单元,按32 位(4个字节)为访问存储器单位,那么需要连续访问4次主存,读取存储器中该块的数据,即16个字节,然后写入Cache相应块中,最后再修改区表存储器(标志位M=1)。至于访问主存的方法,要用到计数器。写数据时,如果Cache中有该地址数据,则修改,同时,修改存储器该地址内容(CMWr为1,写,为主存的写信号);如果Cache中无该地址数据,就直接修改存储器该地址单元内容,这时无需修改Cache。读/写存储器时,要注意互锁情况。
三、实验过程
1)首先实现cache模块,cache模块中有一个区表寄存器,存储的是区号以及一个有效位,利用cpu地址中块号地址作为索引搜索区号,与cpu地址中的区号作比较,同时记录其中有效位的值;模块中另外有一个缓存器,存的是相应块的数据,每一个块为16个字节,即4个32位的数据。情况一:cpu发出读指令,cache中查找区表寄存器并比较区号以及获取有效位,区号相等并且有效位为1,直接从缓存器中读取相应块以及块内地址所存储的值,传回到cpu中。情况二:cpu发出读指令,cache中查找区表寄存器并比较区号,区号不相等或者有效位为0,意味着缓存器中并没有存储相应的数据,因此需要读存储器RAM,此处做法为,先从RAM中读取相应的块的数据(4个32位数据)即要读取4次,我在这里利用了一个times作为计数器,传到RAM中读取数据,即RAM和Cache中各自多了一个接口,读取到的相应块的数据存储到缓存器中,改变缓存器和区表寄存器相应值,然后再将数据从缓存器中读取数据到cpu。情况三:cpu发出写指令,cache中查找区表寄存器并比较区号以及获取有效位,区号不相等或者有效位不相等,只需要直接将数据传到RAM中,进行写存储器工作。情况四:cpu发出写指令,cache中查找区表寄存器并比较区号,区号相等并且有效位为1,先改变相对应的地址的缓存器的值,然后将数据传到RAM中,进行写存储器工作。
(2)接下来实现的是RAM模块,RAM模块需要一个存储器,在addr来临以及在上述times来时分别进行写操作和读操作。
(3)用一个顶层模块将Cache和RAM连接在一起。
(4)用一个测试文件,调用顶层模块进行数据测试。
仿真图:
实验箱:
四、实验总结
(1)通过更改指令,能够使其执行一-次运行后停机,并且观察到来程序的执行过程和结果。掌握了简单CPU的组成原理,并在此基础上构造出了简单的模型计算机,并且能够运行成功。
(2)利用QuartusII软件完成了Cache控制器的设计,编译仿真通过,下载到了实验现象,进而掌握了Cache控制器的基本原理及其设计方法。
五、实验体会及改进建议
此次实验比上次的实验连线更加复杂,在经历过上次连线失败后,我吸取了教训,并且在此次实验中–次就把线连接成功。在Cache控制器的实验过程,我一直对实验原理不够理解,但是老师通过结合实验箱运行过程的讲解,帮我解决了我的疑问。