OpenCores
URL https://opencores.org/ocsvn/riscv_vhdl/riscv_vhdl/trunk

Subversion Repositories riscv_vhdl

[/] [riscv_vhdl/] [trunk/] [rtl/] [patches/] [sub.diff] - Rev 5

Compare with Previous | Blame | View Log

Entering 'chisel'
Entering 'context-dependent-environments'
Entering 'dramsim2'
Entering 'fpga-zynq'
Entering 'groundtest'
Entering 'hardfloat'
Entering 'junctions'
Entering 'riscv-tools'
Entering 'riscv-tools/riscv-tests'
Entering 'riscv-tools/riscv-tests/env'
Entering 'rocket'
diff --git a/src/main/scala/csr.scala b/src/main/scala/csr.scala
index 62f81ff..ae649b0 100644
--- a/src/main/scala/csr.scala
+++ b/src/main/scala/csr.scala
@@ -155,9 +155,9 @@ class CSRFile(implicit p: Parameters) extends CoreModule()(p)
   val system_insn = io.rw.cmd === CSR.I
   val cpu_ren = io.rw.cmd =/= CSR.N && !system_insn
 
-  val host_csr_req_valid = Reg(Bool()) // don't reset
+  val host_csr_req_valid = Reg(init=Bool(false)) // don't reset
   val host_csr_req_fire = host_csr_req_valid && !cpu_ren
-  val host_csr_rep_valid = Reg(Bool()) // don't reset
+  val host_csr_rep_valid = Reg(init=Bool(false)) // don't reset
   val host_csr_bits = Reg(io.host.csr.req.bits)
   io.host.csr.req.ready := !host_csr_req_valid && !host_csr_rep_valid
   io.host.csr.resp.valid := host_csr_rep_valid
diff --git a/src/main/scala/nbdcache.scala b/src/main/scala/nbdcache.scala
index 2d0eee2..a2d8bbe 100644
--- a/src/main/scala/nbdcache.scala
+++ b/src/main/scala/nbdcache.scala
@@ -395,7 +395,8 @@ class MSHRFile(implicit p: Parameters) extends L1HellaCacheModule()(p) {
   }
 
   // determine if the request is in the memory region or mmio region
-  val cacheable = io.req.bits.addr < UInt(mmioBase)
+  //val cacheable = io.req.bits.addr < UInt(mmioBase)
+  val cacheable = Bool(false)
 
   val sdq_val = Reg(init=Bits(0, sdqDepth))
   val sdq_alloc_id = PriorityEncoder(~sdq_val(sdqDepth-1,0))
diff --git a/src/main/scala/rocket.scala b/src/main/scala/rocket.scala
index d965709..dfdf549 100644
--- a/src/main/scala/rocket.scala
+++ b/src/main/scala/rocket.scala
@@ -163,6 +163,10 @@ class Rocket(implicit p: Parameters) extends CoreModule()(p) {
   val wb_reg_wdata = Reg(Bits())
   val wb_reg_rs2 = Reg(Bits())
   val take_pc_wb = Wire(Bool())
+  //SH
+  val reg_ll_wdata_postponed = Reg(Bits())
+  val reg_ll_waddr_postponed = Reg(Bits())
+  val reg_ll_wen_postponed = Reg(init = Bool(false))
 
   val take_pc_mem_wb = take_pc_wb || take_pc_mem
   val take_pc = take_pc_mem_wb
@@ -410,12 +414,36 @@ class Rocket(implicit p: Parameters) extends CoreModule()(p) {
 
   val wb_valid = wb_reg_valid && !replay_wb && !csr.io.csr_xcpt
   val wb_wen = wb_valid && wb_ctrl.wxd
-  val rf_wen = wb_wen || ll_wen 
-  val rf_waddr = Mux(ll_wen, ll_waddr, wb_waddr)
+
+  //SH
+  val stall_wen = ll_wen && wb_wen// && (wb_waddr === UInt(0x1))
+  when (stall_wen) {
+       reg_ll_wen_postponed := Bool(true)
+       reg_ll_waddr_postponed := wb_waddr
+       reg_ll_wdata_postponed := wb_reg_wdata
+  }
+  when (!wb_wen || (!ll_wen && wb_wen && wb_waddr === reg_ll_waddr_postponed)) {
+       reg_ll_wen_postponed := Bool(false)
+       reg_ll_waddr_postponed := UInt(0)
+       reg_ll_wdata_postponed := UInt(0)
+  }
+  val rf_wen = wb_wen || ll_wen || reg_ll_wen_postponed
+  val rf_waddr = Mux(ll_wen, ll_waddr, 
+                 Mux(wb_wen, wb_waddr, 
+                 reg_ll_waddr_postponed))
+
   val rf_wdata = Mux(dmem_resp_valid && dmem_resp_xpu, io.dmem.resp.bits.data,
                  Mux(ll_wen, ll_wdata,
                  Mux(wb_ctrl.csr =/= CSR.N, csr.io.rw.rdata,
-                 wb_reg_wdata)))
+                 Mux(wb_wen, wb_reg_wdata,
+                 reg_ll_wdata_postponed))))
+
+  //val rf_wen = wb_wen || ll_wen 
+  //val rf_waddr = Mux(ll_wen, ll_waddr, wb_waddr)
+  //val rf_wdata = Mux(dmem_resp_valid && dmem_resp_xpu, io.dmem.resp.bits.data,
+  //               Mux(ll_wen, ll_wdata,
+  //               Mux(wb_ctrl.csr != CSR.N, csr.io.rw.rdata,
+  //               wb_reg_wdata)))
   when (rf_wen) { rf.write(rf_waddr, rf_wdata) }
 
   // hook up control/status regfile
@@ -484,7 +512,8 @@ class Rocket(implicit p: Parameters) extends CoreModule()(p) {
     id_ctrl.mem && !io.dmem.req.ready ||
     Bool(usingRoCC) && wb_reg_rocc_pending && id_ctrl.rocc && !io.rocc.cmd.ready ||
     id_do_fence ||
-    csr.io.csr_stall
+    csr.io.csr_stall || 
+    stall_wen || reg_ll_wen_postponed   //SH
   ctrl_killd := !io.imem.resp.valid || take_pc || ctrl_stalld || csr.io.interrupt
 
   io.imem.req.valid := take_pc
diff --git a/src/main/scala/tlb.scala b/src/main/scala/tlb.scala
index 55e7359..5ff3fda 100644
--- a/src/main/scala/tlb.scala
+++ b/src/main/scala/tlb.scala
@@ -148,14 +148,10 @@ class TLB(implicit p: Parameters) extends TLBModule()(p) {
     plru.access(OHToUInt(tag_cam.io.hits))
   }
 
-  val paddr = Cat(io.resp.ppn, UInt(0, pgIdxBits))
-  val addr_ok = addrMap.isValid(paddr)
-  val addr_prot = addrMap.getProt(paddr)
-
   io.req.ready := state === s_ready
-  io.resp.xcpt_ld := !addr_ok || !addr_prot.r || bad_va || tlb_hit && !(r_array & tag_cam.io.hits).orR
-  io.resp.xcpt_st := !addr_ok || !addr_prot.w || bad_va || tlb_hit && !(w_array & tag_cam.io.hits).orR
-  io.resp.xcpt_if := !addr_ok || !addr_prot.x || bad_va || tlb_hit && !(x_array & tag_cam.io.hits).orR
+  io.resp.xcpt_ld := bad_va || tlb_hit && !(r_array & tag_cam.io.hits).orR
+  io.resp.xcpt_st := bad_va || tlb_hit && !(w_array & tag_cam.io.hits).orR
+  io.resp.xcpt_if := bad_va || tlb_hit && !(x_array & tag_cam.io.hits).orR
   io.resp.miss := tlb_miss
   io.resp.ppn := Mux(vm_enabled, Mux1H(tag_cam.io.hits, tag_ram), io.req.bits.vpn(ppnBits-1,0))
   io.resp.hit_idx := tag_cam.io.hits
Entering 'torture'
Entering 'uncore'
Entering 'zscale'
 

Compare with Previous | Blame | View Log

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.