Synthesijer.Scalaでは,特定の状態でのレジスタへの代入は
sig0 <= (state, sig1)
と,条件付きの状態遷移は
state0 -> (flag, state1)
と記述するようにしていたのですが,美しくないというコメントをいただき,また同時に”*”ではどうか,というご提案をいただいたので対応してみました.
つまり,
sig0 <= state * sig1
あるいは,
state0 * flag -> state1
というように書けるようになります.
いわゆるベンディングマシンの例題であれば,次のような記述になります.
package synthesijer.scala
class VendingMachine(n:String, c:String, r:String) extends Module(n, c, r){
def this() = this("vendingmachine", "clk", "reset")
val nickel = inP("nickel")
val dime = inP("dime")
val rdy = outP("rdy")
val seq = sequencer("main")
val s5,s10,s15,s_ok = seq.add()
rdy <= seq.idle * LOW
rdy <= s_ok * HIGH
seq.idle * nickel -> s5
seq.idle * dime -> s10
s5 * nickel -> s10
s5 * dime -> s15
s10 * nickel -> s15
s10 * dime -> s_ok
s15 * nickel -> s_ok
s15 * dime -> s_ok
s_ok -> seq.idle
}
ガードライクに書ける方がいいのでは?というコメントももらったので,後で試してみよう.