summaryrefslogtreecommitdiff
path: root/src/test/scala/examples/ImplicitStateVendingMachine.scala
blob: 36ac82ab49885cbb7a3ffcd9af285fb93825c77d (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
// SPDX-License-Identifier: Apache-2.0

package examples

import chiselTests.ChiselFlatSpec
import chisel3._

// Vending machine implemented with an implicit state machine
class ImplicitStateVendingMachine extends SimpleVendingMachine {
  // We let the value of nickel be 1 and dime be 2 for efficiency reasons
  val value = RegInit(0.asUInt(3.W))
  val incValue = WireDefault(0.asUInt(3.W))
  val doDispense = value >= 4.U // 4 * nickel as 1 == $0.20

  when(doDispense) {
    value := 0.U // No change given
  }.otherwise {
    value := value + incValue
  }

  when(io.nickel) { incValue := 1.U }
  when(io.dime) { incValue := 2.U }

  io.dispense := doDispense
}

class ImplicitStateVendingMachineSpec extends ChiselFlatSpec {
  "An vending machine implemented with implicit state" should "work" in {
    assertTesterPasses { new SimpleVendingMachineTester(new ImplicitStateVendingMachine) }
  }
}