Driver(() => newModule { // Example circuit using a Queue val io = IO(newBundle { val in = Flipped(Decoupled(UInt(8.W))) val out = Decoupled(UInt(8.W)) }) val queue = Queue(io.in, 2) // 2-element queue io.out <> queue }) { c => newPeekPokeTester(c) { // Example testsequence showing the use and behavior of Queue poke(c.io.out.ready, 0) poke(c.io.in.valid, 1) // Enqueue an element poke(c.io.in.bits, 42) println(s"Starting:") println(s"\tio.in: ready=${peek(c.io.in.ready)}") println(s"\tio.out: valid=${peek(c.io.out.valid)}, bits=${peek(c.io.out.bits)}") // in.Ready:1, out.Valid: 0 step(1) poke(c.io.in.valid, 1) // Enqueue another element poke(c.io.in.bits, 43) // What do you think io.out.valid and io.out.bits will be? println(s"After first enqueue:") println(s"\tio.in: ready=${peek(c.io.in.ready)}") println(s"\tio.out: valid=${peek(c.io.out.valid)}, bits=${peek(c.io.out.bits)}") step(1) // in.Ready:1, out.Valid:1 poke(c.io.in.valid, 1) // Read a element, attempt to enqueue poke(c.io.in.bits, 44) poke(c.io.out.ready, 1) // What do you think io.in.ready will be, and will this enqueue succeed, and what will be read? println(s"On first read:") println(s"\tio.in: ready=${peek(c.io.in.ready)}") println(s"\tio.out: valid=${peek(c.io.out.valid)}, bits=${peek(c.io.out.bits)}") step(1) // in.Ready:0, out.Valid:1 poke(c.io.in.valid, 0) // Read elements out poke(c.io.out.ready, 1) // What do you think will be read here? println(s"On second read:") println(s"\tio.in: ready=${peek(c.io.in.ready)}") println(s"\tio.out: valid=${peek(c.io.out.valid)}, bits=${peek(c.io.out.bits)}") step(1) // in.Ready:1, out.Valid:1 // Will a third read produce anything? println(s"On third read:") println(s"\tio.in: ready=${peek(c.io.in.ready)}") println(s"\tio.out: valid=${peek(c.io.out.valid)}, bits=${peek(c.io.out.bits)}") // in.Ready:1, out.Valid:0 step(1) } }
Driver(() => newModule { // Example circuit using a priority arbiter val io = IO(newBundle { val in = Flipped(Vec(2, Decoupled(UInt(8.W)))) val out = Decoupled(UInt(8.W)) }) // Arbiter doesn't have a convenience constructor, so it's built like any Module val arbiter = Module(newArbiter(UInt(8.W), 2)) // 2 to 1 Priority Arbiter arbiter.io.in <> io.in io.out <> arbiter.io.out }) { c => newPeekPokeTester(c) { poke(c.io.in(0).valid, 0) poke(c.io.in(1).valid, 0) println(s"Start:") println(s"\tin(0).ready=${peek(c.io.in(0).ready)}, in(1).ready=${peek(c.io.in(1).ready)}") println(s"\tout.valid=${peek(c.io.out.valid)}, out.bits=${peek(c.io.out.bits)}") poke(c.io.in(1).valid, 1) // Valid input 1 poke(c.io.in(1).bits, 42) // What do you think the output will be? println(s"valid input 1:") println(s"\tin(0).ready=${peek(c.io.in(0).ready)}, in(1).ready=${peek(c.io.in(1).ready)}") println(s"\tout.valid=${peek(c.io.out.valid)}, out.bits=${peek(c.io.out.bits)}") poke(c.io.in(0).valid, 1) // Valid inputs 0 and 1 poke(c.io.in(0).bits, 43) // What do you think the output will be? Which inputs will be ready? println(s"valid inputs 0 and 1:") println(s"\tin(0).ready=${peek(c.io.in(0).ready)}, in(1).ready=${peek(c.io.in(1).ready)}") println(s"\tout.valid=${peek(c.io.out.valid)}, out.bits=${peek(c.io.out.bits)}") poke(c.io.in(1).valid, 0) // Valid input 0 // What do you think the output will be? println(s"valid input 0:") println(s"\tin(0).ready=${peek(c.io.in(0).ready)}, in(1).ready=${peek(c.io.in(1).ready)}") println(s"\tout.valid=${peek(c.io.out.valid)}, out.bits=${peek(c.io.out.bits)}") } }
其他常用函数
位操作
PopCount
PopCount对某个向量中的1的个数进行计数。
Reverse
反转输入的向量。
计数器
计数器每个周期加1.
1 2 3 4
val counter = Counter(3) // 3-count Counter (outputs range [0...2]) when(io.count) { counter.inc() }