0% found this document useful (0 votes)
95 views26 pages

VHDL Module 5

This module discusses useful Verilog modeling techniques including procedural continuous assignments using assign/deassign and force/release, overriding parameters using defparam and module instance parameter assignment, conditional compilation and execution using compiler directives like `ifdef, and specifying time scales using the `timescale compiler directive. It provides examples and explanations of how to apply each technique.

Uploaded by

Hemanth Kumar
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as PPTX, PDF, TXT or read online on Scribd
0% found this document useful (0 votes)
95 views26 pages

VHDL Module 5

This module discusses useful Verilog modeling techniques including procedural continuous assignments using assign/deassign and force/release, overriding parameters using defparam and module instance parameter assignment, conditional compilation and execution using compiler directives like `ifdef, and specifying time scales using the `timescale compiler directive. It provides examples and explanations of how to apply each technique.

Uploaded by

Hemanth Kumar
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as PPTX, PDF, TXT or read online on Scribd
You are on page 1/ 26

Module 5

• Useful Modeling Techniques: Procedural continuous assignments,


overriding parameters, conditional compilation and execution, useful
system tasks.

• Logic Synthesis with Verilog: Logic Synthesis, Impact of logic synthesis,


Verilog HDL Synthesis, Synthesis design flow, Verification of Gate-Level
Netlist. (Chapter 14 till 14.5 of Text).
Procedural Continuous Assignments
• Procedural assignments assign a value to a register.

• The value stays in the register until another procedural assignment puts another
value in that register.

• Procedural continuous assignments behave differently. They are procedural


statements which allow values of expressions to be driven continuously onto
registers or nets for limited periods of time.

• Procedural continuous assignments override existing assignments to a register or


net. They provide an useful extension to the regular procedural assignment
statement.
assign and deassign
• The keywords assign and deassign are used to express the first type of procedural
continuous assignment.

• The left-hand side of procedural continuous assignments can be only be a register


or a concatenation of registers.

• It cannot be a part or bit select of a net or an array of registers.

• Procedural continuous assignments override the effect of regular procedural


assignments. Procedural continuous assignments are normally used for controlled
periods of time.
• we now model the same D_FF, using assign and deassign statements.
• we overrode the assignment on q and qbar and assigned new values to them when
the reset signal went high.

• The register variables retain the continuously assigned value after the deassign
until they are changed by a future procedural assignment.

• The assign and deassign constructs are now considered to be a bad coding style
and it is recommended that alternative styles be used in Verilog HDL code.
force and release
• Keywords force and release are used to express the second form of the procedural
continuous assignments.

• They can be used to override assignments on both registers and nets.

• force and release statements are typically used in the interactive debugging
process, where certain registers or nets are forced to a value and the effect on other
registers and nets is noted.

• It is recommended that force and release statements not be used inside design
blocks. They should appear only in stimulus or as debug statements.
force and release on registers
• A force on a register overrides any procedural assignments or procedural continuous assignments on the
register until the register is released.

• The register variables will continue to store the forced value after being released, but can then be changed
by a future procedural assignment.

• To override the values of q and qbar in Example 9-1 for a limited period of time, we could do the
following:
force and release on nets
• force on nets overrides any continuous assignments until the net is released.

• The net will immediately return to its normal driven value when it is released.

• A net can be forced to an expression or a value.


• In the example above, a new expression is forced on the net from time 50 to time
100.

• From time 50 to time 100, when the force statement is active, the expression a | b
& c will be re-evaluated and assigned to out whenever values of signals a or b or c
change.

• Thus, the force statement behaves like a continuous assignment except that it is
active for only a limited period of time.
Overriding Parameters
• Parameters can be defined in a module definition.

• However, during compilation of Verilog modules, parameter values can be altered


separately for each module instance.

• This allows us to pass a distinct set of parameter values to each module during
compilation regardless of predefined parameter values.

• There are two ways to override parameter values: through the defparam statement
or through module instance parameter value assignment.
defparam Statement
• Parameter values can be changed in any module instance in the design with the keyword defparam.

• The hierarchical name of the module instance can be used to override parameter values.

• Consider Example 9-2, which uses defparam to override the parameter values in module instances.
• In Example , the module hello_world was defined with a default id_num = 0.
• However, when the module instances w1 and w2 of the type hello_world are
created, their id_num values are modified with the defparam statement.

• Multiple defparam statements can appear in a module.


• Any parameter can be overridden with the defparam statement. The defparam
construct is now considered to be a bad coding style and it is recommended that
alternative styles be used in Verilog HDL code.

• If we simulate the above design, we would get the following output:


Module_Instance Parameter Values

• Parameter values can be overridden when a module is instantiated.

• To illustrate this, we will use Example 9-2 and modify it a bit. The new parameter
values are passed during module instantiation.

• The top-level module can pass parameters to the instances w1 and w2, as shown
below.

• Notice that defparam is not needed. The simulation output will be identical to the
output obtained with the defparam statement.
• If multiple parameters are defined in the module, during module instantiation, they can be
overridden by specifying the new values in the same order as the parameter declarations in the
module.

• If an overriding value is not specified, the default parameter declaration values are taken.

• Alternately, one can override specific values by naming the parameters and the corresponding
values. This is called parameter value assignment by name.
Module-instance parameter value assignment is a very useful method used to override parameter values and to
customize module instances.
Conditional Compilation and Execution

• A portion of Verilog might be suitable for one environment but not for another.

• The designer does not wish to create two versions of Verilog design for the two
environments.

• Instead, the designer can specify that the particular portion of the code be
compiled only if a certain flag is set. This is called conditional compilation.

• A designer might also want to execute certain parts of the Verilog design only
when a flag is set at run time. This is called conditional execution.
Conditional Compilation
Conditional compilation can be accomplished by using compiler directives `ifdef, `ifndef, `else, `elsif, and `endif.
• The `ifdef and `ifndef directives can appear anywhere in the design.

• A designer can conditionally compile statements, modules, blocks, declarations, and other compiler
directives.

• The `else directive is optional. A maximum of one `else directive can accompany an `ifdef or `ifndef.

• Any number of `elsif directives can accompany an `ifdef or `ifndef.

• An `ifdef or `ifndef is always closed by a corresponding `endif.

• The conditional compile flag can be set by using the `define statement inside the Verilog file.

• In the example above, we could define the flags by defining text macros TEST and ADD_B2 at compile
time by using the `define statement.

• The Verilog compiler simply skips the portion if the conditional compile flag is not set.

• A Boolean expression, such as TEST && ADD_B2, is not allowed with the `ifdef statement.
Conditional Execution

• Conditional execution flags allow the designer to control statement execution flow
at run time.

• All statements are compiled but executed conditionally.

• Conditional execution flags can be used only for behavioral statements.

• The system task keyword $test$plusargs is used for conditional execution.


• The variables are displayed only if the flag DISPLAY_VAR is set at run time.

• Flags can be set at run time by specifying the option +DISPLAY_VAR at run
time.

• Conditional execution can be further controlled by using the system task keyword
$value$plusargs.

• This system task allows testing for arguments to an invocation option.

• $value$plusargs returns a 0 if a matching invocation was not found and non-zero if


a matching option was found.
Time Scales
• Often, in a single simulation, delay values in one module need to be defined by using certain
time unit, e.g., 1 s, and delay values in another module need to be defined by using a
different time unit, e.g. 100 ns.

• Verilog HDL allows the reference time unit for modules to be specified with the `timescale
compiler directive.

• Usage: `timescale <reference_time_unit> / <time_precision>


• The <reference_time_unit> specifies the unit of measurement for times and delays.
• The <time_precision> specifies the precision to which the delays are rounded off during
simulation.

• Only 1, 10, and 100 are valid integers for specifying time unit and time precision.
• The two modules dummy1 and dummy2 are identical in all respects, except that the time unit for dummy1 is
100 ns and the time unit for dummy2 is 1 s.

• Thus the $display statement in dummy1 will be executed 10 times for each $display executed in dummy2.

• The $time task reports the simulation time in terms of the reference time unit for the module in which it is
invoked.

• Notice that the $display statement in dummy2 executes once for every ten $display statements in dummy1.

You might also like