From bdb7b1de3677cca812f45afda82cd14130b2ce18 Mon Sep 17 00:00:00 2001 From: Howard Mao Date: Tue, 13 Sep 2016 20:29:42 -0700 Subject: [PATCH] move tilelink-agnostic counters from uncore to util package --- src/main/scala/uncore/util/Counters.scala | 33 +-------------------- src/main/scala/util/Counters.scala | 36 +++++++++++++++++++++++ 2 files changed, 37 insertions(+), 32 deletions(-) create mode 100644 src/main/scala/util/Counters.scala diff --git a/src/main/scala/uncore/util/Counters.scala b/src/main/scala/uncore/util/Counters.scala index 3bc2d85b..52209797 100644 --- a/src/main/scala/uncore/util/Counters.scala +++ b/src/main/scala/uncore/util/Counters.scala @@ -2,40 +2,9 @@ package uncore.util import Chisel._ import uncore.tilelink._ +import util.TwoWayCounter import cde.Parameters -// Produces 0-width value when counting to 1 -class ZCounter(val n: Int) { - val value = Reg(init=UInt(0, log2Ceil(n))) - def inc(): Bool = { - if (n == 1) Bool(true) - else { - val wrap = value === UInt(n-1) - value := Mux(Bool(!isPow2(n)) && wrap, UInt(0), value + UInt(1)) - wrap - } - } -} - -object ZCounter { - def apply(n: Int) = new ZCounter(n) - def apply(cond: Bool, n: Int): (UInt, Bool) = { - val c = new ZCounter(n) - var wrap: Bool = null - when (cond) { wrap = c.inc() } - (c.value, cond && wrap) - } -} - -object TwoWayCounter { - def apply(up: Bool, down: Bool, max: Int): UInt = { - val cnt = Reg(init = UInt(0, log2Up(max+1))) - when (up && !down) { cnt := cnt + UInt(1) } - when (down && !up) { cnt := cnt - UInt(1) } - cnt - } -} - class BeatCounterStatus extends Bundle { val idx = UInt() val done = Bool() diff --git a/src/main/scala/util/Counters.scala b/src/main/scala/util/Counters.scala new file mode 100644 index 00000000..012af64d --- /dev/null +++ b/src/main/scala/util/Counters.scala @@ -0,0 +1,36 @@ +package util + +import Chisel._ +import cde.Parameters + +// Produces 0-width value when counting to 1 +class ZCounter(val n: Int) { + val value = Reg(init=UInt(0, log2Ceil(n))) + def inc(): Bool = { + if (n == 1) Bool(true) + else { + val wrap = value === UInt(n-1) + value := Mux(Bool(!isPow2(n)) && wrap, UInt(0), value + UInt(1)) + wrap + } + } +} + +object ZCounter { + def apply(n: Int) = new ZCounter(n) + def apply(cond: Bool, n: Int): (UInt, Bool) = { + val c = new ZCounter(n) + var wrap: Bool = null + when (cond) { wrap = c.inc() } + (c.value, cond && wrap) + } +} + +object TwoWayCounter { + def apply(up: Bool, down: Bool, max: Int): UInt = { + val cnt = Reg(init = UInt(0, log2Up(max+1))) + when (up && !down) { cnt := cnt + UInt(1) } + when (down && !up) { cnt := cnt - UInt(1) } + cnt + } +}