summaryrefslogtreecommitdiff
path: root/src/test/scala/examples/ImplicitStateVendingMachine.scala
diff options
context:
space:
mode:
authorjackkoenig2016-10-26 16:40:36 -0700
committerJack Koenig2017-02-02 22:53:03 -0800
commitdd51b917566e6b30c3f123ca22a0393e73c2afe8 (patch)
treef81fce104ccc3405c7924c76618483750a4350bb /src/test/scala/examples/ImplicitStateVendingMachine.scala
parentb0a328492383108509c322189ed2803f671d7a59 (diff)
Revamp VendingMachine.scala as cookbook example
* Move to cookbook * Change FSM implementation to use switch & is * Add non-FSM implementation * Add execution-driven test
Diffstat (limited to 'src/test/scala/examples/ImplicitStateVendingMachine.scala')
-rw-r--r--src/test/scala/examples/ImplicitStateVendingMachine.scala31
1 files changed, 31 insertions, 0 deletions
diff --git a/src/test/scala/examples/ImplicitStateVendingMachine.scala b/src/test/scala/examples/ImplicitStateVendingMachine.scala
new file mode 100644
index 00000000..ae1e28dd
--- /dev/null
+++ b/src/test/scala/examples/ImplicitStateVendingMachine.scala
@@ -0,0 +1,31 @@
+// See LICENSE for license details.
+
+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 = Reg(init = 0.asUInt(3.W))
+ val incValue = Wire(init = 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) }
+ }
+}