Search code examples
verilogdirective

Are Verilog directives mandatory, e.g. timescale?


Is a timescale or any other directive mandatory in Verilog (2001) or is its use a matter of convention or style? For example, I typically use default_nettype none to enforce explicit net declarations throughout my implementation. However, Verilog does not require me to do so.

When it comes to timescale, I obviously place it at the top of my HDL testbench. But why use it in every single module of an IP? In case of inconsistent definitions, could this lead to more problems rather than preventing them?


Solution

  • Generally speaking, Verilog compiler directives are not mandatory.

    For timescale, refer to IEEE Std 1800-2017, section 22.7 `timescale:

    If there is no timescale specified or it has been reset by a `resetall directive, the default time unit and precision are tool-specific.

    The directives are global in scope, which means that when the compiler encounters one, it remains in effect for all the following code which is compiled (until another is encountered). So, there is no need to add timescale directives to all your code.

    However, in practice, I have seen compilers generate errors if the 1st module (or modules) compiled does not have a timescale directive but subsequent modules do. These simulators also offer a command-line option to set the default timescale to avoid this error.