p5 CACHE logisim 总结

前言

参考了指导书和各位大佬的博客搭完了Cache,然后莫名其妙的AC了。由于惊喜来的太突然,我甚至没搞懂Cache它就A了。还是总结一下顺便理清一下思路。如果明年软院没有再改革的话,也算留点东西叭嘿嘿嘿。 

模块

group_blcok

TAG:6位组内块地址

V:脏位,就是这个Block有没有被用过,被用过以后就是一直置1 一开始默认为0

DATA:每个Block里面都会存放4个32位的数据

这些都用寄存器存储,这里的EN_block是写使能信号

当block要更新的时候,EN_block=1

EN_block=0时,group_block只读它寄存的数据。

LRU

计算Cache的Group里是哪个BLock要更新。

前提:1)这个Group现在处于被选中的状态!如果没有被选中,这个group不做任何修改

           2)STOP=0!暂停了以后LRU也不更新。整个CACHE属于暂停运转的时候

更新原则

1)命中 且 写入

        HIT_BLOCK=1&Memwrite=1

        RAM里这个TAG地址对应存储的值被修改了,Cache里也应该进行相应的更新。

2)不命中 且 不写入

        HIT_BLOCK=0&Memwrite=0

        不写入可以看作是读取,读取的数没有在Cache里面,那么就要把这个数存到这个Group的某个Block里面。

        选这个被放入的Block的原则:count数最大的Block,即距离上一次用到它的时间最久的Block.如有两个或以上的相等的最大的count存在的情况,那么就取block标号最小的那个。

产生的信号:

                        EN_BLOCK 是Block的写使能信号,即该Block的值会发生修改。

COUNTER

        我们规定,只有在读取数据时才算作一次真正的访问,所以在写入时,不管有没有更新数据,都不算做一次访问

前提:

STOP=0&Memwrite=0&Enable_GROUP=1 (必须是选中这个组 才可以进行计数,要不然就是不访问)

归零:

命中当前块:当前块在这个周期被读取了

                      HIT_BLOCK=1

没有命中,但更新了当前块:这个块内值被替换了所以counter也要被清零

                                                HIT_BLOCK=0&EN_BLOCK=1

                                                EN_BLOCK指的是块的写使能,即该block要被写入

counter+1:

没用到这块数据&这个数据块不更新:HIT_BLOCK=0&EN_BLOCK=0

MuxForBlock

用多选器,选择四个中被选中的Block内的数据输出。

如何知晓被选中:产生的四个HIT_BLOCK的信号判断。

Cache_Group

HIT_BLOCK的信号产生:BLOCK_TAG==TAG_IN(读入的地址中的tag)&&V==1(这个BLOCK里已经有数据了)&&ENABLE_Group==1(这个组被选中了才行)

输出的Group_HIT信号:这个HIT信号指的是这个被选取的GROUP里面的块内值有没有命中的。 

记得要(HIT_BLOCK1||HIT_BLOCK2||HIT_BLOCK3||HIT_BLOCK4)&&ENABLE_Group==1

MuxForGroup

按照指导书老老实实写就行

p5 CACHE logisim 总结

一个比较难处理的点:怎么解决输出五个周期的0,再在第六个周期输出正确结果?

这模拟的就是从RAM里读取数据,前5个周期STOP==1我们先判断stop=1的时候就直接输出0

当stop=0的时候,如果命中且读取,就输出对应命中的Group里的数据输出,若未命中且读取,即从RAM里拿出数据,则就是输出RAM里读出的数据。其余情况输出0

Cache

ADD地址分解:

p5 CACHE logisim 总结

MuxGroup:选择命中的组是哪一组。

MuxBLock:选择块内地址的哪一个字

用MuxGroup产生ENABLE_Group信号:

p5 CACHE logisim 总结

HIT(是否命中):主要是为了判断读取时是从Cache里读取(HIT==1)还是RAM里读取(HIT==0)

HIT=GROUP_HIT1||GROUP_HIT2||GROUP_HIT3||GROUP_HIT4

RAM:产生STOP信号

MuxForGroup里选出的四个数据 还要再用MuxBlock 选择是这四个数据的哪一个。

ReadTimes&HitTimes 可以拿来计算命中率和缺失率。直接参考的某大佬的:

p5 CACHE logisim 总结

总结

自下而上的搭完以后,重新理解了一下Cache 实际上是自上而下理解它的。

先进行取址:

产生TAG、MuxGroup 、MuxBlock的三个信号。

产生了Enable_Group的信号。选中四个组中的一个组。

然后在被选中的Cache_Group里由Memwrite,Memread,Tag的信号判断 属于四种情况的哪一种

命中且读取

COUNTER值更新0;

MuxForBlock选出对应的块,输出该块数据(4条data);

LRU不更新数据;

用MuxBlock 将该块四条数据中选择对应的那个字。

命中且写入

COUNTER值保持不变;

LRU对应的值BLOCK使能变1(Block更新了);

Group_Block的值发生修改,存储的数据变化;

MuxForGroup输出0(因为不是读);

不命中且写入:

COUNTER值保持不变;

LRU中写使能全为0;

Group_Block的值不变;

MuxForGroup输出0(因为不是读);

RAM里对应地址值发生变化。

不命中且读取:

STOP=1

暂停五个周期

在第六个周期时:

LRU中计算出Cache对应的要替换的Block;

Group_Block的值发生修改,TAG和DATA都修改(将RAM读出的数据存储进对应的Group_Block);

COUNTER值更新0;

MuxForGroup输出RAM中读出的四条数据;

用MuxBlock 将该块四条数据中选择对应的那个字。

还不知道上机到底怎么考,希望能够过叭。

参考

以下大佬博客:

Cache在干嘛_Harbour_的博客-CSDN博客

P5 踩坑总结…_u012928469的博客-CSDN博客

P5 Cache - PYuYi - 博客园

上一篇:126. 单词接龙 II(bfs)


下一篇:Unity:Ray 射线