online Verilog-1995 Quick Reference
Guide
by Stuart Sutherland of Sutherland HDL, Inc., Portland, Oregon, USA
copyright 1995, Sutherland HDL, Inc., all rights reserved. Permission is granted to use this document for personal purposes only.$nbsp; You may not reproduce or distribute any portion of this document by any means without first obtaining permission from Sutherland HDL, Inc.
Professionally printed copies of this reference guides are available for purchase. See
www.sutherland-hdl.com for details.
Verilog HDL constructs that represent hierarchy scope are:
![]() | Module definitions |
![]() | Function definitions |
![]() | Task definitions |
![]() | Named statement blocks ( begin - end or fork - join ) |
![]() | Specify blocks |
Each scope has its own name space. An identifier name defined within a scope is unique to that scope. References to an identifier name will search first in the local scope, and then search upward through the scope hierarchy up to a module boundary.
The following Verilog HDL constructs are independent processes that are evaluated
concurrently in simulation time:
![]() | Module instances |
![]() | Primitive instances |
![]() | Continuous assignments |
![]() | Procedural blocks |
always and assign attribute begin buf bufif0 bufif1 case casex casez cmos deassign default defparam disable edge else end endattribute endcase endfunction |
endmodule endprimitive endspecify endtable endtask event for force forever fork function highz0 highz1 if ifnone initial inout input integer join medium module |
large macromodule nand negedge nmos nor not notif0 notif1 or output parameter pmos posedge primitive pull0 pull1 pulldown pullup rcmos real realtime |
reg release repeat rnmos rpmos rtran rtranif0 rtranif1 scalared signed small specify specparam strength strong0 strong1 supply0 supply1 table task time tran |
tranif0 tranif1 tri tri0 tri1 triand trior trireg unsigned vectored wait wand weak0 weak1 while wire wor xnor xor |
blanks, tabs, newlines (carriage return), formfeeds and EOF (end-of-file).
//
begins a single line comment, terminated
by a newline.
/*
begins a multi-line comment, terminated by
a */
.
Verilog is case sensitive.
![]() | Must begin with alphabetic or underscore characters a -z A -Z _ |
![]() | May contain the characters a -z A -Z 0 -9 _ and $ |
![]() | May use any character by escaping with a backslash ( \ )
at the beginning of the identifier, and terminating with a white space. |
Examples |
Notes |
|
legal identifier name |
|
uppercase identifier is unique from xor keyword |
|
an escaped identifier (must be followed by a white space) |
The Verilog HDL has 4 logic values.
Logic Value |
Description |
|
zero, low, or false |
|
one, high, or true |
|
high impedance (tri-stated or floating) |
|
unknown or uninitialized |
The Verilog HDL has 8 logic strengths: 4 driving, 3 capacitive, and high impedance (no strength).
Strength Level |
Strength Name |
Specification Keyword |
Display Mnemonic |
||
7 |
Supply Drive |
|
|
|
|
6 |
Strong Drive |
|
|
|
|
5 |
Pull Drive |
|
|
|
|
4 |
Large Capacitive |
|
|
|
|
3 |
Weak Drive |
|
|
|
|
2 |
Med. Capacitive |
|
|
|
|
1 |
Small Capacitive |
|
|
|
|
0 |
High Impedance |
|
|
|
|
Syntax |
|
size' base value |
Sized integer in a specific radix (base) |
![]() | size (optional) is the number of bits in the number. Unsized integers default to at least 32-bits. |
![]() | ' base
(optional) represents the radix. The default base is decimal. |
Base |
Symbol |
Legal Values |
binary |
or B |
0, 1, x, X, z, Z, ?, _ |
octal |
or O |
0-7, x, X, z, Z, ?, _ |
decimal |
or D |
0-9, _ |
hexadecimal |
or H |
0-9, a-f, A-F, x, X, z, Z, ?, _ |
![]() | The ? is another way of representing the Z logic value. |
![]() | An _ (underscore) is ignored (used to enhance
readability). |
![]() | Values are expanded from right to left (lsb to msb). |
![]() | When size is less than value, the upper bits are truncated. |
![]() | When size is larger than value, and the left-most bit of value is 0 or 1, zeros are left-extended to fill the size. |
![]() | When size is larger than value, and the left-most bit of value is Z or X, the Z or X is left-extended to fill the size. |
Examples |
Size |
Base |
Binary Equivalent |
|
unsized |
decimal |
0...01010 (32-bits) |
|
unsized |
octal |
0...00111 (32-bits) |
|
1 bit |
binary |
1 |
|
8 bits |
hex |
11000101 |
|
6 bits |
hex |
110000 (truncated) |
|
6 bits |
hex |
001111 (zero filled) |
|
6 bits |
hex |
ZZZZZZ (Z filled) |
Syntax |
|
value. value |
decimal notation |
baseE exponent |
scientific notation (the E is
not case sensitive) |
![]() | Real numbers are limited to the values 0-9 and underscore. |
![]() | There must be a value on either side of the decimal point. |
Examples |
Notes |
|
must have value on both sides of decimal point |
|
3 times 104 (30000) |
|
5.8 times 10-3 (0.0058) |
Verilog HDL models are represented as modules.
Syntax |
Implicit Internal Connection module_name ( port_name, port_name, ... );
|
Explicit Internal Connection module_name
(. port_name ( signal_name ), . port_name ( signal_name ), ... );
|
![]() | Implicit internal connections connect the port to an internal net or register of the same name. |
![]() | Explicit internal connections connect the port to an internal signal with a different name, or a bit select, part select, or concatenation of internal signals. |
![]() | The keyword macromodule is a synonym for module . Some EDA tools may optimize tool execution
performance by flattening macromodule hierarchy. |
![]() | module_items are: |
![]() | module_port_declarations |
![]() | data_type_declarations |
![]() | module_instances |
![]() | primitive_instances |
![]() | procedural_blocks |
![]() | continuous_assignments |
![]() | task_definitions |
![]() | function_definitions |
![]() | specify_blocks |
![]() | Behavioral - modeled with procedural blocks or continuous assignment statements. |
![]() | Structural - modeled as a netlist of module instances or primitive instances. |
![]() | A combination of behavioral and structural. |
Syntax |
port_direction [ port_size] port_name, port_name, ... ; |
port_direction is
declared as:
![]() | input for scalar or vector input ports. |
![]() | output for scalar or vector output ports. |
![]() | inout for scalar or vector bi-directional
ports. |
port_size is a range from [
msb :
lsb ]
(most-significant-bit to least-significant-bit).
![]() | The msb and lsb must be literal integers, integer parameters, or an expression that resolves to an integer constant. |
![]() | Either little-endian convention (the lsb is the smallest bit number) or big-endian convention (the lsb is the largest bit number) may be used. |
![]() | The maximum port size may be limited, but will be at least 256 bits. |
Examples |
Notes |
input a,b,sel; |
3 scalar ports |
output [7:0] result; |
little endian convention |
inout [0:15] data_bus; |
big endian convention |
input [15:12] addr; |
msb:lsb may be any integer |
parameter word = 32; |
constant expressions may be used |
Syntax |
register_type [ size] variable_name
, variable_name
, ... ; |
register_type [ size] memory_name
[ array_size]; |
net_type [ size] #( delay) net_name , net_name , ... ; |
net_type ( drive_strength) [ size] #( delay) net_name = continuous_assignment
; |
trireg ( capacitance_strength) [size] #( delay, decay_time) net_name, net_name, ... ; |
parameter constant_name = value, constant_name = value, ... ; |
specparam constant_name = value, constant_name = value, ... ; |
event event_name, event_name, ... ; |
delay (optional) may only be specified on net data types. The syntax is the same as primitive delays.
size is a range from [
msb :
lsb]
(most-significant-bit to least-significant-bit).
![]() | The msb and lsb must be integers, integer parameters or an expression that resolves to an integer constant. |
![]() | Either little-endian convention (the lsb is the smallest bit number) or big-endian convention (the lsb is the largest bit number) may be used. |
![]() | The maximum vector size is at least 65,536 bits (216). |
array_size is from [
first_address :
last_address]
.
first_address and last_address
must be integers, integer parameters, or an expression that resolves to integer.
![]() | Either ascending or descending address order may be used. |
![]() | The maximum array size is at least 16,777,216 words (224). |
strength (optional) is
specified as (
strength1,
strength0)
or (
strength0,
strength1)
. See Logic Strengths for keywords.
decay_time (optional)
specifies the amount of time a trireg net will store a charge after all drivers turn-off,
before decaying to logic X. The syntax is (
rise_delay,
fall_delay,
decay_time)
. The
default decay is infinite.
Keyword |
Functionality |
|
unsigned variable of any bit size |
|
signed 32-bit variable |
|
unsigned 64-bit variable |
|
double-precision floating point variable |
Register data types are used as variables in procedural blocks.
![]() | Registers store logic values only (no logic strength). |
![]() | A register data type must be used when the signal is on the left-hand side of a procedural assignment. |
Keyword |
Functionality |
wire or tri |
Simple interconnecting wire |
wor or trior |
Wired outputs OR together |
wand or triand |
Wired outputs AND together |
tri0 |
Pulls down when tri-stated |
tri1 |
Pulls up when tri-stated |
supply0 |
Constant logic 0 (supply strength) |
supply1 |
Constant logic 1 (supply strength) |
trireg |
Stores last value when tri-stated (capacitance strength) |
Net data types connect structural components together.
![]() | Nets transfer both logic values and logic strengths. |
![]() | A net data type must be used when: |
![]() | A signal is driven by the output of some device. |
![]() | A signal is also declared as an input port or inout port. |
![]() | A signal is on the left-hand side of a continuous assignment. |
Other Types |
Functionality |
|
Run-time constant for storing integers, real numbers, time, delays, or ASCII strings. Parameters may be redefined for each instance of a module. |
|
Specify block constant for storing integers, real numbers, time, delays or ASCII strings |
|
A momentary flag with no logic value or data storage. Often used for synchronizing concurrent activities within a module. |
Data Type Examples |
Notes |
wire a, b, c; |
3 scalar nets |
tri1 [7:0] data_bus; |
8-bit net, pulls-up when tri-stated |
reg [1:8] result; |
an 8-bit unsigned variable |
reg [7:0] RAM [0:1023]; |
a memory array; 8-bits wide, with 1K of addresses |
wire #(2.4,1.8) carry; |
a net with rise, fall delays |
wire (strong1,pull0) sum = a+b; |
net with drive strength and a continuous assignment |
trireg (small) #(0,0,35) ram_bit; |
net with small capacitance and 35 time unit decay time |
Syntax |
Port Order Connections module_name instance_name
|
Port Name Connections module_name instance_name
|
Explicit Parameter Redefinition
|
Implicit Parameter Redefinition module_name |
A module may be instantiated using port order or port names.
![]() | Port order instantiation lists signal connections in the same order as the port list in the module definition. Unconnected ports are designated by two commas with no signal listed. |
![]() | Port name instantiation lists the port name and signal connected to it, in any order. |
instance_name (required) is used to make multiple instances of the same module unique from one another.
instance_array_range
(optional) instantiates multiple modules, each instance connected to separate bits of a
vector.
![]() | The range is specified as [ lhi: rhi]
(left-hand-index to right-hand-index). |
![]() | If the bit width of a module port in the array is the same as the width of the signal connected to it, the full signal is connected to each instance of the module port. |
![]() | If the bit width of a module port is different than the width of the signal connected to it, each module port instance is connected to a part select of the signal, with the right-most instance index connected to the right-most part of the vector, and progressing towards the left. |
![]() | There must be the correct number of bits in each signal to connect to all instances (the signal size and port size must be multiples). |
Parameters in a module may be redefined for each instance.
![]() | Explicit redefinition uses a defparam
statement with the parameter's hierarchical name. |
![]() | Implicit redefinition uses the # token as part
of the module instantiation. Parameters must be redefined in the same order they are
declared within the module. |
Module Instance Examples |
module reg4 (q, d, clock); output [3:0] q; input [3:0] d; input clock; wire [3:0] q, d; wire clock; //port order connection,2nd port not connected dff u1 (q[0], , d[0], clock); //port name connection, qb not connected dff u2 (.clk(clock),.q(q[1]),.data(d[1])); //explicit parameter redefine dff u3 (q[2], ,d[2], clock); defparam u3.delay = 3.2; //implicit parameter redefine dff #(2) u4 (q[3], , d[3], clock); endmodule |
module dff (q, qb, data, clk); output q, qb; input data, clk; parameter delay = 1; //default delay parameter dff_udp #(delay) (q, data, clk); not (qb, q); endmodule |
Array of Instances Example |
module tribuf64bit (out, in, enable); output [63:0] out; input [63:0] in; input enable; wire [63:0] out, in; wire enable; //array of 8 8-bit tri-state buffers; each instance is connected //to 8-bit part selects of the 64-bit vectors; The scalar //enable line is connected to all instances tribuf8bit i[7:0] (out, in, enable); endmodule |
module tribuf8bit (out, in, enable); output [7:0] y; input [7:0] a; input en; wire [7:0] y, a; wire en; //array of 8 Verilog tri-state primitives each bit of the //vectors is connected to a different primitive instance bufif1 u[7:0] (y, a, en); endmodule |
Syntax |
gate_type ( drive_strength) #( delay) instance_name [ instance_array_range] ( terminal, terminal, ... ); |
switch_type #( delay) instance_name [ instance_array_range]
( terminal, terminal, ... ); |
Terminal Order |
||
and |
nand xnor |
(1_output, 1-or-more_inputs) |
buf |
not |
(1-or-more_outputs, 1_input) |
bufif0 |
notif0 |
(1_output, 1_input, 1_control) |
pullup |
pulldown |
(1_output) |
user-defined-primitives | (1_output, 1-or-more_inputs) |
Terminal Order |
||
pmos |
rpmos |
(1_output, 1_input, 1_control) |
cmos |
rcmos |
(1_output, 1_input, n_control, p_control) |
tran |
rtran |
(2_bidirectional-inouts) |
tranif0 |
rtranif1 |
(2_bidirectional-inouts, 1_control) |
# delay or #( delay) Single delay for all output transitions |
#( delay, delay) Separate delays for (rising, falling) transitions |
#( delay, delay,
delay) Separate delays for (rising, falling, turn-off) transitions |
#( min_delay: typ_delay: max_delay) Minimum to maximum range of delays for all transitions |
#( min_delay: typ_delay: max_delay, min_delay: typ_delay: max_delay) Min. to max. range of delays for (rising, falling) transitions |
#( min_delay: typ_delay: max_delay, min_delay: typ_delay: max_delay, min_delay: typ_delay: max_delay) Min. to max. range of delays for (rising, falling, turn-off) transitions |
delay (optional) represents the propagation delay through a primitive. The default delay is zero. Integers or real numbers may be used.
strength (optional) is
specified as (
strength1,
strength0)
or (
strength0,
strength1)
Refer
to Logic Strengths for strength keywords.
![]() | Only gate primitives may have drive strength specified. Switch primitives pass the input strength to the output. Resistive switches reduce the strength as it passes through. |
instance_name (optional) may used to reference specific primitives in debugging tools, schematics, etc.
instance_array_range
(optional) instantiates multiple primitives, each instance connected to separate bits of a
vector.
![]() | The range is specified as [ lhi: rhi]
(left-hand-index to right-hand-index). |
![]() | The primitive instances are connected with the right-most instance index connected to the right-most bit of each vector, and progressing towards the left. |
![]() | Vector signals must be the same size as the array. |
![]() | Scalar signals are connected to all instances in the array. |
Primitive Instance Examples |
Notes |
and i1 (out,in1,in2); |
zero delay gate primitive |
and #5 (o,i1,i2,i3,i4); |
same delay for all transitions |
not #(2,3) u7(out,in); |
separate rise & fall delays |
buf (pull0,strong1)(y,a); |
output drive strengths model ECL |
wire [31:0] y, a; |
array of 32 buffers |
Syntax |
type_of_block |
type_of_block is
either initial
or always
![]() | initial procedural blocks process statements
one time. |
![]() | always procedural blocks process statements
repeatedly. |
sensitivity_list (optional) is an event timing control that controls when all statements in the procedural block will start to be evaluated. The sensitivity list is used to model combinational and sequential logic behavior.
statement_group--end_of_statement_group is used to group two
or more procedural statements together and control the execution order.
![]() | begin --end
groups two or more statements together sequentially, so that statements are evaluated in
the order they are listed. Each timing control is relative to the previous statement. |
![]() | fork --join
groups two or more statements together in parallel, so that all statements are evaluated
concurrently. Each timing control is absolute to when the group started. |
group_name (optional)
creates a local scope in a statement group. Named groups may have local variables, and may
be disabled with the disable
keyword.
local_variable_declarations (optional) must be a register data type (may only be declared in named statement groups).
timing_control is used to control when statements in a procedural block are executed. Refer to Procedural Timing
procedural_statement is a procedural assignment to a register variable or a programming statement.
Procedural Block Examples |
Notes |
initial fork bus = 16'h0000; #10 bus = 16'hC5A5; #20 bus = 16'hFFAA; join |
initial procedure executes statements one time; The fork--join group places statements in parallel. |
always @(a or b or ci) begin sum = a + b + ci; end |
always procedure executes statements repeatedly. |
always @(posedge clk) q <= data; |
a statement group is not required when there is only one statement |
#
delay@(
edge signal or
edge signal or
... )
![]() | edge (optional) maybe either posedge
or negedge . If no edge is specified, then any
logic transition is used. |
![]() | or is used to specify events on any of several
signals. |
![]() | signal may be scalar or vector, and any data type. |
wait (
expression)
=
expression;begin--end
sequential
statement group, execution of the next statement is blocked until the assignment is
complete. In the sequence begin m=n; n=m; end
,
the 1st assignment changes m before the 2nd assignment evaluates m.<=
expression;begin--end
sequential statement group, execution of
the next statement is not blocked; and may be evaluated before the assignment is complete.
In the sequence begin m<=n; n<=m; end
, both
assignments will be evaluated before m or n changes.=
expression;<=
expression;=
timing_control expression;<=
timing_control expression;assign
register_data_type
=
expression;deassign
register_data_type;force
net_or_register_data_type
=
expression;release
net_or_register_data_type;if (
expression)
statement or statement_group
if (
expression) statement or statement_groupelse
statement or statement_group
case (
net_or_register_or_literal) case_match1: statement or statement_group case_match2, case_match3: statement or statement_groupdefault:
statement or statement_groupendcase
casez (
net_or_register_or_literal)casex (
net_or_register_or_literal)forever
statement or statement_grouprepeat (
number) statement or statement_groupwhile (
expression) statement or statement_groupfor (
initial_assignment; expression; step_assignment) statement or statement_group![]() | Executes initial_assignment once when the loop starts. |
![]() | Executes the statement or statement group as long as the expression evaluates as true. |
![]() | Executes the step_assignment at the end of each pass through the loop. |
disable
group_name;Procedural Statement Examples |
//A 50 ns clock oscillator that starts after 1000 time units initial begin clk = 0; #1000 forever #25 clk = ~clk; end |
//sensitivity list models sequential logic always @(posedge clk) begin //Non-blocking assignments avoid race conditions in the byte swap word[15:8]<= word[7:0]; word[7:0] <= word[15:8]; end |
//sensitivity list models combinational logic always @(a or b or sel) if (sel==0) y = a + b; else y = a * b; |
//sensitivity list models sequential logic always @(posedge clk) begin casez (opcode) //casez makes Z a don't care //? in literal integer is same as Z 2'b1??: alu_out = accum; 2'b000: while (bloc_xfer) //loop until false repeat (5) @(posedge clk) begin //loop 5 clock cycles RAM[address] = data_bus; address = address + 1; end 3'b011: begin : load //named group integer i; //local variable for (i=0; i<=255; i=i+1) @(negedge clk) data_bus = RAM[i]; end default: $display("illegal opcode"); endcase end |
Operators perform an operation on one or two operands:
![]() | Unary expressions |
Usage |
Description |
|
Arithmetic Operators |
||
|
m + n |
Add n to m |
|
m - n |
Subtract n from m |
|
-m |
Negate m (2's complement) |
|
m * n |
Multiply m by n |
|
m / n |
Divide m by n |
|
m % n |
Modulus of m / n |
Bitwise Operators |
||
|
~m |
Invert each bit of m |
|
m & n |
AND each bit of m with each bit of n |
|
m | n |
OR each bit of m with each bit of n |
|
m ^ n |
Exclusive OR each bit of m with n |
|
m ~^ n |
Exclusive NOR each bit of m with n |
Unary Reduction Operators |
||
|
&m |
AND all bits in m together (1-bit result) |
|
~&m |
NAND all bits in m together (1-bit result) |
|
|m |
OR all bits in m together (1-bit result) |
|
~|m |
NOR all bits in m together (1-bit result) |
|
^m |
Exclusive OR all bits in m (1-bit result) |
|
~^m |
Exclusive NOR all bits in m (1-bit result) |
Logical Operators |
||
|
!m |
Is m not true? (1-bit True/False result) |
|
m && n |
Are both m and n true? (1-bit True/False result) |
|
m || n |
Are either m or n true? (1-bit True/False result) |
Equality Operators (compares logic values of 0 and 1 |
||
|
m == n |
Is m equal to n? (1-bit True/False result) |
|
m != n |
Is m not equal to n? (1-bit True/False result) |
Identity Operators (compares logic values of 0, 1, X and Z |
||
|
m === n |
Is m identical to n? (1-bit True/False results) |
|
m !== n |
Is m not identical to n? (1-bit True/False result) |
Relational Operators |
||
|
m < n |
Is m less than n? (1-bit True/False result) |
|
m > n |
Is m greater than n? (1-bit True/False result) |
|
m <= n |
Is m less than or equal to n? (True/False result) |
|
m >= n |
Is m greater than or equal to n? (True/False result) |
Logical Shift Operators |
||
|
m << n |
Shift m left n-times |
|
m >> n |
Shift m right n-times |
Miscellaneous Operators |
||
|
sel?m:n |
If sel is true, select m: else select n |
|
{m,n} |
Concatenate m to n, creating larger vector |
|
{n{m}} |
Replicate m n-times |
|
-> m |
Trigger an event on an event data type |
Operator Precedence |
|
! ~ + -(unary)
* / %
+ - (binary)
<< >>
< <= > >=
== != === !==
& ~&
^ ~^
| ~|
&&
||
?:
|
highest precedence lowest precedence |
Syntax |
Explicit Continuous Assignment net_type |
Implicit Continuous Assignment |
![]() | Explicit continuous assignments require two statements: one to declare the net, and one to continuously assign a value to it. |
![]() | Implicit continuous assignments combine the net declaration and continuous assignment into one statement. |
![]() | net_type may be any of the net data types except trireg. |
![]() | strength (optional) may only be specified when the continuous assignment is combined with a net declaration. The default strength is (strong1, strong0). |
![]() | delay (optional) follows the same syntax as primitive delays. The default is zero delay. |
![]() | expression may include any data type, any operator, and calls to functions. |
![]() | Continuous assignments model combinational logic. Each time a signal changes on the right-hand side, the right-hand side is re-evaluated, and the result is assigned to the net on the left-hand side. |
![]() | Continuous assignments are declared outside of procedural blocks. They automatically become active at time zero, and are evaluated concurrently with procedural blocks, module instances, and primitive instances. |
Continuous Assignment Examples |
//A 32-bit wide 2:1 MUX wire [31:0] mux_out; assign mux_out = sel? a : b; |
//A 16-bit wide tri-state buffer with delay tri [0:15] #2.8 buf_out = en? in: 16'bz; |
//A 64-bit ALU with ECL output strengths wire [63:0] (strong1,pull0) alu_out = alu_function(opcode,a,b); |
Syntax |
|
Tasks are subroutines.
![]() | May have any number of inputs, outputs or inouts. |
![]() | May contain timing controls (#, @, or wait). |
Example of a Task |
task read_mem; //TASK DEFINITION input [15:0] address; //declaration order output [31:0] data; // determines order begin // of arguments when read_request = 1; // task is called wait (read_grant) addr_bus = address; data = data_bus; #5 addr_bus = 16'bz; read_request = 0; end endtask |
read_mem(PC, IR); //TASK CALL |
Syntax |
|
Functions return the value that is assigned to the function name.
![]() | Must have at least one input; may not have outputs or inouts. |
![]() | May not contain timing controls (#, @, or wait). |
![]() | size_or_type
(optional) is the return bit range as [ msb: lsb] ,
or the keywords integer or real. The default size is 1-bit. |
Example of a Function |
function [7:0] GetByte; //FUNCTION DEFINITION input [63:0] Word; //declaration order input [3:0] ByteNum; //determines order integer Bit; //of arguments when reg [7:0] temp; //called begin for (Bit=0; Bit<=7; Bit=Bit+1) temp[Bit] = Word[((ByteNum-1)*8)+Bit]; GetByte = temp; //A function returns end // the value assigned endfunction // to its name |
this_byte = GetByte(data,4); //FUNCTION CALL |
Syntax |
|
specparam
param_name
=
value,
param_name =
value,
...;
![]() | specparams are constants used to store delays, delay calculation factors, synthesis factors, etc. |
![]() | value may be interger, real, delay, or quoted string. |
Timing constraint checks are system tasks that model restrictions on input changes, such as setup times and hold times.
Timing Check Syntax |
$setup( data_event, reference_event, setup_limit, notifier); $hold( reference_event, data_event, hold_limit, notifier); $setuphold( reference_event, data_event, setup_limit, hold_limit, notifier); $skew( reference_event, data_event, skew_limit, notifier); $recovery( reference_event, data_event, limit,
notifier); $period( reference_event, period_limit, notifier); $width( reference_event, width_limit, width_threshold, notifier); |
![]() | Timing checks may only be used in specify blocks. |
![]() | The reference_event is and edge of an input signal that establishes a reference point for changes on the data event. |
![]() | The data_event is the input signal that is monitored for changes. |
![]() | The data_event and reference_event signals must be module input ports. |
![]() | The limit and threshold are delay values and use the same syntax as single primitive delays. |
![]() | The notifier (optional) is a reg variable used as a flag. When a timing violation occurs, the model functionality can use the notifier flag to modify the model outputs. |
![]() | Simple path delay statement: |
![]() | Edge-sensitive path delay: |
![]() | edge (optional) may be either posedge or negedge. If not specified, all input transitions are used. |
![]() | source (optional) is the input port or value the output will receive. The source is ignored by most logic simulators, but may be used by timing analyzers. |
![]() | Allows different delays for the same path to be specified, based on other input conditions. |
![]() | condition may only be based on input ports. |
![]() | Most operators may be used with the condition, but should resolve to true/false (a logic X or Z is considered true; if the condition resolves to a vector, only the lsb is used). |
![]() | Each state-dependent delay for the same path must have a different condition or a different edge-sensitive edge. |
![]() | The ifnone condition (optional) may only be a simple path delay, and serves as a default if no other condition evaluates as true. |
![]() | Full connection path delay indicates every input bit may have a delay path to every output bit. |
![]() | Parallel connection path delay indicates each input bit is connected to its corresponding output bit (bit 0 to bit 0, bit 1 to bit 1, ...) |
Delays |
Transitions represented (in order) |
1 |
all output transitions |
2 |
rise, fall output transitions |
3 |
rise, fall, turn-off output transitions |
6 |
rise, fall, 0->Z, Z->1, 1->Z, Z->0 |
12 |
rise, fall, 0->Z, Z->1, 1->Z, Z->0, 0->X, X->1, 1->X, X->0, X->Z, Z->X |
Specify Block Examples |
Notes |
(a => b) = 1.8; |
parallel connection path; one delay for all output transitions |
(a -*> b) = 2:3:4; |
full connection path; one min:typ:max delay range for all output transitions; b receives the inverted value of a |
specparam t1 = 3:4:6, t2 = 2:3:4; (a => y) = (t1,t2); |
different path delays for rise, fall transitions |
(a *> y1,y2) = (2,3,4,3,4,3); |
different delays for 6 output transitions |
(posedge clk => (qb -: d)) = (2.6, 1.8); |
edge-sensitive path delay; timing path is positive edge of clock to qb; qb receives the inverted value of data |
if (rst && pst) (posedge clk=>(q +:
d))=2; |
state-dependent edge sensitive path delay |
if (opcode = 3'b000) (a,b *> o) = 15; if (opcode = 3'b001) (a,b *> o) = 25; ifnone (a,b *> o) = 10; |
state-dependent path delays; an ALU with different delays for certain operations (default delay has no condition) |
Syntax |
primitive primitive_name (output, input, input, ... ); output terminal_declaration; input terminal_declaration; reg output_terminal; initial output_terminal = logic_value; table table_entry; table_entry; endtable endprimitive |
User Defined Primitives define new primitives, which are used exactly the same as
built-in primitives.
![]() | All terminals must be scalar (1-bit). |
![]() | Only one output is allowed, which must be the first terminal. |
![]() | The maximum number of inputs is at least 9 inputs for a sequential UDP and 10 inputs for a combinational UDP. |
![]() | Logic levels of 0, 1, X and transitions between those values may be represented in the table. The logic value Z is not supported with UDPs. |
![]() | reg declaration (optional) defines a sequential UDP by creating internal storage. Only the output may be a reg. |
![]() | initial (optional) is used to define the initial (power-up) state for sequential UDP's. Only the logic values 0, 1, and X may be used. The default state is X. |
input_logic_values :
output_logic_value ;
![]() | Combinational logic table entry. Only logic level values may be specified (0, 1, X and don't care). |
input_logic_values :
previous_state :
output_logic_value ;
![]() | Sequential logic table entry. May only be used when the output is also declared as a reg data type. Both input logic level and input logic transition values may be specified. |
![]() | A white space must separate each input value in the table. |
![]() | The input values in the table must be listed in the same order as the terminal list in the primitive statement. |
![]() | Any combination of input values not specified in the table will result in a logic X (unknown) value on the output. |
![]() | Only one signal may have an edge transition specified for each entry in the table. |
![]() | If an edge transition is specified for one input, the UDP becomes sensitive to transitions on all inputs. Therefore, all other inputs must have table entries to cover transitions, or when the transition occurs the UDP will output an X. |
![]() | Level sensitive table entries have precedence over edge sensitive table entries. |
Truth Table Symbol |
Definition |
|
logic 0 on input or output |
|
logic 1 on input or output |
|
unknown on input or output |
|
no change on output (may only be used with sequential UDPs) |
|
don't care if an input is 0, 1, or X |
|
don't care if and input is 0 or 1 |
|
input transition from logic v to
logic w e.g.: (01) represents transition from 0 to 1 |
|
rising input transition: same as (01) |
|
falling input transition: same as (10) |
|
positive input transition: (01) ,
(0X) or (X1) |
|
negative input transition: (10) ,
(1X) or (X0) |
|
any possible input transition: same as (??) |
UDP Examples |
primitive mux (y, a, b, sel); //COMBINATIONAL UDP output y; input sel, a, b; table //table order for inputs matches primitive statement // a b sel : y 0 ? 0 : 0; //select a; don't care about b 1 ? 0 : 1; //select a; don't care about b ? 0 1 : 0; //select b; don't care about a ? 1 1 : 1; //select b; don't care about a endtable endprimitive |
primitive dff (q,d,clk,rst); //SEQUENTIAL UDP output q; input clk, rst, d; reg q; //declaring output as reg defines //sequential device with an internal //storage state initial q = 0; //powers up in reset state table // d clk rst:state:q ? ? 0 : ? :0; //low true reset 0 R 1 : ? :0; //clock in a 0 1 R 1 : ? :1: //clock in a 1 ? N 1 : ? :-; //ignore negedge of clk * ? 1 : ? :-; //ignore all edges on d ? ? P : ? :-; //ignore posedge of rst 0 (0X) 1 : 0 :-; //reduce pessimism 1 (0X) 1 : 1 :-; //reduce pessimism endtable endprimitive |
Following is a list of Verilog HDL constructs supported by most synthesis tools.
![]() | This list is not specific to any one tool - each synthesis tool supports a unique subset of the Verilog language. |
![]() | The constructs listed in this section represent a subset of the Verilog HDL that are supported by most synthesis tools. |
![]() | Verilog constructs not listed in this section may be supported by some synthesis tools - refer to the specific synthesis tool documentation. |
Verilog HDL Constructs |
Notes |
||||||||
module declarations | both module and macromodule keywords fully supported | ||||||||
port declarationsinput output inout |
fully supported; any vector size supported | ||||||||
net data typeswire wand wor |
scalars and vectors fully supported | ||||||||
register data typesreg integer |
register variables:
|
||||||||
parameter constants | limited to integers; parameter redefinition may not be supported | ||||||||
module instances | fully supported; both port order and port name instantiation supported | ||||||||
primitive instancesand nand or nor |
only gate primitives are supported | ||||||||
assign continuous assignment |
fully supported; both explicit and implicit forms supported | ||||||||
function definitions | may only use supported constructs; must be defined before being referenced | ||||||||
task definitions | may only use supported constructs; must be defined before being referenced | ||||||||
always procedural block |
must have a sensitivity list | ||||||||
begin--end statement groups |
fully supported; named and unnamed blocks supported | ||||||||
disable statement group |
must be used within the same named block that is being disabled | ||||||||
= blocking procedural assignment<= non-blocking procedural assignment |
fully supported; may be restricted to using only one type of assignment for all assignments to the same register variable | ||||||||
assign procedural continuous
assignment |
fully supported; the deassign keyword may not be supported | ||||||||
integer values | fully supported; all sizes and bases | ||||||||
if if-else decision statements |
logic X and Z only supported as don't care bits | ||||||||
for loops |
the step assignment must be an increment or decrement (+ -) | ||||||||
while loopsforever loops |
loop must take one clock cycle for each loop cycle (i.e.: an @(posedge clk) or @(negedge clk) must be within the loop) | ||||||||
operators& ~& | ~| ^ ^~ ~^ |
operands may be:
|
||||||||
vector bit selects vector part selects |
fully supported on the right-hand side of an assignment; restricted to constant bit or part selects on the left-hand side of an assignment |
EDA tool vendors and tool users may define tasks and functions specific to their tool,
such as text output or waveform displays.
![]() | System tasks and functions begin with the $ (dollar sign). |
![]() | Users may define additional built-in tasks and functions using the Verilog Programming Language Interface (PLI). |
![]() | A few of the most common system tasks and functions are listed in this section. |
Text Formatting Codes |
|||
%b %o %d %h %e %f %t |
binary values octal values decimal values hex values real values-exponential real values-decimal formatted time values |
%s %m \t \n \" \\ %% |
character strings hierarchical names print a tab print a newline print a quote print a backslash print a percent sign |
A zero in format codes (e.g.: %0d) displays the value using the minimum field width required. The %e and %f may specify the field width for both sides of the decimal point (e.g.: %5.2f) |
$monitor("
text_with_format_specifiers",
signal,
signal,
... );
$display("
text_with_format_specifiers",
signal,
signal,
... );
$write("
text_with_format_specifiers",
signal,
signal,
... );
$strobe("
text_with_format_specifiers",
signal,
signal,
... );
=
$fopen("
file_name");
$fclose(
mcd);
$monitor(
mcd,
"
text_with_format_specifiers",
signal,
signal,
... );
$display(
mcd,
"
text_with_format_specifiers",
signal,
signal,
... );
$write(
mcd,
"
text_with_format_specifiers",
signal,
signal,
... );
$strobe(
mcd,
"
text_with_format_specifiers",
signal,
signal,
... );
$time
$stime
$realtime
$timeformat(
unit,
precision,
"
suffix",
min_field_width);
![]() | unit is the base that time is to be displayed in, from 0 to -15 |
![]() | precision is the number of decimal points to display. |
![]() | suffix is a string appended to the time, such as " ns". |
![]() | min_field_width is the minimum number of characters that will be displayed. |
|
|
|
|
|
$printtimescale(
module_hierarchical_name);
$random(
seed);
$readmemb("
file_name",
register_array,
start,
end);
$readmemh("
file_name",
register_array,
start,
end);
$finish;
$stop;
Compiler directives provide a method for EDA tool vendors to control how their tool
will interpret Verilog HDL models.
![]() | Compiler directives begin with the grave accent character ( ` ). |
![]() | Compiler directives are not Verilog HDL statements; there is no semi-colon at the end of compiler directives. |
![]() | Compiler directives are not bound by modules or by files. When a tool encounters a compiler directive, the directive remains in effect until another compiler directive either modifies it or turns it off. |
![]() | A few of the most common compiler directives are listed in this section. |
`reset_all
`timescale
time_unit
base /
precision
base![]() | time_unit is the amount of time a delay of 1
represents. The time unit must be 1 10 or 100 |
![]() | base is the time base for each unit, ranging from
seconds to femtoseconds, and must be: s ms us ns ps
or fs |
![]() | precision and base represent how many decimal points of precision to use relative to the time units. |
Note: There is no default timescale in Verilog; delays are simply relative numbers until a timescale directive declares the units and base the numbers represent.
`define
macro_name text_string`define
macro_name
(
arguments)
text_string (
arguments)
![]() | text_string will be substituted in place of the macro_name where ever the macro name is used. |
![]() | text_string is terminated by a carriage return. The string must be on one line. |
![]() | arguments are evaluated before text is substituted. |
![]() | macro_name must also be preceded by the grave accent
mark ( ` ) each time the macro name is used. |
![]() | Comments may be used. They are not substituted into the place of the macro name. |
`include "
file_name"
`ifdef
macro_name`else
`endif
`celldefine
`endcelldefine
`default_nettype
net_data_type`unconnected_drive pull1
`unconnected_drive pull0
`nounconnected_drive
`delay_mode_zero
`delay_mode_unit
`delay_mode_path
`delay_mode_distributed
`uselib file=
file
dir=
directory
libext=
extension
online Verilog HDL Quick Reference
Guide
by Stuart Sutherland of Sutherland HDL, Inc. - Portland, Oregon, USA
copyrighted material - do not reproduce
any portion by any means
professionally printed reference guides are available - see
www.sutherland.com for details