Electrical engineering rules of thumb (EEROTs) are time saving design guidelines used by electrical engineers. However, not all EEROTs are created equal, and many are not timeless. I have witnessed engineers, including myself, blindly apply EEROTs, only to regret it the morning after.
This raises the question: how does a young electrical engineer know when to use an especially alluring rule of thumb? The answer is: one must keep in mind not only the EEROT, but also its rationale.
Here, we begin what will hopefully be the first in a series of posts discussing various EEROTs.
Old EEROT #1: Do not use signal initializations in synthesizable code
Signal initilization in synthesizable VHDL to initialize registers used to be a cardinal sin because initialization was simulatable but not sythesizable. What this means is it would behave one way in simulation, but infer logic that did not behave the same way in practice. This led to behavioral discrepancies between simulation and hardware. Consequently, a popular EEROT used to be "do not use signal initialization in synthesizable code."
For example, Ben Cohen, in VHDL coding styles and methodologies, wrote "initialization is ignored by sythesizers".(Cohen 1999, p. 119) To be fair, Mr. Cohen's advice is still correct when targeting ASICs, and it was probably valid for FPGAs back in 1999, but FPGA synthesizers have evolved since then, and no longer universally ignore initializations when initialized signals infer registers.
Specifically, in addition to the connections among registers and the specification of combinatorial logic, FPGAs, unlike most if not all ASICs, have an innate capacity to provision the values registers contain immediately after configuration, independent of reset.
In response, FPGA synthesizers initially provided out-of-band mechanisms to specify the after-configuration value of registers. One such mechanism took advantage of VHDL's ability to specify user defined attributes. In the following (now depreciated) example, based on XST, a VHDL user defined attribute init is applied to my_reg, in order to control its value upon exiting FPGA configuration:
Continue Reading »