0% found this document useful (0 votes)
154 views

Verilog For Verification

This document provides an overview of Verilog for verification. It discusses various topics such as modules, data types including nets, variables, parameters and others. It also describes procedural blocks, operators, tasks and functions. Finally, it discusses various system tasks for STDIO, file I/O and other purposes as well as compiler directivities in Verilog.

Uploaded by

Mr.Puppy
Copyright
© © All Rights Reserved
Available Formats
Download as PDF, TXT or read online on Scribd
0% found this document useful (0 votes)
154 views

Verilog For Verification

This document provides an overview of Verilog for verification. It discusses various topics such as modules, data types including nets, variables, parameters and others. It also describes procedural blocks, operators, tasks and functions. Finally, it discusses various system tasks for STDIO, file I/O and other purposes as well as compiler directivities in Verilog.

Uploaded by

Mr.Puppy
Copyright
© © All Rights Reserved
Available Formats
Download as PDF, TXT or read online on Scribd
You are on page 1/ 23

VERILOG FOR VERIFICATION

An Pham-Duc

Contents

Modules
Data types
Procedural blocks
Operators
Tasks & functions
System tasks
Compiler directivities

Modules

Basic unit of hierarchy in


Verilog
A module in Verilog is
somewhat like a function in C
Modules are static instances

// module declaration
module module_name #(
parameter_declaration,
parameter_declaration,
...
)(
port_declaration port_name,
port_declaration port_name,
...
);
endmodule
// module instance
module_name #(
.parameter_name(value),
.parameter_name(value),
...
) instance_name (
signal,
...
);

Modules

Data types: net


Net Declaration Examples

Notes

wire a, b, c;

3 scalar (1-bit) nets

tri1 [7:0] data_bus;

8-bit net, pulls-up when tri-stated

wire signed [1:8] result;

an 8-bit signed net

wire [7:0] Q [0:15][0:256];

a 2-dimensional array of 8-bit wires

wire #(2.4,1.8) carry;

a net with rise, fall delays

wire [0:15] (strong1,pull0)


sum = a + b;

a 16-bit net with drive strength and a continuous assignment

trireg (small)
#(0,0,35) ram_bit;

net with small capacitance and 35 time unit decay time

Data types: variable


Data types

Description

reg

a variable of any bit size; unsigned unless explicitly declared as signed

integer

a signed 32-bit variable

time

an unsigned 64-bit variable

real

a double-precision floating point variable

realtime

same as real

Data types: variable


Variable Declaration Examples

Notes

reg a, b, c;

three scalar (1-bit) variables

reg signed [7:0] d1, d2;

two 8-bit signed variables

reg [7:0] Q [0:3][0:15];

a 2-dimensional array of 8-bit variables

integer i, j;

two signed integer variables

real r1, r2;

two double-precision variables

reg clock = 0, reset = 1;

two reg variables with initial values

Data types: others


Data types

Description

parameter

a run-time constant for storing integers, real numbers, time, delays, or ASCII
strings; may be redefined for each instance of a module (see section 7.0)

localparam

a local constant for storing integers, real numbers, time, delays, or ASCII
strings; may not be directly redefined, but may be indirectly redefined by
assigning the localparam the value of a parameter

specparam

a specify block constant for storing integers, real numbers, time, delays or
ASCII strings; may be declared in the module scope or the specify block
scope; may be redefined through SDF files or the PLI

genvar

a temporary variable used only within a generate loop; cannot be used


anywhere else, and cannot be read during simulation

event

a momentary flag with no logic value or data storage; can be used for
synchronizing concurrent activities within a module

Data types: others


Data Type Examples

Notes

parameter [2:0] s1 = 3b001,


s2 = 3b010,
s3 = 3b100;

three 3-bit constants

parameter integer period = 10;

an integer constant

localparam signed offset = -5;

unsized signed constant defaults to width of initial value

event data_ready, data_sent;

two event data types

Data types: bit/array select


Types

Syntax

Bit Select

vector_name[bit_number]

Constant Part Select

vector_name[bit_number : bit_number]

Variable Part Select

vector_name[starting_bit_number +: part_select_width]
vector_name[starting_bit_number -: part_select_width]

Array Selects

array_name[index][index]
array_name[index][index]...[bit_number]
array_name[index][index]...[part_select]

Procedural blocks
// syntax
type_of_block @(sensitivity_list)
statement_group: group_name
local_variable_declarations
time_control procedural_statement
end_of_statement_group

Type of block: initial & always


Sensitivity list: signals, posedge, negedge, * (wildcard)
Statement group: begin-end & fork-join
Group name (optional): optional
Local variables (optional): data types
Time control: #delay, @, wait
Procedural statement: assignment statement & programming
statement

Procedural blocks

Assignment statements

blocking ( = )
non-blocking ( <= )
assign
deassign
force
release

Procedural blocks

Programming statements

if-else
case/casez/casex-endcase
for
while
repeat
forever
disable

Operators

Bitwise Operators: ~, &, |, ^, ~^, ^~, <<, >>


Unary reduction Operators: &, ~&, |, ~|, ^, ~^, ^~
Logical Operators: !, &&, ||
Equality and Relational Operators: ==, !=, <, >, <=,
>=
Identity Operators: ===, !==
Miscellaneous Operators: ?:, {}, {{}}, ->
Arithmetic Operators: +, -, -, *, /, %, **, <<<, >>>

Tasks & functions


// task declaration
task automatic task_name (
port_declaration port_name,port_name,... ,
port_declaration port_name,port_name,...
);
local variable declarations
procedural_statement or statement_group
endtask

// function declaration
function automatic range_or_type function_name (
input range_or_type port_name,port_name,... ,
input range_or_type port_name,port_name,...
);
local variable declarations
procedural_statement or statement_group
endfunction

System tasks: STDIO


Syntax: $system_task(text_with_format_specifiers,
list_of_arguments);
$display: print the message and add a newline
$write: print the message
$strobe: like $display, except that the printing is
delayed until the end of simulation time slot
$monitor: create background process, print the
message whenever one of the arguments changes

System tasks: STDIO


Text Formatting Codes
%b
%o
%d
%h
%e
%f
%t
%s

binary values
octal values
decimal values
hex values
real valuesexponential
real valuesdecimal
formatted time values
character strings

%m
%l
\t
\n
\
\\
%%

hierarchical name of scope


configuration library binding
print a tab
print a newline
print a quote
print a backslash
print a percent sign

%0b, %0o, %0dand %0h truncates any leading zeros in the value.
%e and %f may specify field widths (e.g. %5.2f).
%m and %l do not take an argument; they have an implied argument value.
The format letters are not case sensitive (i.e. %band %Bare equivalent).

System tasks: file I/O

mcd = $fopen(file_name);
fd = $fopen(file_name,type);
$fclose(mcd_or_fd);
$fmonitor(mcd_or_fd, text with format specifiers, signal, signal,...);
$fdisplay(mcd_or_fd, text with format specifiers, signal, signal,...);
$fwrite(mcd_or_fd, text with format specifiers, signal, signal,...);
$fstrobe(mcd_or_fd, text with format specifiers, signal, signal,...);

System tasks: file I/O

c= $fgetc(fd);
code= $ungetc(c, fd);
code= $fgets(str, fd);
code= $fscanf(fd, format, arguments);
code= $fread(reg_variable, fd);
code= $fread(memory_array, fd, start, count);
position= $ftell(fd);
code= $fseek(fd, offset, operation);
code= $rewind(fd);
errno= $ferror(fd, str);
$fflush(mcd_or_fd);

System tasks: others

$finish/$stop
$time
$timeformat(unit, precision, suffix, min_field_width);
$swrite(reg_variable, format, arguments, format, arguments,...);
$sformat(reg_variable, format, arguments);
code= $sscanf(str, format, arguments);
$readmemb(file_name, variable_array, start_address, end_address);
$readmemh(file_name, variable_array, start_address, end_address);
64-bit_reg_variable= $realtobits(real_variable);
real_variable= $bitstoreal(64-bit_reg_variable);
integer= $test$plusargs(invocation_option)
integer= $value$plusargs(invocation_option=format, variable)

Compiler directivities

`timescale
`define
`undef
`ifdef
`ifndef
`else
`elsif
`endif
`include

References
[1] Stuart Sutherland, Verilog-HDL Quick Reference
Guide, Sutherland HDL Inc, Sep 2007

Assignments
1.

Write a simple program in Verilog that:


1.
2.
3.
4.

2.

Read video data from a binary file, invoke an error if failed


Print video information to monitor (get form SPC file)
Invert video data
Write it back to another binary file

Write a clock/reset module

You might also like