The compiler keeps correcting my declarations. Assigning a wire inside an always block is an error, using assign on a reg is an error, and connecting a reg to the output port of an instantiated module is an error as well. Meanwhile a signal declared reg and assigned in always @* synthesises to plain gates with no register anywhere.
What do reg and wire actually mean, how do I know which one a signal needs, and does SystemVerilog's logic make the distinction go away?




