|
VHDL Simili Documentation:
Command file reference:
This chapter documents the various commands
that can be used in a command file supplied to vhdle (the
simulator). This command file is used in conjunction with the the -do/-list
options of the simulator. The command line language documented below is for
backward compatibility purposes for the command line version only. Most of this
functionality will be moved to Sonata so that it can be accessed using the TCL
language. However, we do intend to keep the following interface alive for as
long as possible.
Before we delve into the various commands we
should understand the basic syntax of the command file.
Syntax rules
- Blank lines are ignored
- Any line beginning with the '#' character is
also ignored
- The first word of each line is the command.
- Commands are case sensitive. Unlike VHDL,
the commands in this file are case sensitive. We have deliberately made this
choice so we can avoid confusion later and stay forward compatible with other languages (Verilog, Tcl,
Perl, etc).
- Each command is followed by zero or more
command arguments.
- Each command will decide how it wishes to
interpret it's arguments. Unless specified otherwise, the arguments are also
interpreted in a case sensitive manner.
The following documentation conventions have
been used in this chapter
- Optional arguments are surrounded by square
brackets '[' ']'
- Choices are separated by '|' -- a | b implies
a or b but not both a or b
- Braces '{' '}' enclose an item that can be
repeated. { a | b } implies that a | b can be repeated zero or more times.
Command summary
add list { signal-name
}
This command adds the specified signal-name(s) to the list of signals being
monitored. You can use multiple such commands (or specify multiple
signal-names in one command) to monitor signals. Please refer to the signal-name
syntax below. The following are examples of adding various signals to the list of signals being monitored.
add list sig1 sig2(3) /u1/state1 :u1:state2 /u2/*
add list *
When absolute path names are specified (path name begins with a '/' or a
':') we first attempt to search for the signal with its full path name,
failing which we attempt to search it as if it is a relative path name (by
removing the leading '/' or ':'). Signal values are printed without quotes
(single or double) to save space and complex data structures such as records,
multi-dimensional arrays are printed as if they were aggregates (using nested
parentheses and commas). Real numbers are printed with a maximum precision of
6 digits.
Note that you can monitor the same signal (or a portion thereof) multiple
times. This can be helpful for example if you would like to repeat your clock
(or some other control signal) every so often. We put a lot of effort into
making sure that we use as less horizontal space as possible (while still
being readable) and at the same time, make the list file look as tabular as we
can. But sometimes, this is not possible when you have records or arrays
containing numbers (integers, reals, etc.). In such cases, we are forced to
estimate (rather than calculate) a reasonable column width. Note that all data columns are right justified to
their estimated column width and each column is separated by a single space
character.
You cannot monitor aliases or variables. Most aliases
actually get optimized out by the compiler and variables cannot be monitored
at this time because they do not trigger events.
SetListHeaderStyle style
This command specifies how the header of the list file should be printed.
'style' can be one of three different styles currently supported. You can
experiment with the style that suites you (or your current design). The
following styles are supported.
- horizontal -- This is
the default style. This style uses the least number of lines. Each name is
right aligned with its own data column.
- vertical -- This style
also right aligns the name with its data column but prints the entire name
in a columnar format (one character per line). A series of dots (.) are
printed to fill the gap between the name and its data column. The number
of lines consumed by this style is determined by the largest name being
displayed.
- wrapped -- This style is
a compromise of the above two styles. It left and bottom aligns the name
to the data column and essentially uses the full width of the data column
to print the name. If the name is longer than its data width, it simply
wraps around.
The following is an example of that selects the vertical style.
SetListHeaderStyle vertical
If multiple SetListHeaderStyle commands are
specified, the last one overrides the previous one.
Hint: We recommend using a text editor that supports splitter panes (same
file in multiple sub-windows) so that you can see the header in one window and
the list output in the window below. Editors such as Microsoft Word, emacs,
vim, etc. are capable of doing this.
SetListStyle { delta | nodelta |
collpase | nocollapse }
This command affects the contents of the body of the list file. You can
specify one or more of the keywords specified above. The following is the
default specification (if none is specified).
SetListStyle delta nocollapse
The following is the meaning of each of the keywords
nocollapse -- When zero
delay assignments are used in a design, this has the potential of creating an
additional simulation cycle without actually advancing time. Such a cycle
is called a "delta cycle". During these delta cycles signal values
can change. With this option, all such intermediate values are written.
collapase -- Sometimes, we
might not be interested in the delta cycle information and instead, we are
interested in the final value(s) assumed by all the signals being monitored at
any given time. It essentially collapses the delta cycle information and only
displays the "settled" or "final" values of the signals
being monitored. This has a tendency of clarifying the output somewhat but has
the danger of hiding glitches or other important information with regards to the order in which
signals are changing.
delta
-- This option create
a column that prints the delta cycle number in each row of the output
nodelta -- This option
suppresses the column that prints the delta cycle number.
SetListInterval start-time [
end-time ]
Sometimes, it may be useful to monitor signals only during a period of time
that is of interest. On large simulations that can reduce the amount of time
spent writing the list file and also reduces the size of the list file. The
start-time specifies when the monitoring should begin. If no end-time is
specified, it is assumed to be the end of simulation. The following is the
default specification
SetListInterval 0ns
The time specification is similar to the specification of time in command
line arguments for the simulator (no spaces between the number and the units).
Note that if you specify a start time that is greater than the maximum
simulation time, the list file may never even be written. The end-time must be
greater than or equal to the start-time (or else it is silently ignored). The
following example sets the time interval to be between 1us and 2.1us
SetListInterval 1us 2.1us
The syntax used to specify signal names allows you specify full or partial
signal names, all signals in a given region of your design, a specific signal
from a specific region, etc. Region names are derived from the label associated
with that region except for the top level region name. The top level region name
is always either the name of the top-level-entity or a package-name. Sub-region
names are typically labels like block label, generate label, component
instantiation label, etc. A signal can be one of the following types
- A full signal name (scalar or array or record)
- A partial signal name such as an single item of an array or a record
field. Examples of such signal names are x(1), ary(2,3), rec.fld,
rec.fld(3), etc. Indices MUST be integers (no spaces). Indices and record
fields MUST be valid for the given signal prefix. A slice is NOT allowed as
a valid partial signal name.
The following syntax can be used to select a signal
| signal-name |
::= |
[ region ] item |
| item |
::= |
* | name |
| name |
::= |
prefix [ suffix ] |
| suffix |
::= |
indices | record-field |
| indices |
::= |
'(' INTEGER {, INTEGER }
')' |
| record-field |
::= |
'.' IDENTIFIER |
| prefix |
::= |
IDENTIFIER | name |
|
|
|
| region |
::= |
[ absolute-path-prefix ]
label { hsep label } hsep |
| absolute-path-prefix |
::= |
hsep design-unit-name
hsep |
| design-unit-name |
::= |
entity-name | package-name |
| hsep |
::= |
':' | '/' |
| label |
::= |
IDENTIFIER [ '('
generate-index ')' ] |
| generate-index |
::= |
INTEGER | ENUM_LITERAL |
| entity-name |
::= |
IDENTIFIER -- must be top
level entity name |
| package-name |
::= |
IDENTIFIER -- can be any
package name |
As noted above, you use either a ':' or a '/' as a hierarchy/region
separator. A "label" can be a block or component or generate label.
Note that if you have a FOR generate label, it has to be suffixed by the exact
generate index you are interested in. If a region does not begin with an "hsep",
it implies that the rest of the signal-name is relative to the top level of your
design. If it does begin with an "hsep", then the path is an absolute
name and this can be used to select signals from a package or from the top level
entity name. The following are some examples of signal names (assume that the
top level entity name is TOP and the design also uses a package called MYPKG
u1/sig1
-- Selects signal 'sig1' in region /top/u1
/top/u1/sig -- Same as above
/TOP/U1/SIG -- Same as above (case does not
matter)
:top:u1:sig -- Same as above (using ':' as a
separator)
/mypkg/mysig -- Selects mysig defined in PACKAGE MYPKG
/top/u1/* -- All signals in region /tmp/u1
/top/u1/si* -- Invalid
mysig --
Selects signal 'mysig' in /TOP
*
-- Selects all signals in /TOP
ginger(1) -- Selects index 1 of
one-dim signal ginger
fred.fld -- Selects record field 'fld'
or fred
fred.fld(1) -- Selects index 1 of fred.fld
Note that a signal name is NOT case sensitive except for portions of the name
which contains VHDL extended identifiers.
Example command file and sample output:
Here is a sample command file for a vital design that models an 8-input and
function. We have listed the signals at the top level of the test bench
(x_and8_tb) and also signals from one level down in the hierarchy where the
actual implementation lies.
# Following are relative path names
add list i7 i6 i5 i4 i3 i2 i1 i0 o
# Following is a full path name
# It is also an example of a vectored signal
add list /x_and8_tb/vec_stim
# Following is a wild card example. Notice that it
# is using a relative path name and will cause
# the simulator to monitor all signals in the block
# labeled uut
add list uut/*
Click here to see the sample output from such a
simulation using the command listed above.
|