Within a design element, such as a module, program or
interface, the time precision specifies how delay values are rounded before
being used in simulation.
The time precision is relative to the time units. If the
precision is the same as the time units, then delay values are rounded off to
whole numbers (integers). If the precision is one order of magnitude smaller
than the time units, then delay values are rounded off to one decimal place.
For example, if the time unit specified is 1ns and the
precision is 100ps, then delay values are rounded off to one decimal place
(100ps is equivalent to 0.1ns). Thus, a delay of 2.75ns would be rounded off to
2.8ns.
The time unit and time precision can be specified in the
following two ways:
— Using the compiler directive `timescale
— Using the keywords timeunit and timeprecision
Here in this post, we will go in details of second way (timeunit
and timeprecision).
The time precision may also be declared using an optional
second argument to the timeunit keyword using the slash separator. For
example:
------------------------------------------------------------------------------
------------------------------------------------------------------------------
Defining the timeunit and timeprecision constructs within
the design element removes the file order dependency problems with compiler
directives.
There shall be at most one time-unit and one time-precision
for any module, program, package, or interface definition or in any
compilation-unit scope. This shall define a time scope.
The timeunit and timeprecision declarations shall precede
any other items in the current time scope. i.e. timeunit and timeprecision
shall be declared either inside module, program, package, interface or after
any item in any compilation-unit scope.
The timeunit and timeprecision declarations can be repeated
as later items, but must match the previous declaration within the current time
scope.
If a timeunit is not specified within a module, program,
package, or interface definition, then the time unit shall be determined using
the following rules of precedence:
- If the module or interface definition is nested, then the time unit shall be inherited from the enclosing module or interface (programs and packages cannot be nested).
- Else, if a `timescale directive has been previously specified (within the compilation unit), then the time unit shall be set to the units of the last `timescale directive.
- Else, if the compilation-unit scope specifies a time unit (outside all other declarations), then the time unit shall be set to the time units of the compilation unit.
- Else, the default time unit shall be used.
The global time
precision, also called the simulation
time unit, is the minimum of,
- All the timeprecision statements,
- All the time precision arguments to timeunit declarations, and
- The smallest time precision argument of all the `timescale compiler directives in the design.
Let's go through one example,
------------------------------------------------------------------------------
------------------------------------------------------------------------------
Reference:
1) SystemVerilog LRM (1800-2012)