xref: /XiangShan/src/main/scala/utils/OverrideableQueue.scala (revision 289fc2f9291f65a873c97dd5ad2876aea033ce6f)
1*289fc2f9SLinJiaweipackage utils
2*289fc2f9SLinJiawei
3*289fc2f9SLinJiaweiimport chisel3._
4*289fc2f9SLinJiaweiimport chisel3.util._
5*289fc2f9SLinJiawei
6*289fc2f9SLinJiaweiclass OverrideableQueue[T <: Data](gen: T, n: Int) extends Module {
7*289fc2f9SLinJiawei  val io = IO(new Bundle() {
8*289fc2f9SLinJiawei    val in = Flipped(ValidIO(gen))
9*289fc2f9SLinJiawei    val out = Decoupled(gen)
10*289fc2f9SLinJiawei  })
11*289fc2f9SLinJiawei  val entries = Seq.fill(n){ Reg(gen) }
12*289fc2f9SLinJiawei  val valids = Seq.fill(n){ RegInit(false.B) }
13*289fc2f9SLinJiawei  val rd_ptr = RegInit(0.U(log2Up(n).W))
14*289fc2f9SLinJiawei  val wr_ptr = RegInit(0.U(log2Up(n).W))
15*289fc2f9SLinJiawei
16*289fc2f9SLinJiawei  when(io.in.valid){
17*289fc2f9SLinJiawei    wr_ptr := wr_ptr + 1.U
18*289fc2f9SLinJiawei  }
19*289fc2f9SLinJiawei  when(io.out.fire){
20*289fc2f9SLinJiawei    rd_ptr := rd_ptr + 1.U
21*289fc2f9SLinJiawei  }
22*289fc2f9SLinJiawei
23*289fc2f9SLinJiawei  val w_mask = (0 until n).map(i => i.U === wr_ptr)
24*289fc2f9SLinJiawei  val r_mask = (0 until n).map(i => i.U === rd_ptr)
25*289fc2f9SLinJiawei
26*289fc2f9SLinJiawei  for((v, r) <- valids.zip(r_mask)){
27*289fc2f9SLinJiawei    when(r && io.out.fire){
28*289fc2f9SLinJiawei      v := false.B
29*289fc2f9SLinJiawei    }
30*289fc2f9SLinJiawei  }
31*289fc2f9SLinJiawei
32*289fc2f9SLinJiawei  for(((v, e), w) <- valids.zip(entries).zip(w_mask)){
33*289fc2f9SLinJiawei    when(io.in.valid && w){
34*289fc2f9SLinJiawei      v := true.B
35*289fc2f9SLinJiawei      e := io.in.bits
36*289fc2f9SLinJiawei    }
37*289fc2f9SLinJiawei  }
38*289fc2f9SLinJiawei
39*289fc2f9SLinJiawei  io.out.valid := Mux1H(r_mask, valids)
40*289fc2f9SLinJiawei  io.out.bits := Mux1H(r_mask, entries)
41*289fc2f9SLinJiawei}
42