• L
    l1tlb: tlb's req port can be configured to be block or non-blocked (#1656) · f1fe8698
    Lemover 提交于
    each tlb's port can be configured to be block or non-blocked.
    For blocked port, there will be a req miss slot stored in tlb, but belong to
    core pipeline, which means only core pipeline flush will invalid them.
    
    For another, itlb also use PTW Filter but with only 4 entries.
    Last, keep svinval extension as usual, still work.
    
    
    * tlb: add blocked-tlb support, miss frontend changes
    
    * tlb: remove tlb's sameCycle support, result will return at next cycle
    
    * tlb: remove param ShouldBlock, move block method into TLB module
    
    * tlb: fix handle_block's miss_req logic
    
    * mmu.filter: change filter's req.ready to canEnqueue
    
    when filter can't let all the req enqueue, set the req.ready to false.
    canEnqueue after filtering has long latency, so we use **_fake
    without filtering, but the filter will still receive the reqs if
    it can(after filtering).
    
    * mmu.tlb: change name from BTlbPtwIO to VectorTlbPtwIO
    
    * mmu: replace itlb's repeater to filter&repeaternb
    
    * mmu.tlb: add TlbStorageWrapper to make TLB cleaner
    
    more: BlockTlbRequestorIO is same with TlbRequestorIO, rm it
    
    * mmu.tlb: rm unused param in function r_req_apply, fix syntax bug
    
    * [WIP]icache: itlb usage from non-blocked to blocked
    
    * mmu.tlb: change parameter NBWidth to Seq of boolean
    
    * icache.mainpipe: fix itlb's resp.ready, not always true
    
    * mmu.tlb: add kill sigal to blocked req that needs sync but fail
    
    in frontend, icache,itlb,next pipe may not able to sync.
    blocked tlb will store miss req ang blocks req, which makes itlb
    couldn't work. So add kill logic to let itlb not to store reqs.
    
    One more thing: fix icache's blocked tlb handling logic
    
    * icache.mainpipe: fix tlb's ready_recv logic
    
    icache mainpipe has two ports, but these two ports may not valid
    all the same time. So add new signals tlb_need_recv to record whether
    stage s1 should wait for the tlb.
    
    * tlb: when flush, just set resp.valid and pf, pf for don't use it
    
    * tlb: flush should concern satp.changed(for blocked io now)
    
    * mmu.tlb: add new flush that doesn't flush reqs
    
    Sfence.vma will flush inflight reqs and flushPipe
    But some other sfence(svinval...) will not. So add new flush to
    distinguish these two kinds of sfence signal
    
    morw: forget to assign resp result when ptw back, fix it
    
    * mmu.tlb: beautify miss_req_v and miss_v relative logic
    
    * mmu.tlb: fix bug, when ptw back and bypass, concern level to genPPN
    
    bug: when ptw back and bypass, forgot to concern level(1GB/2MB/4KB)
    when genPPN.
    
    by the way: some funtions need ": Unit = ", add it.
    
    * mmu.filter: fix bug of canEnqueue, mixed with tlb_req and tlb.req
    
    * icache.mainpipe: fix bug of tlbExcp's usage, & with tlb_need_back
    
    Icache's mainpipe has two ports, but may only port 0 is valid.
    When a port is invalid, the tlbexcp should be false.(Actually, should
    be ignored).
    So & tlb_need_back to fix this bug.
    
    * sfence: instr in svinval ext will also flush pipe
    
    A difficult problem to handle:
    Sfence and Svinval will flush MMU, but only Sfence(some svinval)
      will flush pipe. For itlb that some requestors are blocked and
      icache doesn't recv flush for simplicity, itlb's blocked ptw req
      should not be flushed.
    It's a huge problem for MMU to handle for good or bad solutions. But
      svinval is seldom used, so disable it's effiency.
    
    * mmu: add parameter to control mmu's sfence delay latency
    
    Difficult problem:
      itlb's blocked req should not be abandoned, but sfence will flush
      all infight reqs. when itlb and itlb repeater's delay is not same(itlb
      is flushed, two cycles later, itlb repeater is flushed, then itlb's
      ptw req after flushing will be also flushed sliently.
    So add one parameter to control the flush delay to be the same.
    
    * mmu.tlb: fix bug of csr.priv's delay & sfence valid when req fire
    
    1. csr.priv's delay
    csr.priv should not be delayed, csr.satp should be delayed.
    for excep/intr will change csr.priv, which will be changed at one
    instruction's (commit?). but csrrw satp will not, so satp has more
    cycles to delay.
    2. sfence
    when sfence valid but blocked req fire, resp should still fire.
    3. satp in TlbCsrBundle
    let high bits of satp.ppn to be 0.U
    
    * tlb&icache.mainpipe: rm commented codes
    
    * mmu: move method genPPN to entry bundle
    
    * l1tlb: divide l1tlb flush into flush_mmu and flush_pipe
    
    Problem:
    For l1tlb, there are blocked and non-blocked req ports.
    For blocked ports, there are req slots to store missed reqs.
    Some mmu flush like Sfence should not flush miss slots for outside
    may still need get tlb resp, no matter wrong and correct resp.
    For example. sfence will flush mmu and flush pipe, but won't flush
    reqs inside icache, which waiting for tlb resp.
    For example, svinval instr will flush mmu, but not flush pipe. so
    tlb should return correct resp, althrough the ptw req is flushed
    when tlb miss.
    
    Solution:
    divide l1tlb flush into flush_mmu and flush_pipe.
    The req slot is considered to be a part of core pipeline and should
    only be flushed by flush_pipe.
    flush_mmu will flush mmu entries and inflight ptw reqs.
    When miss but sfence flushed its ptw req, re-send.
    
    * l1tlb: code clean, correct comments and rm unused codes
    
    * l2tlb: divide filterSize into ifiterSize and dfilterSize
    
    * l2tlb: prefetch req won't enter miss queue. Rename MSHR to missqueue
    
    * l1tlb: when disable vm, ptw back should not bypass tlb and should let miss req go ahead
    f1fe8698
Parameters.scala 15.4 KB