-
流水线和data byp
现在的问题是cache miss的时候,每2个cycle取指一次。 以前cpu6都是一个cycle一条指令,所以在做data forwarding的时候没想那么多。 因为读寄存器是在_d,所以_e要把alu的数据前递给_d。而_m时lsu要把load的数据给_d。 而如果时2个cycle fetch一个指令,拿alu来说,在_e时,下一条指令还没有到_d,也就是还没有读寄存器,所以没法前递。 需要到_m时,下一条指令才到_d。 _d _e(alu) _m(lsu) ^_______| | ^_________________| 比如下面这个例子,在2 cycle fetch一条指令的时候,func_uty1_ld。 obj/main.elf: file format elf32-loongarch obj/main.elf Disassembly of section .text: 1c000000 <_start>: kernel_entry(): 1c000000: 14380006 lu12i.w $r6,114688(0x1c000) 1c000004: 028030c6 addi.w $r6,$r6,12(0xc) 1c000008: 288000c5 ld.w $r5,$r6,0 Disassembly of section .data: 1c00000c <var1>: var1(): 1c00000c: 0000005a...
-
chiplab的cache
为了解决取值和读数据都要5个cycle的问题,要先把chiplab的cache看懂些。 myCPU/cache.vh // way `define I_WAY_NUM4 `ifdef I_WAY_NUM4 `define I_WAY_LEN 2 `endif `define I_WAY_NUM (1 << `I_WAY_LEN) `define I_WAY_BITS `I_WAY_LEN - 1 : 0 ... // WAY //`define D_WAY_NUM1 //`define D_WAY_NUM2 `define D_WAY_NUM4 `ifdef D_WAY_NUM1 `define D_WAY_LEN 0 `endif `ifdef D_WAY_NUM2 `define D_WAY_LEN 1 `endif `ifdef D_WAY_NUM4 `define D_WAY_LEN 2...
-
chiplab里的icache dcache和cache interface
lsoc1000_mainpipe里的inst_和data_这两个inteface分别和mycpu_top外面的icache dcache通信。 同时icache dcache模块还有接口和core_top里的ram_wrapper通信。 ram_wrapper是cache的实现。 icache和dcache还和cache_interface通信,cache_interface通过AXI协议与core_top外面的axi slave通信获取内存中的数据。 这里内存即可以是通过memory controller取得的ddr内存的数据,也可以是chiplab里用的sram。 core_top外面是soc_top,在chip/soc_demo/sim/soc_top.v里。 这里面的东西在以前的blog里写过了。 soc_top soc_top +—————————————————————————————————————————————————————————————————————————————————————-+ | core_top | | | | | | +————————————————————————————————————————————————————————–+ | | | mycpu_top | | | | | | | | | | | | +——————————————–+ | | | | | icache | | | |...