未验证 提交 bfa46a82 编写于 作者: Y Yinan Xu 提交者: GitHub

Merge pull request #327 from RISCVERS/debian-gogogo

roq, icache, storeUnit, emu, dtlb: bug fixes
......@@ -365,6 +365,7 @@ class Roq(numWbPorts: Int) extends XSModule with HasCircularQueuePtrHelper {
// when exception occurs, cancels all
when (io.redirect.valid) { // TODO: need check for flushPipe
state := s_idle
enqPtrExt := 0.U.asTypeOf(new RoqPtr)
deqPtrExt := 0.U.asTypeOf(new RoqPtr)
}
......
......@@ -273,8 +273,32 @@ class TLB(Width: Int, isDtlb: Boolean) extends TlbModule with HasCSRConst{
val entry = Reg(Vec(TlbEntrySize, new TlbEntry))
val g = VecInit(entry.map(_.perm.g)).asUInt // TODO: need check if reverse is needed
/**
* PTW refill
*/
val refill = ptw.resp.fire()
val randIdx = LFSR64()(log2Up(TlbEntrySize)-1,0)
val priorIdx = PriorityEncoder(~(v|pf))
val tlbfull = ParallelAND((v|pf).asBools)
val refillIdx = Mux(tlbfull, randIdx, priorIdx)
val refillIdxOH = UIntToOH(refillIdx)
when (refill) {
v := Mux(ptw.resp.bits.pf, v & ~refillIdxOH, v | refillIdxOH)
entry(refillIdx) := ptw.resp.bits.entry
XSDebug(p"Refill: idx:${refillIdx} entry:${ptw.resp.bits.entry}\n")
}
/**
* L1 TLB read
*/
val tlb_read_mask = Mux(refill, refillIdxOH, 0.U(TlbEntrySize.W))
def TLBRead(i: Int) = {
val entryHitVec = VecInit(entry.map(_.hit(reqAddr(i).vpn/*, satp.asid*/)))
val entryHitVec = (
if (isDtlb)
VecInit((tlb_read_mask.asBools zip entry).map{ case (r, e) => !r && e.hit(reqAddr(i).vpn/*, satp.asid*/)})
else
VecInit(entry.map(_.hit(reqAddr(i).vpn/*, satp.asid*/)))
)
val reqAddrReg = if (isDtlb) RegNext(reqAddr(i)) else reqAddr(i)
val cmdReg = if (isDtlb) RegNext(cmd(i)) else cmd(i)
......@@ -364,25 +388,12 @@ class TLB(Width: Int, isDtlb: Boolean) extends TlbModule with HasCSRConst{
val pfHitReset = ParallelOR(widthMap{i => Mux(resp(i).fire(), VecInit(pfHitVecVec(i)).asUInt, 0.U) })
val pfHitRefill = ParallelOR(pfHitReset.asBools)
// refill
val refill = ptw.resp.fire()
val randIdx = LFSR64()(log2Up(TlbEntrySize)-1,0)
val priorIdx = PriorityEncoder(~(v|pf))
val tlbfull = ParallelAND((v|pf).asBools)
val refillIdx = Mux(tlbfull, randIdx, priorIdx)
val re2OH = UIntToOH(refillIdx)
when (refill) {
v := Mux(ptw.resp.bits.pf, v & ~re2OH, v | re2OH)
entry(refillIdx) := ptw.resp.bits.entry
XSDebug(p"Refill: idx:${refillIdx} entry:${ptw.resp.bits.entry}\n")
}
// pf update
when (refill) {
when (pfHitRefill) {
pf := Mux(ptw.resp.bits.pf, pf | re2OH, pf & ~re2OH) & ~pfHitReset
pf := Mux(ptw.resp.bits.pf, pf | refillIdxOH, pf & ~refillIdxOH) & ~pfHitReset
} .otherwise {
pf := Mux(ptw.resp.bits.pf, pf | re2OH, pf & ~re2OH)
pf := Mux(ptw.resp.bits.pf, pf | refillIdxOH, pf & ~refillIdxOH)
}
} .otherwise {
when (pfHitRefill) {
......@@ -390,7 +401,7 @@ class TLB(Width: Int, isDtlb: Boolean) extends TlbModule with HasCSRConst{
}
}
when (PopCount(pf) > 10.U) { // when too much pf, just clear
pf := Mux(refill && ptw.resp.bits.pf, re2OH, 0.U)
pf := Mux(refill && ptw.resp.bits.pf, refillIdxOH, 0.U)
}
// sfence (flush)
......
......@@ -311,7 +311,7 @@ class ICache extends ICacheModule
//physical address < 0x80000000
//TODO: May have bugs
s2_access_fault := (s2_tlb_resp.paddr(31,0) < accessBorder.U(31,0)) && s2_valid
s2_access_fault := (s2_tlb_resp.paddr < accessBorder.U) && s2_valid
// SRAM(Meta and Data) read reseponse
val metas = metaArray.io.readResp
......
......@@ -76,7 +76,7 @@ class StoreUnit_S1 extends XSModule {
// get paddr from dtlb, check if rollback is needed
// writeback store inst to lsq
io.lsq.valid := io.in.valid // TODO: && ! FP
io.lsq.valid := io.in.valid && !s1_tlb_miss// TODO: && ! FP
io.lsq.bits := io.in.bits
io.lsq.bits.paddr := s1_paddr
io.lsq.bits.miss := false.B
......
......@@ -74,7 +74,9 @@ long readFromGz(void* ptr, const char *file_name, long buf_size, uint8_t load_ty
while (curr_size < buf_size) {
uint32_t bytes_read = gzread(compressed_mem, temp_page, chunk_size);
if (bytes_read == 0) { break; }
if (bytes_read == 0) {
break;
}
assert(load_type != LOAD_RAM || bytes_read % sizeof(long) == 0);
for (uint32_t x = 0; x < bytes_read / sizeof(long) + 1; x++) {
if (*(temp_page + x) != 0) {
......@@ -84,6 +86,11 @@ long readFromGz(void* ptr, const char *file_name, long buf_size, uint8_t load_ty
}
curr_size += bytes_read;
}
if(gzread(compressed_mem, temp_page, chunk_size) > 0) {
printf("File size is larger than RAMSIZE!\n");
assert(0);
}
printf("Read %lu bytes from gz stream in total\n", curr_size);
delete [] temp_page;
......@@ -93,4 +100,4 @@ long readFromGz(void* ptr, const char *file_name, long buf_size, uint8_t load_ty
return -1;
}
return curr_size;
}
\ No newline at end of file
}
......@@ -194,7 +194,11 @@ inline void Emulator::single_cycle() {
#ifdef WITH_DRAMSIM3
axi_channel axi;
axi_copy_from_dut_ptr(dut_ptr, axi);
axi.aw.addr -= 0x80000000UL;
axi.ar.addr -= 0x80000000UL;
dramsim3_helper(axi);
axi.aw.addr += 0x80000000UL;
axi.ar.addr += 0x80000000UL;
axi_set_dut_ptr(dut_ptr, axi);
#endif
......@@ -322,6 +326,7 @@ uint64_t Emulator::execute(uint64_t max_cycle, uint64_t max_instr) {
}
if (Verilated::gotFinish()) {
difftest_display(dut_ptr->io_difftest_priviledgeMode);
eprintf("The simulation stopped. There might be some assertion failed.\n");
trapCode = STATE_ABORT;
}
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册