Interview Questions
Interview Questions
view source
print?
1.logic data_1;
2.var logic data_2;
3.wire logic data_3j;
4.bit data_4;
5.var bit data_5;
1) Write a verilog code to swap contents of two registers with and without a
temporary register?
The Verilog language has two forms of the procedural assignment statement: blocking
and non-blocking. The two are distinguished by the = and <= assignment operators.
The blocking assignment statement (= operator) acts much like in traditional
programming languages. The whole statement is done before control passes on to the
next statement. The non-blocking (<= operator) evaluates all the right-hand sides for
the current time unit and assigns the left-hand sides at the end of the time unit. For
example, the following Verilog program
module blocking;
reg [0:7] A, B;
initial begin: init1
A = 3;
#1 A = A + 1; // blocking procedural assignment
B = A + 1;
$display("Blocking: A= %b B= %b", A, B ); A = 3;
#1 A <= A + 1; // non-blocking procedural assignment
B <= A + 1;
#1 $display("Non-blocking: A= %b B= %b", A, B );
end
endmodule
The effect is for all the non-blocking assignments to use the old values of the
variables at the beginning of the current time unit and to assign the registers new
values at the end of the current time unit. This reflects how register transfers occur in
some hardware systems.
blocking procedural assignment is used for combinational logic and non-blocking
procedural assignment for sequential
integer file;
file = $fopenr("filename");
file = $fopenw("filename");
file = $fopena("filename");
The function $fopenr opens an existing file for reading. $fopenw opens a new file for
writing, and $fopena opens a new file for writing where any data will be appended to
the end of the file. The file name can be either a quoted string or a reg holding the file
name. If the file was successfully opened, it returns an integer containing the file
number (1..MAX_FILES) or NULL (0) if there was an error. Note that these functions
are not the same as the built-in system function $fopen which opens a file for writing
by $fdisplay. The files are opened in C with 'rb', 'wb', and 'ab' which allows reading
and writing binary data on the PC. The 'b' is ignored on Unix.
CLOSE A FILE
integer file, r;
r = $fcloser(file);
r = $fclosew(file);
The function $fcloser closes a file for input. $fclosew closes a file for output. It
returns EOF if there was an error, otherwise 0. Note that these are not the same as
$fclose which closes files for writing.
Function:
A function is unable to enable a task however functions can enable other functions.
A function will carry out its required duty in zero simulation time. ( The program time
will not be incremented during the function routine)
Within a function, no event, delay or timing control statements are permitted
In the invocation of a function their must be at least one argument to be passed.
Functions will only return a single value and can not use either output or inout
statements.
Tasks:
Tasks are capable of enabling a function as well as enabling other versions of a Task
Tasks also run with a zero simulation however they can if required be executed in a
non zero simulation time.
Tasks are allowed to contain any of these statements.
A task is allowed to use zero or more arguments which are of type output, input or
inout.
A Task is unable to return a value but has the facility to pass multiple values via the
output and inout statements .
in a case statement if all the possible combinations are not compared and default is
also not specified like in example above a latch will be inferred ,a latch is inferred
because to reproduce the previous value when unknown branch is specified.
For example in above case if {s1,s0}=3 , the previous stored value is reproduced for
this storing a latch is inferred.
The same may be observed in IF statement in case an ELSE IF is not specified.
To avoid inferring latches make sure that all the cases are mentioned if not default
condition is provided.
Signals
The sensitivity list indicates that when a change occurs to any one of elements in the
list change, begin…end statement inside that always block will get executed.
// timescale directive tells the simulator the base units and precision of the simulation
`timescale 1 ns / 10 ps
module name (input and outputs);
// parameter declarations
parameter parameter_name = parameter value;
// Input output declarations
input in1;
input in2; // single bit inputs
output [msb:lsb] out; // a bus output
// internal signal register type declaration - register types (only assigned within always
statements). reg register variable 1;
reg [msb:lsb] register variable 2;
// internal signal. net type declaration - (only assigned outside always statements) wire
net variable 1;
// hierarchy - instantiating another module
reference name instance name (
.pin1 (net1),
.pin2 (net2),
.
.pinn (netn)
);
// synchronous procedures
always @ (posedge clock)
begin
.
end
// combinatinal procedures
always @ (signal1 or signal2 or signal3)
begin
.
end
assign net variable = combinational logic;
endmodule
Compilation
VHDL. Multiple design-units (entity/architecture pairs), that reside in the same
system file, may be separately compiled if so desired. However, it is good design
practice to keep each design unit in it's own system file in which case separate
compilation should not be an issue.
Verilog. The Verilog language is still rooted in it's native interpretative mode.
Compilation is a means of speeding up simulation, but has not changed the original
nature of the language. As a result care must be taken with both the compilation order
of code written in a single file and the compilation order of multiple files. Simulation
results can change by simply changing the order of compilation.
Data types
VHDL. A multitude of language or user defined data types can be used. This may
mean dedicated conversion functions are needed to convert objects from one type to
another. The choice of which data types to use should be considered wisely, especially
enumerated (abstract) data types. This will make models easier to write, clearer to
read and avoid unnecessary conversion functions that can clutter the code. VHDL
may be preferred because it allows a multitude of language or user defined data types
to be used.
Verilog. Compared to VHDL, Verilog data types a re very simple, easy to use and
very much geared towards modeling hardware structure as opposed to abstract
hardware modeling. Unlike VHDL, all data types used in a Verilog model are defined
by the Verilog language and not by the user. There are net data types, for example
wire, and a register data type called reg. A model with a signal whose type is one of
the net data types has a corresponding electrical wire in the implied modeled circuit.
Objects, that is signals, of type reg hold their value over simulation delta cycles and
should not be confused with the modeling of a hardware register. Verilog may be
preferred because of it's simplicity.
Design reusability
VHDL. Procedures and functions may be placed in a package so that they are avail
able to any design-unit that wishes to use them.
15) What are different styles of Verilog coding I mean gate-level,continuous level
and others explain in detail?
16) Can you tell me some of system tasks and their purpose?
In earlier version of Verilog ,we use 'or' to specify more than one element in
sensitivity list . In Verilog 2001, we can use comma as shown in the example below.
// Verilog 2k example for usage of comma
always @ (i1,i2,i3,i4)
Verilog 2001 allows us to use star in sensitive list instead of listing all the variables in
RHS of combo logics . This removes typo mistakes and thus avoids simulation and
synthesis mismatches,
Verilog 2001 allows port direction and data type in the port list of modules as shown
in the example below
module memory (
input r,
input wr,
input [7:0] data_in,
input [3:0] addr,
output [7:0] data_out
);
Synchronous reset, synchronous means clock dependent so reset must not be present
in sensitivity disk eg:
always @ (posedge clk )
begin if (reset)
. . . end
Asynchronous means clock independent so reset must be present in sensitivity list.
Eg
Always @(posedge clock or posedge reset)
begin
if (reset)
. . . end
20) There is a triangle and on it there are 3 ants one on each corner and are free
to move along sides of triangle what is probability that they will collide?
Ants can move only along edges of triangle in either of direction, let’s say one is
represented by 1 and another by 0, since there are 3 sides eight combinations are
possible, when all ants are going in same direction they won’t collide that is 111 or
000 so probability of not collision is 2/8=1/4 or collision probability is 6/8=3/4
$deposit(variable, value);
This system task sets a Verilog register or net to the specified value. variable is the
register or net to be changed; value is the new value for the register or net. The value
remains until there is a subsequent driver transaction or another $deposit task for the
same register or net. This system task operates identically to the ModelSim
force -deposit command.
The force command has -freeze, -drive, and -deposit options. When none of these is
specified, then -freeze is assumed for unresolved signals and -drive is assumed for
resolved
signals. This is designed to provide compatibility with force files. But if you prefer
-freeze
as the default for both resolved and unresolved signals.
CASEZ :
Special version of the case statement which uses a Z logic value to represent don't-
care bits. CASEX :
Special version of the case statement which uses Z or X logic values to represent
don't-care bits.
CASEZ should be used for case statements with wildcard don’t cares, otherwise use
of CASE is required; CASEX should never be used.
This is because:
Don’t cares are not allowed in the "case" statement. Therefore casex or casez are
required. Casex will automatically match any x or z with anything in the case
statement. Casez will only match z’s -- x’s require an absolute match.
25) What is the difference between the following two lines of Verilog code?
#5 a = b;
a = #5 b;
#5 a = b; Wait five time units before doing the action for "a = b;".
a = #5 b; The value of b is calculated and stored in an internal temp register,After five
time units, assign this stored value to a.
c = foo ? a : b;
and
if (foo) c = a;
else c = b;
The ? merges answers if the condition is "x", so for instance if foo = 1'bx, a = 'b10,
and b = 'b11, you'd get c = 'b1x. On the other hand, if treats Xs or Zs as FALSE, so
you'd always get c = b.
A: The easiest and efficient way to generate sine wave is using CORDIC Algorithm.
// Port Declaration
input oe;
input clk;
input [7:0] inp;
output [7:0] outp;
inout [7:0] bidir;
reg [7:0] a;
reg [7:0] b;
assign bidir = oe ? a : 8'bZ ;
assign outp = b;
// Always Construct
always @ (posedge clk)
begin
b <= bidir;
a <= inp;
end
endmodule
35) Why is it that "if (2'b01 & 2'b10)..." doesn't run the true case?
This is a popular coding error. You used the bit wise AND operator (&) where you
meant to use the logical AND operator (&&).
Event Driven
Cycle Based
Event-based Simulator:
This Digital Logic Simulation method sacrifices performance for rich functionality:
every active signal is calculated for every device it propagates through during a clock
cycle. Full Event-based simulators support 4-28 states; simulation of Behavioral HDL,
RTL HDL, gate, and transistor representations; full timing calculations for all devices;
and the full HDL standard. Event-based simulators are like a Swiss Army knife with
many different features but none are particularly fast.
1.) Results are only examined at the end of every clock cycle; and
2.) The digital logic is the only part of the design simulated (no timing calculations).
By limiting the calculations, Cycle based Simulators can provide huge increases in
performance over conventional Event-based simulators.
Cycle based simulators are more like a high speed electric carving knife in
comparison because they focus on a subset of the biggest problem: logic verification.
Cycle based simulators are almost invariably used along with Static Timing verifier to
compensate for the lost timing information coverage.
Introduction
Directed-Test Methodology
Scoreboards are used to verify that data has successfully reached its destination, while
monitors snoop the interfaces to provide coverage information. New or revised
constraints focus verification on the uncovered parts of the design under test. As
verification progresses, the simulation tool identifies the best seeds, which are then
retained as regression tests to create a set of scenarios, constraints, and seeds that
provide high coverage of the design.
While both blocking and nonblocking assignments are procedural assignments, they
differ in behaviour with respect to simulation and logic
synthesis as follows:
How can I model a bi-directional net with assignments influencing both source and
destination?
The assign statement constitutes a continuous assignment. The changes on the RHS of
the statement immediately reflect on the LHS net. However, any changes on the LHS
don't get reflected on the RHS. For example, in the following statement, changes to
the rhs net will update the lhs net, but not vice versa.
System Verilog has introduced a keyword alias, which can be used only on nets to
have a two-way assignment. For example, in the following code, any changes to the
rhs is reflected to the lh s , and vice versa.
System Verilog has introduced a keyword alias, which can be used only on nets to
have a two-way assignment. For example, in the following code, any changes to the
rhs is reflected to the lh s , and vice versa.
alias lhs=rhs;
In the above example, any change to either side of the net gets reflected on the other
side.
Are tasks and functions re-entrant, and how are they different from static task and
function calls?
In Verilog-95, tasks and functions were not re-entrant. From Verilog version 2001
onwards, the tasks and functions are reentrant. The reentrant tasks have a keyword
automatic between the keyword task and the name of the task. The presence of the
keyword automatic replicates and allocates the variables within a task dynamically for
each task entry during concurrent task calls, i.e., the values don’t get overwritten for
each task call. Without the keyword, the variables are allocated statically, which
means these variables are shared across different task calls, and can hence get
overwritten by each task call.
How can I override variables in an automatic task?
By default, all variables in a module are static, i.e., these variables will be replicated
for all instances of a module. However, in the case of task and function, either the
task/function itself or the variables within them can be defined as static or automatic.
The following explains the inferences through different combinations of the
task/function and/or its variables, declared either as static or automatic:
Note, however, that, since the width and depth are specified using the parameter
construct, they can be overridden during instantiation or using defparam, and hence
will indirectly override the num_bits values. In general, localparam constructs are
useful in defining new and localized identifiers whose values are derived from regular
parameters.
What are the pros and cons of specifying the parameters using the defparam construct vs.
specifying during instantiation?
All the values to all the parameters don’t need to be specified. Only those parameters
that are assigned the new values need to be specified. The unspecified parameters will
retain their default values specified within its module definition.
The order of specifying the parameter is not relevant anymore, since the parameters
are directly specified and linked by their name.
This method always has precedence over specifying parameters during instantiation.
All the parameter value override assignments can be grouped inside one module and
together in one place, typically in the top-level testbench itself.
When multiple defparams for a single parameter are specified, the parameter takes the
value of the last defparam statement encountered in the source if, and only if, the
multiple defparam’s are in the same file. If there are defparam’s in different files that
override the same parameter, the final value of the parameter is indeterminate.
The parameter is typically specified by the scope of the hierarchies underneath which
it exists. If a particular module gets ungrouped in its hierarchy, [sometimes necessary
during synthesis], then the scope to specify the parameter is lost, and is unspecified. B
Can there be full or partial no-connects to a multi-bit port of a module during its
instantiation?
No. There cannot be full or partial no-connects to a multi-bit port of a module during
instantiation
What happens to the logic after synthesis, that is driving an unconnected output port that
is left open (, that is, noconnect) during its module instantiation?
An unconnected output port in simulation will drive a value, but this value does not
propagate to any other logic. In synthesis, the cone of any combinatorial logic that
drives the unconnected output will get optimized away during boundary optimisation,
that is, optimization by synthesis tools across hierarchical boundaries.
How is the connectivity established in Verilog when connecting wires of different widths?
When connecting wires or ports of different widths, the connections are right-
justified, that is, the rightmost bit on the RHS gets connected to the rightmost bit of
the LHS and so on, until the MSB of either of the net is reached.
Can I use a Verilog function to define the width of a multi-bit port, wire, or reg type?
The width elements of ports, wire or reg declarations require a constant in both MSB
and LSB. Before Verilog 2001, it is a syntax error to specify a function call to
evaluate the value of these widths. For example, the following code is erroneous
before Verilog 2001 version.
In the above example, get_high and get_low are both function calls of evaluating a
constant result for MSB and LSB respectively. However, Verilog-2001 allows the use
of a function call to evaluate the MSB or LSB of a width declaration
The presence of feedback loops should be avoided at any stage of the design, by
periodically checking for it, using the lint or synthesis tools. The presence of the
feedback loop causes races and hazards in the design, and 104 RTL Design
leads to unpredictable logic behavior. Since the loops are delay-dependent, they
cannot be tested with any ATPG algorithm. Hence, combinatorial loops should be
avoided in the logic.
What are the various methods to contain power during RTL coding?
Any switching activity in a CMOS circuit creates a momentary current flow from
VDD to GND during logic transition, when both N and P type transistors are ON, and,
hence, increases power consumption.
The most common storage element in the designs being the synchronous FF, its output
can change whenever its data input toggles, and the clock triggers. Hence, if these two
elements can be asserted in a controlled fashion, so that the data is presented to the D
input of the FF only when required, and the clock is also triggered only when
required, then it will reduce the switching activity, and, automatically the power.
First, this is a big area.Analog and Mixed-Signal designers use tools like Spice to fully
characterize and model their designs.My only involvement with Mixed-Signal blocks
has been to utilize behavioral models of things like PLLs, A/Ds, D/As within a larger
SoC.There are some specific Verilog tricks to this which is what this FAQ is about (I
do not wish to trivialize true Mixed-Signal methodology, but us chip-level folks need
to know this trick).
A mixed-signal behavioral model might model the digital and analog input/output
behavior of, for example, a D/A (Digital to Analog Converter).So, digital input in and
analog voltage out.Things to model might be the timing (say, the D/A utilizes an
internal Success Approximation algorithm), output range based on power supply
voltages, voltage biases, etc.A behavioral model may not have any knowledge of the
physical layout and therefore may not offer any fidelity whatsoever in terms of noise,
interface, cross-talk, etc.A modelmight be parameterized given a specific
characterization for a block.Be very careful about the assumptions and limitations of
the model!
Issue #1; how do we model analog voltages in Verilog.Answer: use the Verilog real
data type, declare “analog wires” as wire[63:0] in order to use a 64-bit floating-type
represenation, and use the built-in PLI functions:
$rtoi converts reals to integers w/truncation e.g. 123.45 -> 123
That was a lot.This is a trick to be used in vanilla Verilog.The 64-bit wire is simply a
ways to actually interface to the ports of the mixed-signal block.In other words, our
example D/A module may have an output called AOUT which is a voltage.Verilog
does not allow us to declare an output port of type REAL.So, instead declare AOUT
like this:
....
....
We use 64 bits because we can use floating-point numbers to represent out voltage
output (e.g. 1.22x10-3 for 1.22 millivolts).The floating-point value is relevant only to
Verilog and your workstation and processor, and the IEEE floating-point format has
NOTHING to do with the D/A implementation.Note the disconnect in terms of the
netlist itself.The physical “netlist” that you might see in GDS may have a single metal
interconnect that is AOUT, and obviously NOT 64 metal wires.Again, this is a
trick.The 64-bit bus is only for wiring.You may have to do some quick netlist
substitutions when you hand off a netlist.
In Verilog, the real data type is basically a floating-point number (e.g. like double in
C).If you want to model an analog value either within the mixed-signal behavorial
model, or externally in the system testbench (e.g. the sensor or actuator), use the real
data type.You can convert back and forth between real and your wire [63:0] using the
PLI functions listed above.A trivial D/A model could simply take the digital input
value, convert it to real, scale it according to some #defines, and output the value on
AOUT as the 64-bit “psuedo-analog” value.Your testbench can then do the reverse
and print out the value, or whatever.More sophisticated models can model the
Successive Approximation algorithm, employ look-ups, equations, etc. etc.
That’s it.If you are getting a mixed-signal block from a vendor, then you may also
receive (or you should ask for) the behavioral Verilog models for the IP.
The answer can, of course, occupy several lifetimes to completely answer.. BUT.. a
straight-forward Verilog module can be very easily synthesized using Design
Compiler (e.g. dc_shell). Most ASIC projects will create very elaborate synthesis
scripts, CSH scripts, Makefiles, etc. This is all important in order automate the
process and generalize the synthesis methodology for an ASIC project or an
organization. BUT don't let this stop you from creating your own simple dc_shell
experiments!
Let's say you create a Verilog module named foo.v that has a single clock input
named 'clk'. You want to synthesize it so that you know it is synthesizable, know how
big it is, how fast it is, etc. etc. Try this:
target_library = { CORELIB.db } <--- This part you need to get from your vendor...
compile
report_area
report_timing
quit
You can enter all this in interactively, or put it into a file called 'synth_foo.scr' and
then enter:
dc_shell -f synth_foo.scr
You can spend your life learning more and more Synopsys and synthesis-related
commands and techniques, but don't be afraid to begin using these simple commands.
A testbench and simulation will likely need many different parameters and settings for
different sorts of tests and conditions. It is definitely a good idea to concentrate on a
single testbench file that is parameterized, rather than create a dozen seperate, yet
nearly identical, testbenches. Here are 3 common techniques:
• Use a define. This is almost exactly the same approach as the #define and -D compiler
arg that C programs use. In your Verilog code, use a `define to define the variable
condition and then use the Verilog preprocessor directives like `ifdef. Use the '+define+'
Verilog command line option. For example:
`ifdef USEWCSDF
`endif
The +define+ can also be filled in from your Makefile invocation, which in turn, can be finally
Defines are a blunt weapon because they are very global and you can only do so much with
them since they are a pre-processor trick. Consider the next approach before resorting to
defines.
• Use parameters and parameter definition modules. Parameters are not preprocessor
definitions and they have scope (e.g. parameters are associated with specific modules).
Parameters are therefore more clean, and if you are in the habit of using a lot of defines;
consider switching to parameters. As an example, lets say we have a test (e.g. test12)
which needs many parameters to have particular settings. In your code, you might have
this sort of stuff:
...
... E.g. use the parameter in your code like you might any general variable
... BAUDRATE is completely local to this module and this instance. You might
... have the same parameters in 3 other UART instances and they'd all be different
... values...
Now, your test12 has all kinds of settings required for it. Let's define a special module
called testparams which specifies all these settings. It will itself be a module instantiated
module testparams;
endmodule
The above module always has the same module name, but you would have many different
filenames; one for each test. So, the above would be kept in test12_params.v. Your
Makefile includes the appropriate params file given the desired make target. (BTW: You
may run across this sort of technique by ASIC vendors who might have a module containing
parameters for a memory model, or you might see this used to collect together a large
number of system calls that turn off timing or warnings on particular troublesome nets, etc.
etc.)
• Use memory blocks. Not as common a technique, but something to consider. Since
Verilog has a very convenient syntax for declaring and loading memories, you can store
your input data in a hex file and use $readmemh to read all the data in at once.
In your testbench:
module testbench;
...
...
...
endmodule
You could vary the filename using the previous techniques. The control.hex file is just a file
of hex values for the parameters. Luckily, $readmemh allows embedded comments, so you
... etc...
Obviously, you are limitied to actual hex values with this approach. Note, of course,
that
a. Since scan and other test structures are added during and after synthesis, they are not
checked by the rtl simulations and therefore need to be verified by gate level simulation.
b. Static timing analysis tools do not check asynchronous interfaces, so gate level simulation is
required to look at the timing of these interfaces.
c. Careless wildcards in the static timing constraints set false path or mutlicycle path constraints
where they don't belong.
d. Design changes, typos, or misunderstanding of the design can lead to incorrect false paths or
multicycle paths in the static timing constraints.
e. Using create_clock instead of create_generated_clock leads to incorrect static
timing between clock domains.
f. Gate level simulation can be used to collect switching factor data for power estimation.
g. X's in RTL simulation can be optimistic or pessimistic. The best way to verify that the design
does not have any unintended dependence on initial conditions is to run gate level simulation.
f. It's a nice "warm fuzzy" that the design has been implemented correctly.
3)An AND gate and OR gate are given inputs X & 1 , what is expected
output?
Verilog can model delay types within its specification for gates and buffers. Parameters that can
be modelled are T_rise, T_fall and T_turnoff. To add further detail, each of the three values can
have minimum, typical and maximum values
T_rise, t_fall and t_off
The general syntax for min, typ and max delay modelling is;
gate_type #(t_rise_min:t_ris_typ:t_rise_max, t_fall_min:t_fall_typ:t_fall_max,
t_off_min:t_off_typ:t_off_max) gate_name (paramteters);
Similar rules apply for th especifying order as above. If only one t_rise value is
specified then this value is applied to min, typ and max. If specifying more
than one number, then all 3 MUST be scpecified. It is incorrect to specify two
values as the compiler does not know which of the parameters the value
represents.
5) With a specify block how to defining pin-to-pin delays for the module ?
module A( q, a, b, c, d )
input a, b, c, d;
output q;
wire e, f;
specify
endspecify
// module definition
or o1( e, a, b );
or o2( f, c, d );
exor ex1( q, e, f );
endmodule
module A( q, a, b, c, d )
input a, b, c, d;
output q;
wire e, f;
// specify block containing full connection statements
specify
( a, d *> q ) = 6; // delay from a and d to q
( b, c *> q ) = 7; // delay from b and c to q
endspecify
// module definition
or o1( e, a, b );
or o2( f, c, d );
exor ex1( q, e, f );
endmodule
Conditional path delays, sometimes called state dependent path delays, are
used to model delays which are dependent on the values of the signals in the
circuit. This type of delay is expressed with an if conditional statement. The
operands can be scalar or vector module input or inout ports, locally defined
registers or nets, compile time constants (constant numbers or specify block
parameters), or any bit-select or part-select of these. The conditional
statement can contain any bitwise, logical, concatenation, conditional, or
reduction operator. The else construct cannot be used.
Distributed Delay
As can be seen from Figure 1, each of the or-gates in the circuit above has a
delay assigned to it:
When the input of any gate change, the output of the gate changes after the
delay value specified.
The gate function and delay, for example for gate 1, can be described in the
following manner:
or #4 a1 (e, a, b);
A delay of 4 is assigned to the or-gate. This means that the output of the gate,
e, is delayed by 4 from the inputs a and b.
1)
Module or_circ (out, a, b, c, d);
output out;
input a, b, c, d;
wire e, f;
//Delay distributed to each gate
or #4 a1 (e, a, b);
or #6 a2 (f, c, d);
or #3 a3 (out, e, f);
endmodule
2)
Module or_circ (out, a, b, c, d);
output out;
input a, b, c, d;
wire e, f;
//Delay distributed to each expression
assign #4 e = a & b;
assign #6 e = c & d;
assign #3 e = e & f;
endmodule
The above or_circ modules results in delays of (4+3) = 7 and (6+3) = 9 for the
4 connections part from the input to the output of the circuit.
Lumped Delay
As can be seen from Figure 2, gate 3 has got a delay of 9. When the input of
this gate changes, the output of the gate changes after the delay value
specified.
1)
Module or_circ (out, a, b, c, d);
output out;
input a, b, c, d;
wire e, f;
or a1 (e, a, b);
or a2 (f, c, d);
or #9 a3 (out, e, f); //delay only on the output gate
endmodule
This model can be used if delay between different inputs is not required.
Pin - to - Pin delay, also called path delay, is delay assigned to paths from
each input to each output. An example circuit is shown below.
The total delay from each input to each output is given. The same example
circuit as for the distributed and lumped delay model is used. This means that
the sum delay from each input to each output is the same.
Path delays of a module are specified incide a specify block, as seen from the
example above. An example of delay from the input, a, to the output, out, is
written as (a => out) = delay, where delay sets the delay between the two
ports. The gate calculations are done after the path delays are defined.
For larger circuits, the pin - to - pin delay can be easier to model than
distributed delay. This is because the designer writing delay models, needs to
know only the input / output pins of the module, rather than the internals of the
module. The path delays for digital circuits can be found through different
simulation programs, for instance SPICE. Pin - to - Pin delays for standard
parts can be found from data books. By using the path delay model, the
program speed will increase.
This section, the final part of the delay modeling chapter, discusses some of
the various system tasks that exist for the purposes of timing checks. Verilog
contains many timing-check system tasks, but only the three most common
tasks are discussed here: $setup, $hold and $width. Timing checks are used
to verify that timing constraints are upheld, and are especially important in the
simulation of high-speed sequential circuits such as microprocessors. All
timing checks must be contained within specify blocks as shown in the
example below.
The $width task is used to check the minimum width of a positive or negative-
going pulse. In the example, this is the time between a negative transition and
the transition back to 1.
Syntax:
$width(reference1, time_limit);
Example:
reg q;
endmodule // d_type
module stimulus;
reg clk, d;
wire q, clk2, d2;
assign d2=d;
assign clk2=clk;
initial
begin
$display ("\t\t clock d q");
$display ($time," %b %b %b", clk, d, q);
clk=0;
d=1;
#7 d=0;
#7 d=1; // causes setup violation
#3 d=0;
#5 d=1; // causes hold violation
#2 d=0;
#1 d=1; // causes width violation
end // initial begin
initial
#26 $finish;
always
#3 clk = ~clk;
always
#1 $display ($time," %b %b %b", clk, d, q);
specify
$setup(d2, posedge clk2, 2);
$hold(posedge clk2, d2, 2);
$width(negedge d2, 2);
endspecify
endmodule // stimulus
Output:
clock d q
0 x xx
1 0 1x
2 0 1x
3 1 1x
4 1 11
5 1 11
6 0 11
7 0 01
8 0 01
9 1 01
10 1 00
11 1 00
12 0 00
13 0 00
14 0 10
15 1 10
16 1 11
17 1 01
18 0 01
19 0 01
20 0 01
21 1 01
22 1 10
23 1 1 0
24 0 0 0
25 0 1 0
9) Draw a 2:1 mux using switches and verilog code for it?
1-bit 2-1 Multiplexer
This circuit assigns the output out to either inputs in1 or in2 depending on the
low or high values of ctrl respectively.
endmodule
The above table gives all the gate level constructs of only the constructs in
first two columns are synthesizable.
VLSI & ASIC Digital design interview questions
[1] 2 3 4 5 6 7 8 9 10 11 12 13 14 Next
Un-Answered Questions