Rocket-chip-Cache
關于cache的知識,大家可以看以下鏈接:
https://zhuanlan.zhihu.com/p/102293437?utm_source=qq
下面為驗證rocket-chip icache和dcache的代碼。
在這里我只驗證cache起到的作用,不會分析直接映射緩存、多路組相緩存和全相連緩存在rocket-chip上的差異,也不會分析具體的miss/hit情況,也不會分析其分配策略,如果后面有做相關測試,會再補充內容。
測試代碼如下:
#include "encoding.h" #include "L1Dcache.h"#define U32 *(volatile unsigned int *) #define DEBUG_SIG 0x70000000 #define DEBUG_VAL 0x70000004 #define DATA_SIZE 100int input1_data[DATA_SIZE] = {41, 833, 564, 187, 749, 350, 132, 949, 584, 805, 621, 6, 931, 890, 392, 694, 961, 110, 116, 296,426, 314, 659, 774, 319, 678, 875, 376, 474, 938, 539, 569, 203, 280, 759, 606, 511, 657, 195, 81,267, 229, 337, 944, 902, 241, 913, 826, 933, 985, 195, 960, 566, 350, 649, 657, 181, 111, 859, 65,288, 349, 141, 905, 886, 264, 576, 979, 761, 241, 478, 499, 403, 222, 444, 721, 676, 317, 224, 937,288, 119, 615, 606, 389, 351, 455, 278, 367, 358, 584, 62, 985, 403, 346, 517, 559, 908, 775, 255 };int input2_data[DATA_SIZE] = {454, 335, 1, 989, 365, 572, 64, 153, 216, 140, 210, 572, 339, 593, 898, 228, 12, 883, 750, 646,500, 436, 701, 812, 981, 150, 696, 564, 272, 258, 647, 509, 88, 703, 669, 375, 551, 936, 592, 569,952, 800, 584, 643, 368, 489, 328, 313, 592, 388, 543, 649, 979, 997, 814, 79, 208, 998, 629, 847,704, 997, 253, 715, 430, 415, 538, 700, 4, 494, 100, 864, 693, 416, 296, 285, 620, 78, 351, 540,646, 169, 527, 289, 796, 801, 720, 758, 745, 92, 989, 271, 853, 788, 531, 222, 461, 241, 358, 332};//-------------------------------------------------------------------------- // handle_trap functionvoid handle_trap() {asm volatile ("nop");while(1); }//-------------------------------------------------------------------------- // cache functionvoid cache( int n, int a[], int b[]) {int i;for ( i = 0; i < n; i++ )U32(0x80001000+4*i) = a[i] + b[i];for ( i = 0; i < n; i++ )U32(0x60001000+4*i) = U32(0x80001000+4*i);FLUSH_D_REG(0x80001000);FLUSH_D_ALL();for ( i = 0; i < n; i++ )U32(0x60001000+4*i) = U32(0x80001000+4*i); }//-------------------------------------------------------------------------- // clock gating functionvoid clock_gating() {U32(0x60000000) = read_csr(0x7C1);write_csr(0x7C1,read_csr(0x7C1) & 0xFFFFFFF0); }//-------------------------------------------------------------------------- // Mainvoid main() {cache(DATA_SIZE, input1_data, input2_data);clock_gating();//U32(DEBUG_SIG) = 0xFF;while(1) {asm volatile ("wfi");} }先看elf dump出來的反匯編文件。
第一個紅色箭頭:代碼運行的起始地址,開始的操作是將32個通用寄存器清零。
第二個紅色箭頭:main函數的開始位置,0x8000_0194,main函數后面(0x8000_01b4后面)就是數據段,也就是input1_data和input2_data的存儲地方。
第三個紅色箭頭:main函數的結束位置,0x8000_01b4,這里是一個死循環,再次跳轉至0x8000_01b0,執行wfi(等待中斷)的指令。
看反匯編文件的目的是確定運行代碼的長度,就是0x8000_0000-0x8000_01b4這么長。
然后是看icache仿真波形。
第一個藍色箭頭:是rocket-chip icache模塊往外求數據的總線接口。
第二個藍色箭頭:是分割線,左邊是icache有請求數據的動作,右邊是沒有再往外請求數據。
紅色箭頭:rocket-chip core向icache請求指令數據的總線接口。
黃色箭頭:icache miss的信號。
白色箭頭:icache hit的信號。
綠色箭頭:哪條cache line存在于icache中的標志。
rocket-chip指令請求的順序(存在icache的情況):
1)core向icache請求執行指令數據。
2)icache若存在請求的執行指令,則返回給core;若不存在,則往外部memory請求指令。
3)若指令不存在于icache,icache會產生miss信號,若存在則會產生hit信號。
4)外部返回的指令數據會存入icache中,并修改vb_array相應的bit。
5)然后icache將剛存入的指令數據傳給core,這次不再產生miss信號,而是產生hit信號。
6)完成一次core指令數據的請求,跳至步驟1)再次等待core請求數據。
7)如果運行期間,cpu執行了icache flush操作,那么之前存入icache的指令數據都會被刷掉,core想再次請求的話,icache需要再次往外請求數據。
接下來看dcache的仿真波形。
紅色箭頭:memory數據的總線接口,只有ar和r這兩組接口,memory只關心讀的情況,不關心寫的情況。
藍色箭頭:mmio數據的總線接口,只有aw和w這兩組接口,mmio只關心寫的情況,不關心讀的情況。
第一個黃色箭頭:左邊是將數據從memory中讀入dcache中,右邊是將數據輸出到mmio端口上。
第二個黃色箭頭:左邊是將數據輸出到mmio端口上,右邊存在一個操作沒有在波形上體現出來,那就是將dcache中的數據全部flush掉。
for ( i = 0; i < n; i++ )U32(0x60001000+4*i) = U32(0x80001000+4*i);FLUSH_D_ALL();第三個黃色箭頭:左邊是將dcache中的全部數據flush掉,右邊是在dcache中沒有預存數據的情況下,將memory的數據搬到mmio端口上。
FLUSH_D_ALL();for ( i = 0; i < n; i++ )U32(0x60001000+4*i) = U32(0x80001000+4*i);第三個黃金箭頭可以看到,每次從memory端口中讀取一次數據,然后分多次寫到mmio端口上,這是因為memory是以一條cache line的長度來讀寫數據的,而mmio則是以單word的長度來讀寫數據的,所以配置寄存器的行為必須是采用mmio的總線端口,而不能采用memory總線端口。
下圖是第一個黃色箭頭右邊的一小段波形。可以看到往0x6000_1000位置輸出數據的時候,是不需要利用memory端口請求數據的。
下圖是第三個黃色箭頭右邊的一小段波形。可以看到藍色箭頭是往0x6000_1000位置輸出數據的時候,在輸出數據前需要在更早的時間使用memory端口向內存請求0x8000_1000的相關數據。同時可以看到,memory端口讀寫數據是以一條cache line為單位的,而mmio端口讀寫數據是以一個word為單位的。
總結
以上是生活随笔為你收集整理的Rocket-chip-Cache的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: PASCAL VOC2012数据集介绍
- 下一篇: webstorm使用指南