Combinational Logic with assign

The verilog assign statement is typically used to continuously drive a signal of wire datatype and gets synthesized as combinational logic. Here are some more design examples using the assign statement.

Example #1 : Simple combinational logic

The code shown below implements a simple digital combinational logic which has an output wire z that is driven continuously with an assign statement to realize the digital equation.

The module combo gets elaborated into the following hardware schematic using synthesis tools and can be seen that the combinational logic is implemented with digital gates.

The testbench is a platform for simulating the design to ensure that the design does behave as expected. All combinations of inputs are driven to the design module using a for loop with a delay statement of 10 time units so that the new value is applied to the inputs after some time.

Example #2: Half Adder

The half adder module accepts two scalar inputs a and b and uses combinational logic to assign the outputs sum and carry bit cout . The sum is driven by an XOR between a and b while the carry bit is obtained by an AND between the two inputs.

Example #3: Full Adder

A full adder can be built using the half adder module shown above or the entire combinational logic can be applied as is with assign statements to drive the outputs sum and cout .

Example #4: 2x1 Multiplexer

The simple 2x1 multiplexer uses a ternary operator to decide which input should be assigned to the output c . If sel is 1, output is driven by a and if sel is 0 output is driven by b .

Example #5: 1x4 Demultiplexer

The demultiplexer uses a combination of sel and f inputs to drive the different output signals. Each output signal is driven by a separate assign statement. Note that the same signal is generally not recommended to be driven by different assign statements.

Example #6: 4x16 Decoder

Javatpoint Logo

Verilog Tutorial


Help Others, Please Share


Learn Latest Tutorials

Splunk tutorial


Tumblr tutorial

Reinforcement Learning

R Programming tutorial

R Programming

RxJS tutorial

React Native

Python Design Patterns

Python Design Patterns

Python Pillow tutorial

Python Pillow

Python Turtle tutorial

Python Turtle

Keras tutorial



Verbal Ability

Interview Questions

Interview Questions

Company Interview Questions

Company Questions

Trending Technologies

Artificial Intelligence

Artificial Intelligence

AWS Tutorial

Cloud Computing

Hadoop tutorial

Data Science

Angular 7 Tutorial

Machine Learning

DevOps Tutorial

B.Tech / MCA

DBMS tutorial

Data Structures

DAA tutorial

Operating System

Computer Network tutorial

Computer Network

Compiler Design tutorial

Compiler Design

Computer Organization and Architecture

Computer Organization

Discrete Mathematics Tutorial

Discrete Mathematics

Ethical Hacking

Ethical Hacking

Computer Graphics Tutorial

Computer Graphics

Software Engineering

Software Engineering

html tutorial

Web Technology

Cyber Security tutorial

Cyber Security

Automata Tutorial

C Programming

C++ tutorial

Control System

Data Mining Tutorial

Data Mining

Data Warehouse Tutorial

Data Warehouse

Javatpoint Services

JavaTpoint offers too many high quality services. Mail us on [email protected] , to get more information about given services.

Training For College Campus

JavaTpoint offers college campus training on Core Java, Advance Java, .Net, Android, Hadoop, PHP, Web Technology and Python. Please mail your requirement at [email protected] Duration: 1 week to 2 week

RSS Feed

verilog assign command

Collectives™ on Stack Overflow

Find centralized, trusted content and collaborate around the technologies you use most.

Q&A for work

Connect and share knowledge within a single location that is structured and easy to search.

When shall I use the keyword "assign" in SystemVerilog?

For example, what will happen here if I do not use the assign keyword:

toolic's user avatar

2 Answers 2

The general guidelines for synthesizable Verilog code are that you should only use the assign keyword for combinational logic, not for sequential logic like a DFF.

Your code example is from the IEEE Std 1800-2017, section 10.6.1 The assign and deassign procedural statements . That coding style, while legal, is not recommended for synthesizing a DFF. In fact, just below the code is this statement:

NOTE — The procedural assign and deassign constructs are under consideration for deprecation.

Essentially, you should not use assign inside the always block.

A more traditional code for a synthesizable DFF (with only an asynchronous reset) is:

There is no need for an assign , and it uses nonblocking ( <= ) assignments.

If you don't use the assign keywords in the example you posted, then q gets written on the next posedge clock with the value of d . The state of clear or preset has no lasting affect on the value of q . Normal procedural assignments are overwritten by procedural continuous assigments.

The synthesis style of dividing the synchronous and asynchronous behaviors of sequential logic into separate always blocks turned out to be unpopular with synthesis tools, and gradually lost all support. It conflicts with the style that requests that variables be written to from only a single always block. Also, people get confused between continuous assignments and procedural continuous assignments because they both use the assign keyword.

dave_59's user avatar

Your Answer

Sign up or log in, post as a guest.

Required, but never shown

By clicking “Post Your Answer”, you agree to our terms of service , privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged verilog system-verilog or ask your own question .

Hot Network Questions

verilog assign command

Your privacy

By clicking “Accept all cookies”, you agree Stack Exchange can store cookies on your device and disclose information in accordance with our Cookie Policy .

Assignment Statements 

Blocking assignment .

A blocking assignment evaluates the expression on its right hand side and then immediately assigns the value to the variable on its left hand side:

It is also possible to add delay to a blocking assignment. For example:

In this case, the expression on the right hand side is evaluated and the value is held for 10 units of time. During this time, the execution of the code is blocked in the middle of the assignment statement. After the 10 units of time, the value is stored in the variable on the left

Nonblocking Assignment 

A nonblocking assignment evaluates the expression on its right hand side without immediately assigning the value to the variable on the left. Instead the value is cached and execution is allowed to continue onto the next statement without performing the assignment. The assignment is deferred until the next blocking statement is encountered. In the example below, on the positive edge of clk the right-hand side of the first nonblocking assignment is evaluated and the value cached without changing a. Then the right-hand side of the second nonblocking assignment statement is evaluated is also cached without changing b. Execution continues until it returns to the event statement, once there the execution of the process blocks until the next positive edge of the clk. Just before the process blocks, the cached values finally assigned to the target variables. In this way, the following code swaps the values in a and b on every positive edge of clk:

Adding delay to nonblocking assignments is done as follows:

Using nonblocking assignment with delay in this manner is a way of implementing transport delay , as shown below:


Blocking versus Nonblocking Assignment 

Nonblocking statements allow you to schedule assignments without blocking the procedural flow. You can use the nonblocking procedural statement whenever you want to make several register assignments within the same time step without regard to order or dependence upon each other. It means that nonblocking statements resemble actual hardware more than blocking assignments.

Generally you would use nonblocking assignment whenever assigning to variables that are shared between multiple initial or always processes if the statements that access the variable could execute at the same time. Doing so resolves race conditions.

Blocking assignment is used to assign to temporary variables when breaking up large calculations into multiple assignment statements. For example:

Procedural Continuous Assignment 

Two types of continuous assignment are available in initial and always processes: assign and force .

The target of an assign statement must be a register or a concatenation of registers. The value is continuously driven onto its target and that value takes priority over values assigned in procedural assignments. Once a value is assigned with an assign statement, it can only be changed with another assign statement or with a force statement. Execution of deassign releases the continuous assignment, meaning that the value of the register can once again be changed with procedural assignments. For example, the following implements a D-type flip-flop with set and reset:

Assign statements are used to implement set and reset because they dominate over the non-blocking assignment used to update q upon positive edges of the clock c . If instead a simple procedural assignment were used instead, then a positive edge on the clock could change q even if r or s were high.

A force statement is similar to assign , except that it can be applied to both registers and nets. It overrides all other assignments until the release statement is executed. Force is often used in testbenches to eliminate initial x-values in the DUT or to place it in a particular state. For example:

Something went wrong. Wait a moment and try again.

Global training solutions for engineers creating the world's electronics


KnowHow Free Technical Resources

Find a training course, wire assignments.

A wire can be declared and continuously assigned in a single statement - a wire assignment. This is a shortcut which saves declaring and assigning a wire separately. There are no advantages or disadvantages between the two methods other than the obvious difference that wire assignments reduce the size of the text.

Later on we will discuss delays on assignments and wires. A delay in a wire assignment is equivalent to a delay in the corresponding continuous assignment, not a delay on the wire. Thus it could be necessary to separate the wire declaration from the continuous assignment to put the delay onto the wire rather than the assignment. Note that this is a subtle point that you are unlikely to encounter in practice!

Verilog: Using wire assignments to describe an AOI gate module

So in this sample code, each of the wire declarations and its corresponding assign statement are effectively merged into one wire assignment.

Note the use of a block comment in the Verilog code, rather than the line comments we have seen so far. A block comment may span several lines of code. Block comments may not be nested.

verilog assign command

Simulate your VHDL code in a web browser

Related training, henry hastings, lockheed martin.

View more references


  1. Verilog Construction

    verilog assign command

  2. ️ Assign in verilog. Wire And Reg In Verilog. 2019-02-05

    verilog assign command

  3. Verilog初级教程(8)Verilog中的assign语句

    verilog assign command

  4. Verilog program of 0~16 counter converted by Simulink program Figure 5....

    verilog assign command

  5. Verilog Construction

    verilog assign command

  6. 😎 Always verilog means. How are Verilog statements implemented in hardware?. 2019-01-21

    verilog assign command


  1. An Introduction To Verilog

  2. 3. System Verilog I

  3. 24

  4. Verilog Session-2

  5. Verilog Tutorial 14: == and ===

  6. Verilog Session (1)


  1. Verilog assign statement

    In Verilog, this concept is realized by the assign statement where any wire or other similar wire like data-types can be driven continuously with a value.

  2. Combinational Logic with assign

    The verilog assign statement is typically used to continuously drive a signal of wire datatype and gets synthesized as combinational logic.

  3. Verilog Assign Statement

    Assign statements are used to drive values on the net. And it is also used in Data Flow Modeling. Signals of type wire or a data type

  4. Verilog In One Day Part-III

    An assign statement is used for modeling only combinational logic and it is executed continuously. So the assign statement is called 'continuous assignment

  5. When shall I use the keyword "assign" in SystemVerilog?

    The general guidelines for synthesizable Verilog code are that you should only use the assign keyword for combinational logic

  6. Assignment Statements

    Assign statements are used to implement set and reset because they dominate over the non-blocking assignment used to update q upon positive edges of the clock c

  7. When is the 'assign' statement used in Verilog?

    Assign is used to define signals that are continuously active irrespective of any clock signal. (This does mean that the output can glitch in real time in

  8. Summary of Verilog Syntax

    LHS must be a scalar or vector ofnets, and assignment must be performedoutside procedure statements. assign #delay net = expression;. Delay may be associated

  9. Wire Assignments

    So in this sample code, each of the wire declarations and its corresponding assign statement are effectively merged into one wire assignment.




    The assign command which defines a wire. – The always command which defines a reg. • All of these must be declared at the module definition level—not inside.