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)
A measurement system can be accurate but not precise, precise but not accurate, neither, or both. For example, if an experiment contains a systematic error, then increasing the sample size generally increases precision but does not improve accuracy. Eliminating the systematic error improves accuracy but does not change precision.
ReplyDeletemachining edmonton
I think you stayed within the timeprecision on line 25 of your example. I believe the delay is 11.23ns and is therefore not rounded as your local timeprecision is 10ps. What would happen if you specified delay of #1.0123 on line 25?
ReplyDelete#5; // 50 ns = 50000 ps
ReplyDeleteb ++;
#1.123; // 50 ns + 10.123 ns = 60.123 ns = 60123 ps
i have doubt sir , 1.123 * 10 = 11.230ns but you have written 10.123ns
-> 11.230 +50 = 61.230ns = 61230ps sir buy you have written 60123ps
can you clear my doubt