ВУЗ: Не указан

Категория: Не указан

Дисциплина: Не указана

Добавлен: 14.06.2025

Просмотров: 437

Скачиваний: 0

ВНИМАНИЕ! Если данный файл нарушает Ваши авторские права, то обязательно сообщите нам.

9

Introduction to Verilog

Table of Contents

1. Introduction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1

2. Lexical Tokens . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2

White Space, Comments, Numbers, Identifiers, Operators, Verilog Keywords

3. Gate-Level Modelling . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3

Basic Gates, buf, not Gates, Three-State Gates; bufif1, bufif0, notif1, notif0

4. Data Types . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4

Value Set, Wire, Reg, Input, Output, Inout

Integer, Supply0, Supply1

Time, Parameter

5. Operators . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6

Arithmetic Operators, Relational Operators, Bit-wise Operators, Logical Operators

Reduction Operators, Shift Operators, Concatenation Operator,

Conditional Operator: “?” Operator Precedence

6. Operands . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9

Literals, Wires, Regs, and Parameters, Bit-Selects

“x[3]” and Part-Selects “x[5:3]”

Function Calls

7. Modules. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10

Module Declaration, Continuous Assignment, Module Instantiations, Parameterized Modules

8. Behavioral Modeling . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12

Procedural Assignments, Delay in Assignment, Blocking and Nonblocking Assignments begin ... end, for Loops, while Loops, forever Loops, repeat,

disable, if ... else if ... else case, casex, casez

9. Timing Controls . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17

Delay Control, Event Control, @, Wait Statement, Intra-Assignment Delay

10. Procedures: Always and Initial Blocks . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18

Always Block, Initial Block

11. Functions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19

Function Declaration, Function Return Value, Function Call, Function Rules, Example

12. Tasks . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21 13. Component Inference . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 22

Registers, Flip-flops, Counters, Multiplexers, Adders/Subtracters, Tri-State Buffers Other Component Inferences

14. Finite State Machines . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 24

Counters, Shift Registers

15. Compiler Directives . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 26

Time Scale, Macro Definitions, Include Directive

16. System Tasks and Functions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 27 $display, $strobe, $monitor $time, $stime, $realtime,

$reset, $stop, $finish $deposit, $scope, $showscope, $list

17. Test Benches . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 29

Synchronous Test Bench

Introduction to Verilog

Friday, January 05, 2001 9:34 pm

Peter M. Nyasulu


Introduction to Verilog

1. Introduction

Verilog HDL is one of the two most common Hardware Description Languages (HDL) used by integrated circuit (IC) designers. The other one is VHDL.

HDL’s allows the design to be simulated earlier in the design cycle in order to correct errors or experiment with different architectures. Designs described in HDL are technology-independent, easy to design and debug, and are usually more readable than schematics, particularly for large circuits.

Verilog can be used to describe designs at four levels of abstraction:

(i)Algorithmic level (much like c code with if, case and loop statements).

(ii)Register transfer level (RTL uses registers connected by Boolean equations).

(iii)Gate level (interconnected AND, NOR etc.).

(iv)Switch level (the switches are MOS transistors inside gates).

The language also defines constructs that can be used to control the input and output of simulation.

More recently Verilog is used as an input for synthesis programs which will generate a gate-level description (a netlist) for the circuit. Some Verilog constructs are not synthesizable. Also the way the code is written will greatly effect the size and speed of the synthesized circuit. Most readers will want to synthesize their circuits, so nonsynthesizable constructs should be used only for test benches. These are program modules used to generate I/O needed to simulate the rest of the design. The words “not synthesizable” will be used for examples and constructs as needed that do not synthesize.

There are two types of code in most HDLs:

Structural, which is a verbal wiring diagram without storage. assign a=b & c | d; /* “|” is a OR */

assign d = e & (~c);

Here the order of the statements does not matter. Changing e will change a.

Procedural which is used for circuits with storage, or as a convenient way to write conditional logic. always @(posedge clk) // Execute the next statement on every rising clock edge.

count <= count+1;

Procedural code is written like c code and assumes every assignment is stored in memory until over written. For synthesis, with flip-flop storage, this type of thinking generates too much storage. However people prefer procedural code because it is usually much easier to write, for example, if and case statements are only allowed in procedural code. As a result, the synthesizers have been constructed which can recognize certain styles of procedural code as actually combinational. They generate a flip-flop only for left-hand variables which truly need to be stored. However if you stray from this style, beware. Your synthesis will start to fill with superfluous latches.

This manual introduces the basic and most common Verilog behavioral and gate-level modelling constructs, as well as Verilog compiler directives and system functions. Full description of the language can be found in Cadence Verilog-XL Reference Manual and Synopsys HDL Compiler for Verilog Reference Manual. The latter emphasizes only those Verilog constructs that are supported for synthesis by the Synopsys Design Compiler synthesis tool.

In all examples, Verilog keyword are shown in boldface. Comments are shown in italics.

Friday, January 05, 2001 9:34 pm

1

Peter M. Nyasulu


Introduction to Verilog

2. Lexical Tokens

Verilog source text files consists of the following lexical tokens:

2.1. White Space

White spaces separate words and can contain spaces, tabs, new-lines and form feeds. Thus a statement can extend over multiple lines without special continuation characters.

2.2. Comments

Comments can be specified in two ways (exactly the same way as in C/C++):

-Begin the comment with double slashes (//). All text between these characters and the end of the line will be ignored by the Verilog compiler.

-Enclose comments between the characters /* and */. Using this method allows you to continue comments on more than one line. This is good for “commenting out” many lines code, or for very brief in-line comments.

Example 2 .1

// this is a simple comment

a = c + d;

/* however, this comment continues on more

than one line */

assign y = temp_reg;

assign x=ABC

/* plus its compliment*/ + ABC_

2.3. Numbers

Number storage is defined as a number of bits, but values can be specified in binary, octal, decimal or hexadecimal (See Sect. 6.1. for details on number notation).

Examples are 3’b001, a 3-bit number, 5’d30, (=5’b11110), and 16‘h5ED4, (=16’d24276)

2.4. Identifiers

Identifiers are user-defined words for variables, function names, module names, block names and instance names. Identifiers begin with a letter or underscore (Not with a number or $) and can include any number of letters, digits and underscores. Identifiers in Verilog are case-sensitive.

Syntax

Example 2 .2

allowed symbols

adder

// use underscores to make your

ABCDE . . . abcdef. . . 1234567890 _$

by_8_shifter

// identifiers more meaningful

not allowed: anything else especially

_ABC_

/* is not the same as */ _abc_

- & # @

Read_

// is often used for NOT Read

2.5. Operators

Operators are one, two and sometimes three characters used to perform operations on variables. Examples include >, +, ~, &, !=. Operators are described in detail in “Operators” on p. 6.

2.6. Verilog Keywords

These are words that have special meaning in Verilog. Some examples are assign, case, while, wire, reg, and, or, nand, and module. They should not be used as identifiers. Refer to Cadence Verilog-XL Reference Manual for a complete listing of Verilog keywords. A number of them will be introduced in this manual. Verilog keywords also includes Compiler Directives (Sect. 15. ) and System Tasks and Functions (Sect. 16. ).

Friday, January 05, 2001 9:34 pm

2

Peter M. Nyasulu


Introduction to Verilog

3. Gate-Level Modelling

Primitive logic gates are part of the Verilog language. Two properties can be specified, drive_strength and delay.

Drive_strength specifies the strength at the gate outputs. The strongest output is a direct connection to a source, next comes a connection through a conducting transistor, then a resistive pull-up/down. The drive strength is usually not specified, in which case the strengths defaults to strong1 and strong0. Refer to Cadence Verilog-XL Reference Manual for more details on strengths.

Delays: If no delay is specified, then the gate has no propagation delay; if two delays are specified, the first represent the rise delay, the second the fall delay; if only one delay is specified, then rise and fall are equal. Delays are ignored in synthesis. This method of specifying delay is a special case of “Parameterized Modules” on page 11. The parameters for the primitive gates have been predefined as delays.

3.1. Basic Gates

These implement the basic logic gates. They have one output and one or more inputs. In the gate instantiation syntax shown below, GATE stands for one of the keywords and, nand, or, nor, xor, xnor.

Syntax

GATE (drive_strength) # (delays) instance_name1(output, input_1,

input_2,..., input_N), instance_name2(outp,in1, in2,..., inN);

Delays is

#(rise, fall) or

# rise_and_fall or

#(rise_and_fall)

Example 3 .1

and c1 (o, a, b, c, d);

// 4-input AND called c1 and

c2 (p, f g);

// a 2-input AND called c2.

or #(4, 3) ig (o, a, b);

/* or gate called ig (instance name);

rise time = 4, fall time = 3 */

xor #(5) xor1 (a, b, c);

// a = b XOR c after 5 time units

xor (pull1, strong0) #5 (a,b,c); /* Identical gate with pull-up strength pull1 and pull-down strength strong0. */

3.2. buf, not Gates

These implement buffers and inverters, respectively. They have one input and one or more outputs. In the gate instantiation syntax shown below, GATE stands for either the keyword buf or not

Syntax

Example 3 .2

GATE (drive_strength) # (delays)

not #(5) not_1 (a, c);

// a = NOT c after 5 time units

buf c1 (o, p, q, r, in);

// 5-output and 2-output buffers

instance_name1(output_1, output_2,

c2 (p, f g);

..., output_n, input),

instance_name2(out1, out2,

..., outN, in);

3.3. Three-State Gates; bufif1, bufif0, notif1, notif0

These implement 3-state buffers and inverters. They propagate z (3-state or high-impedance) if their control signal is deasserted. These can have three delay specifications: a rise time, a fall time, and a time to go into 3-state.

bufif0

notif0

A

BUS = Z

n

n

E

E

CTRL=1

bufif1

notif1

n

n

E

E

Example 3 .3

bufif0 #(5) not_1 (BUS, A, CTRL);

/* BUS = A

5 time units after CTRL goes low. */

notif1 #(3,4,6) c1 (bus, a, b, cntr);

/* bus goes tri-state

6 time units after ctrl goes low. */

Friday, January 05, 2001 9:34 pm

3

Peter M. Nyasulu


Introduction to Verilog

4. Data Types

4.1. Value Set

Verilog consists of only four basic values. Almost all Verilog data types store all these values:

0(logic zero, or false condition)

1(logic one, or true condition)

x (unknown logic value)

x and z have limited use for synthesis.

z (high impedance state)

4.2. Wire

A wire represents a physical wire in a circuit and is used to connect gates or modules. The value of a wire can be read, but not assigned to, in a function or block. See “Functions” on p. 19, and “Procedures: Always and Initial Blocks” on p. 18. A wire does not store its value but must be driven by a continuous assignment statement or by connecting it to the output of a gate or module. Other specific types of wires include:

wand (wired-AND);:the value of a wand depend on logical AND of all the drivers connected to it. wor (wired-OR);: the value of a wor depend on logical OR of all the drivers connected to it.

tri (three-state;): all drivers connected to a tri must be z, except one (which determines the value of the tri).

Syntax

wire [msb:lsb] wire_variable_list; wand [msb:lsb] wand_variable_list; wor [msb:lsb] wor_variable_list; tri [msb:lsb] tri_variable_list;

Example 4 .1

wire c

// simple wire

wand d;

assign d = a;

// value of d is the logical AND of

assign d = b;

// a and b

wire [9:0] A;

// a cable (vector) of 10 wires.

4.3. Reg

A reg (register) is a data object that holds its value from one procedural assignment to the next. They are used only in functions and procedural blocks. See “Wire” on p. 4 above. A reg is a Verilog variable type and does not necessarily imply a physical register. In multi-bit registers, data is stored as unsigned numbers and no sign extension is done for what the user might have thought were two’s complement numbers.

Syntax

Example 4 .2

reg [msb:lsb] reg_variable_list;

reg a;

// single 1-bit register variable

reg [7:0] tom;

// an 8-bit vector; a bank of 8 registers.

reg [5:0] b, c;

// two 6-bit variables

4.4. Input, Output, Inout

These keywords declare input, output and bidirectional ports of a module or task. Input and inout ports are of type wire. An output port can be configured to be of type wire, reg, wand, wor or tri. The default is wire.

Syntax

input [msb:lsb] input_port_list; output [msb:lsb] output_port_list; inout [msb:lsb] inout_port_list;

Example 4 .3

module sample(b, e, c, a); //See “Module Instantiations” on p. 10

input a;

// An input which defaults to wire.

output b, e;

// Two outputs which default to wire

output [1:0] c;

/* A two-it output. One must declare its

type in a separate statement. */

reg [1:0] c;

// The above c port is declared as reg.

Friday, January 05, 2001 9:34 pm

4

Peter M. Nyasulu