今年,参与了实验室某个项目中的一项工作:L1 DCache 扩容的验证。下面来对我本次工作做一个简要总结。
处理器结构框架
Geode GX 处理器是AMD针对低功耗应用所设计的x86处理器。如下图所示,Geode GX处理器可以分为以下几个主要功能模块:
- CPU Core
- GeodeLink Control Processor(GLCP)
- GeodeLink Interface Units(GLIU0,GLIU1)
- GeodeLink Memory Controller(GLMC)
- Graphics Processor(GP)
- Display Controller(DC)
- Video Processor(VP)—TFT Contrller
- GeodeLink PCI Bridge(GLPCI)
- Geode I/O Companion Device Interface(GIO)
Dcache扩容方案
AMD Geode 的L1 Dcache采用4-路组相联结构,容量为32KB。现在的设计目标是对该Dcache进行扩容到64KB。
cache结构主要有三种:直接映射、组相联、全相联。通常L1 cache为了提高命中时间都采用直接映射的方式,L2 cache为了减小失效率一般采用多路组相联的方式。但是这里AMD Geode 的L1 Dcache使用的2路组相联。
对L1 Dcache进行扩容,最有效的方式就是对cache进行扩路:从4-路组向量扩展成8-路组相联。如下图所示是4-路组相联的cache结构。
那么8-路组相联则就增加了一倍的容量,而且只需要修改相应的比较器,多路选择器等结构,无需拓宽index域。
验证
设计相对比较容易,但是如何进行验证呢?我们以一种白盒的方式进行验证,通过读取cache工作过程会影响到的寄存器的值来进行验证。那么,应该以什么样的方式读取这些寄存器呢?
首先,介绍一下Geode的内部寄存器组。Geode GX 处理器结构中包含了两个接口单元(GLIU)。除了一些为了兼容x86体系而存在的寄存器,所有的内部寄存器都是通过Model Specific Register(MSR)set来访问。MSR拥有32位的地址空间和64位的数据空间。即操作数必须是64位。
MSR可以通过“RDMSR”指令来进行读取。在读取过程中,由ECX寄存器指定访问的寄存器地址,数据被读取到EDX:EAX寄存器中,高32位存放在EDX,低32位存放在EAX。写操作同样如此,将高32位和低32位地址先存放在EDX:EAX寄存器中,然后将目标寄存器的地址存入ECX,最后使用“WRMSR”指令来进行写操作。RDMSR和WRMSR指令是两条特权指令。
上述对MSR寄存器组的基本功能进行了基本的介绍,也就了解了读写寄存器方式。下面就具体说明验证扩容的L1 Dcache的方法,分别从Cache使能写读请求的正确性、替换算法的正确性、使能部分路时的正确性。
验证空间说明
针对L1 Dcache扩容的汇编定向,验证主要保证基本读写访存的功能、替换算法、按需lockdown部分路等与路数相关的功能正确性,其验证空间组合列表如下:
cache使能请求的正确性
读请求的正确性
功能点:命中测试方法:
1、执行invalid entire-L1-Cache,使能L1-Cache
2、读入a0至a7地址的数据,分别对应同一个Set的8路
3、关闭L1-Cache
4、改变内存中a0至a7地址的数据
5、重新使能L1-Cache
6、读a0至a7的数据,此时发生命中,核对数据是否正确,如果与第4步中写入的数据相同则出错
功能点:简单失效
测试方法:
1、执行invalid entire-L1-Cache,使能L1-Cache
2、读入a0至a7地址的数据
3、检查L1 Cache中a0-a7地址的数据是否正确
4、关闭L1 Cache
5、改变内存中a0-a7地址的数据
6、重新使能L1-Cache
7、读b0-b7地址的数据,此时发生简单读失效
8、管理L1-Cache验证是否发生了回写,即核对内存中a地址的数据是否改变,如果为第5步写入的数据则出错
功能点:复杂失效
测试方法:
1、执行invalid entire L1-Cache操作,使能L1-Cache
2、向a0-a7地址写入数据A
3、关闭L1 Cache
4、改变内存中 a0-a7地址的数据
5、重新使能L1-Cache
6、读b0-b7地址的数据,此时发生复杂读失效,检查读回的数据是否正确
7、关闭L1-Cache,读内存中地址a0-a7验证是否发生了回写,即核对内存中a地址的数据是否改变,如果数据为第二步写入Cache的数据则功能正确
写请求的正确性
功能点:命中测试方法:
1、执行invalid entire L1-Cache,使能L1-Cache
2、读入a0至a7地址的数据,分别对应同一个Set的8路
3、关闭L1-Cache
4、改变内存中a0至a7地址的数据
5、重新使能L1-Cache
6、向地址a0至a7写入数据A,此时发生写命中
7、读a0至a7地址的数据,此时发生Cache命中,核对数据是否正确,如果与第4步中写入的数据相同则出错
功能点:简单失效
测试方法:
1、执行invalid entire L1-Cache,使能L1-Cache
2、读入a0至a7地址的数据,分别对应同一个Set的8路
3、关闭L1-Cache
4、改变内存中a0至a7地址的数据
5、重新使能L1-Cache
6、向地址b0至b7写入数据A,此时发生写简单失效
7、关闭L1-Cache
8、改变内存中b0至b7地址的数据
9、读a0至a7地址的数据验证是否发生了回写,如果与第4步中写入的数据不同则出错
10、重新使能L1-Cache,读b0-b7数据,检查第6步是否将数据写入Cache,如果数据与第8步写入的相同则出错
功能点:复杂失效
测试方法:
1、执行invalid entire L1-Cache,使能L1-Cache
2、向a0至a7地址写入数据A,分别对应同一个Set的8路
3、关闭L1-Cache
4、改变内存中a0至a7地址的数据
5、重新使能L1-Cache
6、向地址b0至b7写入数据B,此时发生写简单失效
7、关闭L1-Cache
8、改变内存中b0至b7地址的数据
9、读a0至a7地址的数据验证是否发生了回写,如果与第4步中写入的数据相同则出错,如果与第2步相同则正确
10、重新使能L1-Cache,读b0-b7数据,检查第6步是否将数据写入Cache,如果数据与第8步写入的相同则出错
替换算法正确性
AMD Geode GX L1cache的替换算法并不是LRU或者FIFO算法,它使用的是伪LRU算法,这是一种二叉树形式的替换算法如下图所示:图中,a0-a7表示way0-way7,b表示Data Cache Read/Write Tag Register中bit4-bit10。从根节点开始选择一条通往叶子节点的路径,即代表选择某一个way。默认节点b的值全部为0,当选择向左时,该节点的值为1,当选择向右时,该节点的值为0。这样,每次选择某个wan时,就会生成一串7位的数据。该数据存在下图所示的bit4-bit10中(下图是扩容前的寄存器示意图)。
功能点:替换way X
测试方法:
1、执行invalid entire L1-Cache操作,使能L1-Cache
2、依次向a0至a7地址写入数据A,通过写请求将Cache的8路数据顺序填满
3、按某种次序一次访问不同的way,即a
4、关闭L1 Cache
5、改变内存中a0-a7地址的数据
6、重新使能L1-Cache
7、读b0地址的数据,此时aX发生回写
8、关闭L1-Cache,读内存中地址aX,验证是否发生了回写,即核对内存中a地址的数据是否改变,如果数据为第二步写入Cache的数据则功能正确
使能部分路时的正确性
功能点:使能2路
测试方法:
1、执行invalid entire L1-Cache操作,使能L1-Cache
2、关闭way0-way5,此时只有way6、way7使能
3、依次向a0至a1地址写入数据A,通过写请求将Cache的2路数据顺序填满,此时替换行为a0
4、关闭L1 Cache
5、改变内存中a0-a1地址的数据
6、重新使能L1-Cache
7、读b0地址的数据,此时a0发生回写
8、关闭L1-Cache,读内存中地址a0,验证是否发生了回写,即核对内存中a地址的数据是否改变,如果数据为第二步写入Cache的数据则功能正确
其他功能点略