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