Bit-select
 Block Statements
 Built-in Primitives
 Case Statement
 Continuous Assignments
 Conversion Functions
 Compiler Directives
 Concatenations
 Conditional Operator
 Delays
 Disable Statement
 Edge Sensitive Path
 Expression Bit Length
 File I/O Functions
 Functions
 Identifiers
 If Statement
 Integer Constants
 Intra-assignment Timing Controls
 Keywords
 Loop Statements
 Memories
 min:typ:max Delays
 Module Declaration
 Module Instantiation
 Module Path Declaration
 Module Path Polarity
 Net Data Types
 Operators
 Parameters
 Part-select
 Probabilistic Distribution Functions
 Procedural Assignments
 Procedural Continuous Assignments
 Procedural Timing Control
 Range Specification
 Real Constants
 Register Data Types
 Simulation Time Functions
 Specify Block
 State Dependent Path
 Strengths
 Strings
 Structured Procedures
 UDP Declaration
 UDP Instantiation
 UDP State Table
 Value Change Dump (VCD) File
 Vectors

# Continuous Assignments

## Formal Definition

Continuous assignments are the most basic assignment in dataflow modeling. Continuous assignments are used to model in combinational logic. It drives values into the nets.

## Simplified Syntax

net [strength] [range] [delay] identifier = net or register ;

assign [strength] [delay] net = net or register ;

## Description

Continuous assignments provide a way of modeling combinational logic at a higher level of abstraction than Gate-Level logic. It allows the use of Boolean logic rather than gate connections.

The left-hand side of an assignment is a variable to which the right-side value is to be assigned and must be a scalar or vector net or concatenation of both. The right-hand side of an assignment, separated from the left-hand side by the equal (=) character, can be a net, a reg or any expression that evaluates a value including function calls.

Continuous assignments drive values into the nets whenever the right-hand side value changes, this means continuous assignments are always active and assignments occur whenever the right-hand side operands changes. It drives both vector and scalar.

Continuous assignments can be used in two ways: as the net declaration statement and as the continuous assignment statement.

In a continuous assignment statement, after the assign keyword (Example 1) the net is declared as the left-hand side and after the equal (=) character, the right-hand side is declared as an expression. The value of out changes whenever the values of operands In_1 or In_2 change.

Example 2 shows how to use continuous assignments with vectors. The left-hand side of an assignment is a vector net, while the right-hand side operands are vector registers.

The left-hand side of an assignment can also be a concatenation of nets. Example 3 describes this use.

Instead of the continuous assignment statement, the net declaration assignment can be used. This means that in the net declaration statement we can assign expressions that occur whenever right-hand side operands change. In this case, assign keyword is not used. Example 1can be described as shown in Example 4. In this case a net can be declared only once, therefore only one net declaration assignment can be made to a net.

An optional delay given to a continuous assignment specifies the time duration between the right-hand side operand value change and the assignment to the left-hand side. Delay specification can be used both in the continuous assignment statement and the net declaration statement (see Example 5 and Example 6).

Also optional is strength specification. Example 7 shows a way to specify strength in a continuous assignment. For more information about strength see the "Strength" chapter.

## Examples

Example 1

wire out;
assign out = In_A & In_B ;

Continuous assignment 'out' is a net. Both In_1 and In_2 are nets.

Example 2

Continuous assignment with range specification. Address_1 and address_2 are 8-bit vector registers.

Example 3

assign {c_out, sum[7:0]} = Data_A[7:0]+Data_B[7:0]+c_in;

Continuous assignment with concatenation.

Example 4

wire out = In_A & In_B ;

The net declaration assignment. Equivalent to Example 1.

Example 5

assign #25 out = In_A & In_B ;

Delay specification in the continuous assignment statement.

Example 6

wire #25 out = In_A & In_B ;

Delay specification in the net declaration assignment.

Example 7

assign (strong1, pull0) out = Data_A | Data_B ;

## Important Notes

• Continuous assignments cannot be used within initial or always blocks.

• Continuous assignment statements can be used on a net that has been previously declared

• Only one net declaration assignment can be used for a net.

• More than one continuous assignment statement can be made to a net.