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     output  [`PABITS-1:0]      dtlb_paddr,                                                                                          
 52     output              dtlb_finish,                                                                                                
 53     output              dtlb_hit,                                                                                                   
 54     input               data_tlb_req,                                                                                               
 55     input               data_tlb_wr   ,                                                                                             
 56     input   [`GRLEN-1:0]data_tlb_vaddr,                                                                                             
 57     input               dtlb_cache_recv,                                                                                            
 58     input               dtlb_no_trans  ,                                                                                            
 59     input               dtlb_p_pgcl    ,                                                                                            
 60     output              dtlb_uncache,                                                                                               
 61     output  [ 5:0]      dtlb_exccode,

icache只要把itlb_finish和itlb_hit设1,itlb_uncache设0,assign dtlb_paddr = data_tlb_vaddr;就行。

而dcache是必须在data_tlb_req发出的下一个cycle返回dtlb_paddr和dtlb_finish设1。dtlb_hit可以一直为1,dtlb_uncache一直为0。

主要是代码里具体的实现,不过不想深究这里的tlb了,所以搞了简单的方法把tlbwrapper tlb模块都去掉,还有csr模块,和tlb有关联,之前也没删。

下面这段代码满足应答就能让cache凑合着工作。

 277 //   assign itlb_finish  = 1'b1;                                                                                                   
 278    dff_s #(1) itlb_finish_reg (                                                                                                    
 279       .din (inst_tlb_req),                                                                                                         
 280       .clk (clk),                                                                                                                  
 281       .q   (itlb_finish),                                                                                                          
 282       .se(), .si(), .so());                                                                                                        
 283    assign itlb_hit     = 1'b1;                                                                                                     
 284    assign itlb_uncache = 1'b0;                                                                                                     
 285 //   assign itlb_paddr   = inst_tlb_vaddr[`PABITS-1:0];                                                                            
 286    dff_s #(`PABITS) itlb_paddr_reg (                                                                                               
 287       .din (inst_tlb_vaddr[`PABITS-1:0]),                                                                                          
 288       .clk (clk),                                                                                                                  
 289       .q   (itlb_paddr),                                                                                                           
 290       .se(), .si(), .so());                                                                                                        
 291                                                                                                                                    
 292                                                                                                                                    
 293    dff_s #(1) dtlb_finish_reg (                                                                                                    
 294       .din (data_tlb_req),                                                                                                         
 295       .clk (clk),                                                                                                                  
 296       .q   (dtlb_finish),                                                                                                          
 297       .se(), .si(), .so());                                                                                                        
 298 //   assign dtlb_finish  = 1'b1;                                                                                                   
 299    assign dtlb_hit     = 1'b1;                                                                                                     
 300    assign dtlb_uncache = 1'b0;                                                                                                     
 301    dff_s #(`PABITS) dtlb_paddr_reg (                                                                                               
 302       .din (data_tlb_vaddr[`PABITS-1:0]),                                                                                          
 303       .clk (clk),                                                                                                                  
 304       .q   (dtlb_paddr),                                                                                                           
 305       .se(), .si(), .so());                                                                                                        
 306    //assign dtlb_paddr   = data_tlb_vaddr[`PABITS-1:0];

其它还有几个cache相关的信号,看了下一直都是0,也没管。

 35     output              tlb_req         ,                                                                                           
 36     output              cache_req       ,                                                                                           
 37     output  [4 :0]      cache_op        ,                                                                                           
 38     output [`D_TAG_LEN-1:0] cache_op_tag,                                                                                           
 39     input               cache_op_recv   ,                                                                                           
 40     input               cache_op_finish ,