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

Algosup Fpga Course Day 1 Slides

Uploaded by

Samir Deramchi
Copyright
© © All Rights Reserved
Available Formats
Download as PDF, TXT or read online on Scribd
0% found this document useful (0 votes)
8 views

Algosup Fpga Course Day 1 Slides

Uploaded by

Samir Deramchi
Copyright
© © All Rights Reserved
Available Formats
Download as PDF, TXT or read online on Scribd
You are on page 1/ 111

FPGA Seminar

ALGOSUP
About Me – Russell Merrick
• Vision Pipeline FPGA Designer, BAE Systems
• High reliability, fast signals, video, on aircraft
• Started Nandland after frustrations as an FPGA
beginner

• FPGA Designer, L-3 Communications


• Vision pipeline, low-power applications, high
reliability, small form factor

• FPGA and Embedded, Accion Systems


• Satellites, radiation tolerance, low-power

• Nandland.com
• Created the “Go Board”
• Writer of “Getting Started with FPGAs”
• YouTube channel
FPGA Introduction
• FPGA = Field Programmable Gate Array

• Field Programmable means it can be reprogrammed “in the field”

• Gate Array is an anachronism, no longer true

• Also not always Field Programmable!


• E.g. One Time Programmable FPGAs

• But the name is sticky


Common FPGA Usages
FPGA Usage
• Fast processing

• Unique Requirements

• Lots of Data

• Lots of Math

When you see these, FPGAs might be good tool to use!


Binary
• Have you ever wondered why computers use binary?

• In binary data is represented as:


• 0, 1
• False, true
• Low, high

• At the lowest level, this is the presence (or absence) of voltage

• Transistors are the fundamental component controlling this voltage


Transistor Appreciation Time
• Possibly THE single most important invention in modern times
Transistor Facts
• Created in 1947 at Bell Labs

• Enabled the digital age


• Building block of all integrated circuits (ICs)
• Creates a switch

20 BILLION
• Moore’s Law
• # of transistors in an IC doubles every 2 years
TRANSITORS IN A
MODERN
PROCESSOR!
Transistors and Binary
• Transistors store 0, 1 state

• Binary is 0, 1 state

• We need to understand how binary works


Dec Hex Binary
0 0x0 0000
Binary vs. Hex vs.
1 0x1 Decimal 0001
2 0x2 0010
3 0x3 0011
4 0x4 0100
5 0x5 0101
6 0x6 0110
7 0x7 0111
8 0x8 1000
9 0x9 1001
10 0xA 1010
11 0xB 1011
12 0xC 1100
13 0xD 1101
14 0xE 1110
15 0xF 1111
How many bits do we need?
• For 0, 1 = 1 bit
• For 0, 1, 2, 3 = 2 bits
• For 0, 1, 2, 3, 4, 5, 6, 7 = 3 bits
• For 0-15 = 4 bits
• For 0-31 = 5 bits
• For 0-63 = 6 bits

• In general, 2^N-1 where N is number of bits


FPGA Basics
• Two critical components
• LUT
• Flip-Flop

• Solid understanding of both is required to be a good FPGA designer

• We will introduce these two components and then learn how they
each work in projects
What is a LUT
• One of the 2 most critical components in your FPGA

• What is Boolean algebra?

• How is it performed inside of an FPGA?

• The Look-Up Table (LUT)


• How it can perform any Boolean algebra equation
Exploring Boolean Logic Gates
• Navigate to
https://logic.ly/demo/

• We can see how gates work


• AND
• OR
• NOT
• NOR
• NAND
• etc
And Gate

Truth Table
Input A Input B Output Q
0 0 0
0 1 0
1 0 0
1 1 1
And Gate

Connect circles with


wires by clicking and
drawing

Ensure you’re able to create AND gate. Verify its behavior


Or Gate

Truth Table
Input A Input B Output Q
0 0 0
0 1 1
1 0 1
1 1 1
Not Gate

Truth Table
Input A Output Q
0 1
1 0
Nor Gate

Truth Table
Input A Input B Output Q
0 0 1
0 1 0
1 0 0
1 1 0
Xor Gate

Truth Table
Input A Input B Output Q
0 0 0
0 1 1
1 0 1
1 1 0
Nand Gate

Truth Table
Input A Input B Output Q
0 0 1
0 1 1
1 0 1
1 1 0
Combining Gates with Boolean Algebra

Truth Table – A*B + A’


Input A Input B Output Q
0 0 1
0 1 1
1 0 0
1 1 1

Create this circuit in logic.ly. Fill in the last column of the truth table
by going through each input combination
Combining Gates with Boolean Algebra
Truth Table – A+(C*B')
Input A Input B Input C Output Q
0 0 0 0
0 0 1 1
0 1 0 0
0 1 1 0
1 0 0 1
1 0 1 1 Create this circuit in logic.ly. Fill in the last
1 1 0 1 column of the truth table
1 1 1 1 by going through each input combination
The Look-Up Table does all Boolean Algebra!

And gates, Or Gates, Nor Gates, etc, DO NOT EXIST ON A REAL FPGA!

But we can perform those functions with a LUT


4+ Inputs? No Problem

IN4

We can cascade LUTs to do more complicated operations!


Summary
• The LUT is one of the two most fundamental components in your
FPGA

• It can perform any Boolean algebra equation

• Multiple LUTs can be cascaded for more complicated equations

• The LUT output is evaluated IMMEDAITELY!


FPGA History
• Originally, FPGAs could only do
simple boolean algebra

• But this was still very important


in 1980s

• You can now change your circuit!

• FPGAs have gotten much more


complex
The Flip-Flop
• Second critical FPGA component

• Store state, ability to remember

• LUTs are instant, flip-flops have memory

• Knowing passage of time is impossible without flip-flops


D Flip-Flop Block Diagram

Input Data (D)


Input Enable (En)
Input Clock (>)
Output Q
The Clock
• The key to driving all flip-flops
• Main gear / heartbeat

• 99% of the time, rising edge

• 50% Duty cycle

• Frequency (Hz) / Period (ns)


• E.g. 10 MHz = 100 ns
Clock Tree

• Dedicated Input Pin Used

• Dedicated Routing Logic


used to minimize skew
Flip-flop in action

• Assume clock enable always high

• Registers data on rising edge

• Doesn’t “see” changes until edge


of the clock
2nd Example – Clock Enable always high
Flip-Flop example with Clock Enable

We can now remember past values! LUTs cannot, but Flip-Flops can!
Flip-Flop in Logic.ly
• Create this circuit

• Select D-Flip-Flop

• Select Clock

• Ensure to tie PRE’ and CLR’ to 1


(high constant)

• Toggle switch and check that LED


output only changes on rising edge
Chaining flip-flops
Flip-Flop Chain in Logic.ly

Draw the circuit, verify behavior of each Flip-Flop adding delay


T and JK Flip-Flops are a waste of time
• The D Flip-Flop is the workhorse

• T and JK flip-flops are not relevant in modern FPGA design


LUTs and Flip-flops on a real FPGA
Summary
• LUT and Flip-Flop are the two FPGA work-horses

• LUTs handle all Boolean algebra

• Flip-Flops store state (remember past values)

• Clocks are fundamental, your FPGA heartbeat


• They drive all flip-flops in your design
The Go Board
Project: Frogger
Frogger – Hardware Setup

Monitor Go Board

VGA Cable
Frogger
• You control a frog’s movement on the monitor

• Buttons on Go Board are used to direct frog up, down, left right

• Cars move horizontally

• If frog is hit by car the game is over

• Level is indicated on 7-segment display


Project Frogger – Playable Area
20

A single 1x1 cell

Frog can move anywhere within 20x15 grid


(20 x 15 = 300 cells total)
15
If it gets hit by a car the game is over
Project Frogger – Frog control

Frog occupies one 1x1 cell

The frog changes direction based on


button pressed (up, down, left, right)

F
Project Frogger – Car Control
Cars (C) appear

C Can travel either left or right


C
One car per “row”
C
C Cars can move at different speeds
C
Cars can have different lengths
C

F
Project Frogger – Level Display
F When Frog reaches the top row, frog
resets to bottom
C
Level counter on 7-segment display
C
increments
C
C
C

C
Time check for lab component
Programming Language on FPGA
• Type of Hardware Description Language (HDL)
• We are literally designing wires, gates, etc, “describing hardware”

• Verilog and VHDL are the two most popular

• We will be focused on Verilog

• Most similar to C

• Specifically for FPGA development


Coding Tool
• Recommended: Microsoft VS
Code
https://code.visualstudio.com/

• Built-in syntax highlighting for


Verilog

• Lots of extensions (amazing!)


A note about ChatGPT
• ChatGPT is extremely good at helping you along in your FPGA (and
programmer) development

• Back-and-forth questions are the best ways to have success

• But it can make mistakes, so verify all output yourself

Don’t
• In general, if you’re forget
stuck, to thank
ask ChatGPT likethe AIasking
you’re  a teacher
Lab Component
When Should/Shouldn’t you use FPGA
• Often need “smarts” in electronics
• Toys, Consumer Electronics, Industrial Robotics, etc, all needs it.
• Two possible options:
• FPGAs
• Microcontrollers
• (also ASICs for very high volume)
FPGA Basics
• Basic building blocks
• Look-Up Table (LUT)
• Flip-Flop/Register

• Written in VHDL or Verilog

• Program discrete components


and wires

• Often no CPU
Microcontroller Basics
• Has a processor (CPU)

• Often written in C

• Discrete blocks perform functions


FPGA Strengths
• Parallelization
• Lots of math, especially multiply
• Lots of I/O possible
• Highly Customizable
• High Bandwidth throughput
Microcontroller Strengths
• Cost (this is why there are so many!)
• Relative Simplicity (vs. FPGA)
• Physically small
• Many functions built-in
• E.g. USB, UART, SPI, ADC, DAC, etc.
• Thousands of unique variants
• Can pick exactly your need
• Low Power
How to Choose?
• Know your requirements!

• What’s #1, #2, #3 most important?

• Weigh solutions and pick best


Example #1
• Russell is tasked with taking HD image data from a computer, filtering
it, and sending it to an OLED screen to display

• Req #1 - Needs custom interfaces


• Req #2 - Lots of Math
• Req #3 - Low Power
• Req #4 - Cost
Winner – FPGA
• Oculus Rift VR Headset
Example #2
• Russell is tasked with taking ultrasonic sensor data and determining
distance to objects

• Req #1 - Proof of concept needed in 2 months


• Req #2 - Cost
• Req #3 - Low Power
• Req #4 - Basic math, can be slow
Winner - Microcontroller
• Amazon “Scout”
autonomous delivery
When is FPGA the right tool?
• Microcontrollers are easier, faster to program, & cheaper than FPGAs

• FPGAs fill a niche

• Whenever someone asks me to use an FPGA, first question I ask:


• “Are you sure?”

• Engineering is about choosing the right tool for the job


Hardware Setup (~15 min)
• Open source FPGA build tools:
APIO

• OR iCEcube2 from Lattice

• We will be using APIO open


source tools

• Get setup and make sure


Example LED blinky is working!
How to Setup Apio Project
• Open command prompt (Run As Administrator)
• Create new directory for your work
• Type: apio init –b “go-board” –t “project_gates”
• Should see: File 'apio.ini' has been successfully created!

• Open this file and look at it, can manually edit if needed.
How do we know what is where?
• Go Board Schematic has this
information

• Shows all connections on Go Board

• Need to know which PIN NUMBER


the LEDs and Switches are
physically connected to.

• Helpful to have some basic EE


knowledge as FPGA designer
Tell APIO about the Pins
• Physical Constraints File (.pcf)

• Create new file called “Go_Board_Constraints.pcf”


and add these lines to it:

### LED Pins:


set_io o_LED_1 56

## Push-Button Switches
set_io i_Switch_1 53
set_io i_Switch_2 51
Project – LUT
LUT, as And Gate

Truth Table
Input A Input B Output Q
0 0 0
0 1 0
1 0 0
1 1 1
Let’s describe some hardware
module project_gates
(input i_Switch_1, Save your file “project_gates.v”
input i_Switch_2,
output o_LED_1);
module / endmodule
assign o_LED_1 = i_Switch_1 & i_Switch_2;
Inputs first, outputs second
endmodule

“assign” keyword in Verilog is used


to assign an output

“&” is the AND operator

~15 minute project


Post-Synthesis Results
Resource Usage Report for And_Gate_Project

Mapping to part: ice40hx1kvq100


Cell usage:
SB_LUT4 1 use

1 I/O ports: 3
I/O primitives: 3
SB_IO 3 uses

I/O Register bits: 0


Register bits not including I/Os: 0 (0%)
Total load per clock:

Mapping Summary:
2 Total LUTs: 1 (0%)
Project: Implement Gates (~15 min)
• Add two new inputs (i_Switch_3 and i_Switch_4)
• Add one new output (o_LED_2)
• Make sure to add these to your constraint file too!
• i_Switch_3 = Pin 54
• i_Switch_4 = Pin 52
• o_LED_2 = Pin 57

• Create XOR gate, verify with truth tables or Logic.ly

• Notice that both AND gate and XOR gate are running in parallel and the
output is evaluated immediately.
Verilog Code – Project Solution

module project_gates
• Notice that these two assigns
(input i_Switch_1, will execute in parallel (at the
input i_Switch_2,
input i_Switch_3,
same time)
input i_Switch_4,
output o_LED_1,
output o_LED_2);
• They’re always “running” (and
assign o_LED_1 = i_Switch_1 & i_Switch_2; there’s no delay from input to
assign o_LED_2 = i_Switch_3 ^ i_Switch_4;
output)
endmodule
SW1 SW2 SW3 SW4 LED1 LED2 LED3

Project – Boolean Algebra 0


0
0
0
0
0
0
1
0 0 1 0
0 0 1 1
0 1 0 0
0 1 0 1
0 1 1 0
0 1 1 1
1 0 0 0
1 0 0 1
1 0 1 0
1 0 1 1
1 1 0 0
1 1 0 1
1 1 1 0
1 1 1 1

1. Create this circuit in your FPGA


2. Fill in truth table
~30 minutes 3. Verify with Logic.ly
SW1 SW2 SW3 SW4 LED1 LED2 LED3

Project – Solution 0
0
0
0
0
0
0
1
1
1
0
0
1
1
0 0 1 0 0 0 0
0 0 1 1 0 0 0
0 1 0 0 0 0 0
0 1 0 1 1 1 1
0 1 1 0 0 0 0
0 1 1 1 1 1 0
1 0 0 0 1 0 1
1 0 0 1 1 0 1
1 0 1 0 1 1 1
1 0 1 1 1 1 1
1 1 0 0 0 0 0
1 1 0 1 1 1 1
1 1 1 0 1 1 0
1 1 1 1 1 1 1
Project - Code
module project_boolean_algebra
(input i_Switch_1,
input i_Switch_2,
input i_Switch_3,
input i_Switch_4,
output o_LED_1,
output o_LED_2,
output o_LED_3);

assign o_LED_1 = o_LED_2 | o_LED_3;


assign o_LED_2 = (i_Switch_1 & i_Switch_3 ) | (i_Switch_2 & i_Switch_4);
assign o_LED_3 = (i_Switch_1 | ~i_Switch_3 ) & (~i_Switch_2 | i_Switch_4);

endmodule
module project_boolean_algebra_wires

Project – With Wires (input i_Switch_1,


input i_Switch_2,
input i_Switch_3,
input i_Switch_4,
z1 output o_LED_1,
output o_LED_2,
output o_LED_3);

wire w_z1, w_z2, w_z3, w_z4;


z2
assign w_z1 = i_Switch_1 & i_Switch_3;
assign w_z2 = i_Switch_2 & i_Switch_4;
assign w_z3 = i_Switch_1 | ~i_Switch_3;
assign w_z4 = ~i_Switch_2 | i_Switch_4;
z3 assign o_LED_1 = o_LED_2 | o_LED_3;
assign o_LED_2 = w_z1 | w_z2;
assign o_LED_3 = w_z3 & w_z4;
z4
endmodule

Same circuit being described with intermediary wires.

Always more than 1 way to write the same functional code.


Ternary Operator - ?
• ? allows us to make a selection between two choices

assign output = select ? value_if_true : value_if_false;

Output Selector Assignment Assignment


if true if false

• Useful to create a multiplexer (mux)


Multiplexer (Mux)
• Selects between multiple inputs
to single output

• Ex. Fan control, LED output


select, etc.
sel1 sel2 out
0 0 in1
0 1 in2
1 0 in3
1 1 in4
Multiplexer in Verilog

sel1 sel2 out


0 0 in1
0 1 in2
1 0 in3
1 1 in4

assign out = !sel1 & !sel2 ? in1 :


!sel1 & sel2 ? in2 :
sel1 & !sel2 ? in3 : in4;

Ternary Operator: ?
Demultiplexer (Demux)
• Opposite of mux

• Takes 1 input, selects to multiple outputs

• Muxes and Demuxes can come in any size


• 7-1 Mux, 1-7 Demux
• 16-1 Mux, 1-16 Demux
• Etc

• Simple to implement in Verilog, doesn’t require dedicated module


Module Instantiation in Verilog
• FPGAs can be thought of like Legos.

• Build up complicated designs from simple building blocks

• Modules allow us to build a component and use it over and over


Module Instantiation in Verilog
• Module Name wire w_Input;
• The module you’re instantiating. wire w_Output;
Matches the .v file name
module_name INSTANCE_NAME
• INSTANCE NAME (.i_1(w_Input),
• Can be anything you like .o_1(w_Output));

• Signal mapping
• Explicit connections between
module signals (left) and high level
signals (right)
Project – And Gates using Module
Instantiation
• Create a module called and_gate
• Two inputs, one output
• Performs AND operation

• Create another module called project_and_gates


• Four inputs (push-button switches)
• Two outputs (LEDs)
• Connect everything together

• Wire up two and_gate modules and verify behavior


Project – Solution module project_and_gates
(input i_Switch_1,
input i_Switch_2,
input i_Switch_3,
input i_Switch_4,
output o_LED_1,
module and_gate output o_LED_2);
(input i_1,
input i_2, and_gate GATE_1
output o_1); (.i_1(i_Switch_1),
.i_2(i_Switch_2),
assign o_1 = i_1 & i_2; .o_1(o_LED_1));

endmodule and_gate GATE_2


(.i_1(i_Switch_3),
.i_2(i_Switch_4),
.o_1(o_LED_2));

endmodule
Summary
• All projects have been working with LUTs only

• Output is evaluated immediately

• We have seen how FPGAs use simple building block

• Modules can be built and used in other modules to create hierarchy


Always Block
• Always blocks allow us to create Flip-
Flops!
• Flip-Flops give FPGA ability to remember

• posedge is reserved word in Verilog always @(posedge i_Clock)


begin
• Sensitivity list is in () // Do something
end
• begin/end are like {} in C

• // is a comment in Verilog
Creating our first Flip-Flop
reg r_Switch_1;
i_Switch_1 r_Switch_1
always @(posedge i_Clock)
1 begin
r_Switch_1 <= i_Switch_1;
i_Clock end
If/else statements
always @(posedge i_Clock)
• We can use if statements within begin
always blocks
if (Value > Check)
begin
// Do something
• Allows us to check equality, end
compare numbers, check if a
else
pulse is high, etc. begin
// Do something else
end
• Use begin/end like {} end
Reg vs. Wire
• reg is reserved keyword in Verilog
• Short for “register” which is another word for Flip-Flop

• For example: reg r_LED_State;


• I like to put r_ in front of registers
• Create flip-flops (registers) using <= operator

• Wire is also a reserved word.


• I like to put w_ in front of wires: wire w_Switch;

• Signals defined as reg can be assigned in an always block


• Signals defined as wire cannot be assigned in an always block
Thinking about Reg vs. Wire
• Think of Reg as register / Flip-Flop

• Think of wire as a piece of wire, has no storage of state

• What else has no ability to store state? LUT!

• Wire = LUT behavior (or just intermediary signals)

• Reg = Flip-Flop behavior


Project – Light up “LED”
• Light up an LED when button is released

• Will require 2 flip-flops to implement, and one LUT

• Need to look for the falling edge of the button press


Falling Edge Detection

CLK

Falling Edge
SW1 Detection

r_Switch_1
Block Diagram
• Suggest always block diagram

• Helps to define modules and


interfaces

• Shows high level flow of


information
30 min project
module project_flip_flop • “assign” keyword not needed
(input i_Clk,
input i_Switch_1, inside always blocks
output o_LED_1);

reg r_LED_1;
reg r_Switch_1;
• Use “<=” assignment for flip-
flops
always @(posedge i_Clk)
begin
// 1. Create r_Switch_1 flip-flop
• Inversion achieved with “~”
// 2. Look for falling edge condition (NOT gate)
(switch is released)

// 3. Use that to toggle LED flip-flop


end CLK

Falling Edge
assign o_LED_1 = r_LED_1; SW1 Detection
endmodule
r_Switch_1
Resource + Clock Report
• Resource Usage Report for LED_Toggle_Project

• Mapping to part: ice40hx1kvq100
• Cell usage:
• SB_DFF 2 uses
• SB_LUT4 1 use

1::Clock Frequency Summary
• I/O ports: 3
==========================================================
• I/O primitives: 3
Number of clocks: 1
• SB_GB_IO 1 use
Clock: i_Clk | Frequency: 654.05 MHz | Target: 25.00 MHz |
• SB_IO 2 uses

• I/O Register bits: 0
• 1 Register bits not including I/Os: 2 (0%)
• Total load per clock:
• 2 LED_Toggle_Project|i_Clk: 1
• Mapping Summary:
• 3 Total LUTs: 1 (0%)
Project 2 - Discussion
• First use of clock, needed for Flip-Flop!
• Flip-Flops store state (past/memory)
• Did this line look weird?
• r_LED_1 <= ~r_LED_1;
• Will be updated on NEXT clock cycle

• Thinking in terms of clock cycles and flip-flops takes practice.

• Challenge question: Why does the LED sometimes toggle, but not
always?
Combinational vs. Sequential Logic
• Combinational Logic
• Logic for which the outputs are determined from present inputs, with no
memory of the previous state
• Also called Combinational

• Sequential Logic
• Logic for which the outputs are determined from both present inputs and
previous outputs
• Also called Synchronous

• Flip flops are sequential, because they depend on the previous output
Combinational Always Blocks
• Recommend avoiding

• E.g. always @ (input_1 or input_2)


begin
and_gate <= input_1 & input_2;
end

Dangerous, can cause latches!


Sequential Always Blocks
• Has only clock (or sometimes reset)

• Every time you see an always block, you know it’s going to generate
sequential logic.

always @ (posedge i_Clk)


• Safe, no latches begin
and_gate <= input_1 & input_2;
end
Simulation and Testbenches
• Two ways to find bugs:
• On Hardware
• EXTREMELY time consuming, esp in large designs
• FPGAs are a block box

• In Simulation
• All signals become visible
• Makes the black box a white box

• Story of coworker struggles


The Testbench

• Purpose is to exercise your UUT

• Generates stimulus to UUT

• Monitors outputs of UUT


FPGA Simulation Tools
• Modelsim
• $$$

• Built-in Simulators
• Vivado
• Quartus

• Free Simulator
• EDA Playground
https://edaplayground.com
Writing Simple Testbench
module And_Gate_Project initial
(input i_Switch_1, begin
input i_Switch_2, $dumpfile("dump.vcd"); $dumpvars;
output o_LED_1); r_In1 <= 1'b0;
r_In2 <= 1'b0;
assign o_LED_1 = i_Switch_1 & i_Switch_2; #10;
r_In1 <= 1'b0;
endmodule r_In2 <= 1'b1;
#10;
module And_Gate_TB(); r_In1 <= 1'b1;
r_In2 <= 1'b0;
reg r_In1, r_In2; #10;
wire w_Out; r_In1 <= 1'b1;
r_In2 <= 1'b1;
And_Gate_Project UUT #10;
(.i_Switch_1(r_In1), $finish();
.i_Switch_2(r_In2), end
.o_LED_1(w_Out)); endmodule
Waveforms
• Can show all signals with your design
• Require visual inspection to show code is functioning as expected
• Great for debugging, but can be tedious in large designs
How to improve this testbench?
• Every time we run the simulation, we need to look at the waveforms
• Tedious, time-consuming, can be prone to error

• If a new designer comes along, or if it’s been years since you’ve


worked it, how do you know everything is working?

• If you change/add code, how to you ensure you didn’t break old
stuff? (big issue!)
Self-Checking Testbenches
• Add “asserts” into your testbenches
• E.g. assert (expected_value == actual_value)
• Produces PASS/FAIL results, no waveform viewing required
• Can run multiple simulations quickly
• Can perform regression testing
• If you modify existing code, you can be confident you didn’t break
some old code
SystemVerilog
• Superset of Verilog (contains everything in Verilog, and much more)

• Used primarily for simulation, test, verification

• Also has new synthesizable features

• E.g. Classes, Interfaces, Sequences, Assertions


Assertions
• Biggest bang-for-buck for writing self-checking testbenches

assert (statement_to_check);

You might also like