SMV follows a ``single assignment'' rule. This means that a given signal can be assigned only once in a program. Thus, we avoid the problem of conflicting definitions. The definition of ``single assignment'' is complicated somewhat by the ``next'' and ``init'' operators. The rule is this: one may either assign a value to x, or to next(x) and init(x), but not both. Thus, the following are legal:
x := foo; | next(x) := foo; |
init(x) := foo; | init(x) := foo; |
next(x) := bar; |
while the following are illegal:
x := foo; | next(x) := foo; |
x := bar | next(x) := bar; |
x := foo; | x := foo; |
init(x) := bar; | next(x) := bar; |