Modules may, of course, contain instances of other modules, and so forth, provided the module references are not circular. So we can, for example, create three-bit counter module, as follows:
MODULE counter3(carry_in, clear, count, carry_out) { INPUT carry_in, clear : boolean; OUTPUT count : array 2..0 of boolean; OUTPUT carry_out : boolean; carry : array 3..1 of boolean; bit0 : counter_bit(carry_in, clear, carry[0], carry[1]); bit1 : counter_bit(carry[1], clear, carry[1], carry[2]); bit2 : counter_bit(carry[2], clear, carry[2], carry[3]); carry_out := carry[3]; }
If we then instantiate this module with
foo : counter(cin,clr,cnt,cout);we will have, for example, an instance of counter_bit called foo.bit0, which defines signals
foo.bit0.carry_in foo.bit0.clear foo.bit0.bit_out foo.bit0.carry_out
MODULE declarations may not appear inside other MODULE declarations, however. That is, all MODULE declarations must be in the outermost scope.