u@home:~$

  • chiplab里cache向tlb模块查询物理地址的信号

    cache模块向tlbwrapper模块发请求,给出vaddr,要求得到paddr。 因为现在只有machine mode,没有虚实地址转换,所以直接把vaddr返回来作为paddr就行。 icache发的请求就是这3个信号。 23 input inst_tlb_req , 24 input [`GRLEN-1:0] inst_tlb_vaddr, 25 input inst_tlb_cacop, inst_tlb_cacop还没搞清楚是啥,也没管。 需要返回的信号是这几个output。 42 // tlb-cache interface 43 output [`PABITS-1:0] itlb_paddr, 44 output itlb_finish, 45 output itlb_hit, 46 input itlb_cache_recv, 47 output itlb_uncache, 48 output [ 5:0] itlb_exccode, chiplab里的tlb似乎是需要2个cycle完成应答。 第一个cycle发出inst_tlb_req inst_tlb_vaddr,后一个cycle里给出itlb_paddr itlb_finish itlb_hit itlb_uncache。 dcache也是差不多的接口。 51...

  • 流水线和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...