03 Systemverilog PDF
03 Systemverilog PDF
A Brief
Introduction to
SystemVerilog
Instructor: Nima Honarmand
(Slides adapted from Prof. Milders ESE-507 course)
Spring 2015 :: CSE 502 Computer Architecture
Modules
The basic building block in SystemVerilog
Interfaces with outside using ports
Ports are either input or output (for now) all ports declared here
module name
5
Spring 2015 :: CSE 502 Computer Architecture
Module Instantiation
name of module mymodule(a, b, c, f);
module to output f;
instantiate input a, b, c;
module_name inst_name(port_connections);
endmodule
6
Spring 2015 :: CSE 502 Computer Architecture
// by order
module mod2(input c, d, output g);
mod1 i0(c, d, g);
endmodule Advice: Use
by-name
// by name connections
module mod3(input c, d, output g); (where possible)
mod1 i0(.f(g), .b(d), .a(c));
endmodule
7
Spring 2015 :: CSE 502 Computer Architecture
Combinational Logic
Description
Spring 2015 :: CSE 502 Computer Architecture
Structural Design
Example: multiplexor
Output equals an input
Which one depends on sel
logic c, d, not_sel;
Continuous Assignment
Specify logic behaviorally by writing an expression
to show how the signals are related to each other.
assign statement
module mux2(a, b, sel, f);
output f;
input a, b, sel;
logic c, d;
d
assign c = a & (~sel);
assign d = b & sel;
assign f = c | d;
c
// or alternatively
assign f = sel ? b : a;
endmodule
10
Spring 2015 :: CSE 502 Computer Architecture
always_comb begin
if (sel == 0) begin
f = a; Important: for behavior to be
end combinational, every output (f)
else begin must be assigned in all possible
f = b; control paths
end
end Why? Otherwise, would be a latch
endmodule and not combinational logic.
Spring 2015 :: CSE 502 Computer Architecture
Multiply-Assigned Values
module bad2(...); Both of these
... blocks execute
always_comb begin
b = ... something ... concurrently
end
always_comb begin So what is the
b = ... something else ...
end
value of b?
endmodule We dont know!
Dont do this!
Spring 2015 :: CSE 502 Computer Architecture
Multi-Bit Values
Can define inputs, outputs, or logic with multiple bits
module mux4(a, b, sel, f);
output logic [3:0] f;
input [3:0] a, b;
input sel;
always_comb begin
if (sel == 0) begin
f = a;
end
else begin
f = b;
end
end
endmodule
Spring 2015 :: CSE 502 Computer Architecture
Arithmetic Operators
Standard arithmetic operators defined: + - * / %
Many subtleties here, so be careful:
four bit number + four bit number = five bit number
Or just the bottom four bits
arbitrary division is difficult
Spring 2015 :: CSE 502 Computer Architecture
assign f = d + e; assign c = a + b;
Multiplication
Multiply k bit number with m bit number
How many bits does the result have? k+m
logic signed [3:0] a, b;
logic signed [7:0] c;
assign a = 4'b1110; // -2
assign b = 4'b0111; // 7
assign c = a*b; c = 8b1111_0010 == -14
Sequential Logic
Description
Spring 2015 :: CSE 502 Computer Architecture
Sequential Design
Everything so far was purely combinational
Stateless
New constructs
always_ff @(posedge clk, )
non-blocking assignment <=
Spring 2015 :: CSE 502 Computer Architecture
Edge-Triggered Events
Variant of always block called always_ff
Indicates that block will be sequential logic (flip flops)
Without reset:
module flipflop(d, q, clk);
input d, clk;
output logic q;
Design Example
Lets say we want to compute f = a + b*c
b and c are 4 bits, a is 8 bits, and f is 9 bits
State names 0
Transition values
0
Reset state D/10 B/00
0 1
1
1
0
C/11
Spring 2015 :: CSE 502 Computer Architecture
always_comb begin 1
case(state) 0
C/11
STATEA: y = 2'b00;
STATEB: y = 2'b00;
STATEC: y = 2'b11;
STATED: y = 2'b10;
endcase
end
endmodule
Spring 2015 :: CSE 502 Computer Architecture
Arrays
module multidimarraytest();
logic [3:0] myarray [2:0];
Assertions
Assertions are test constructs
Automatically validated as design is simulated
Written for properties that must always be true
rd_en status_empty
Assertions
A procedural statement that checks an expression when
statement is executed
// general form
Use $display assertion_name: assert(expression) pass_code;
to print text, else fail_code;
$error to
print error, or // example
always @(posedge clk) begin
$fatal to
assert((status_full == 0) || (wr_en == 0))
print and halt else $error("Tried to write to FIFO when full.");
simulation end