Verilog Basics
Verilog Basics
Verilog Basics
What is Verilog
Hardware Description Language (HDL) Developed in 1984 Standard: IEEE 1364, Dec 1995
Verilog
Preferred in commercial product design Easy to learn and use C-like language
Reality
Impossible to say which is better: matter of taste
Behavioral Behavioral RTL RTL Gate Gate Layout Layout(VLSI) (VLSI) Our focus
User Identifiers
Formed from {[A-Z], [a-z], [0-9], _, $}, but .. .. cant begin with $ or [0-9]
myidentifier m_y_identifier 3my_identifier $my_identifier _myidentifier$
Case sensitivity
myid
Myid
6 Verilog HDL Basics
Comments
// The rest of the line is a comment /* Multiple line comment */ /* Nesting /* comments */ do NOT work */
Nets (i)
Can be thought as hardware wires driven by logic Equal z when unconnected Various types of nets
wire wand wor tri
Nets (ii)
A B Y
wire Y; // declaration assign Y = A & B;
A Y B
dr A Y
tri Y; // declaration assign Y = (dr) ? A : z;
10
Registers
Variables that store values Do not represent real hardware but .. .. real hardware can be implemented with registers Only one type: reg
reg A, C; // declaration // assignments are always done inside a procedure A = 1; C = A; // C gets the logical value 1 A = 0; // C is still 1 C = 0; // C is now 0
Vectors
Represent buses
wire [3:0] busA; reg [1:4] busB; reg [1:0] busC;
Logical Operators
&& logical AND || logical OR
logical NOT Operands evaluated to ONE bit value: 0, 1 or x Result is ONE bit value: 0, 1 or x
!
A = 6; B = 0; C = x; A && B 1 && 0 0 A || !B 1 || 1 1 but C || B x || 0 x butC&&B=0 C&&B=0
14
a = 4b1010; b = 4b1100;
c = a ^ b;
a = 4b1010; b = 2b11;
16 Verilog HDL Basics
Shift Operators
shift right << shift left
>>
17
Conditional Operator
cond_expr ? true_expr : false_expr
Y = (sel)? A : B;
18
Negative registers:
regs can be assigned negative but are treated as unsigned
reg [15:0] regA; .. regA = -4d12; regA/3 // stored as 216-12 = 65524
evaluates to 21861
19
20
Operator Precedence
21
Hierarchical Design
Top TopLevel Level Module Module Sub-Module Sub-Module 11 Basic BasicModule Module Basic BasicModule Module 11 22 Sub-Module Sub-Module 22 Basic BasicModule Module 33 E.g. Full FullAdder Adder
22
Module
module my_module(out1, .., inN);
in1 in2
my_module
out1 out2
f
inN outM
endmodule
Everything you write in Verilog must be inside a module exception: compiler directives
23 Verilog HDL Basics
24
I1
A B
C I2
S C I3
sum cout
cin
module full_adder(sum, cout, in1, in2, cin); output sum, cout; input in1, in2, cin; wire sum, cout, in1, in2, cin; wire I1, I2, I3; half_adder ha1(I1, I2, in1, in2); half_adder ha2(sum, I3, I1, cin); assign cout = I2 || I3; endmodule
25 Verilog HDL Basics
Module name
Instance name
Hierarchical Names
ha2.A
in1 in2 A B
I1
A B
C I2
S C I3
sum cout
cin
Port Assignments
module
Inputs
reg or net
net
module
Outputs
reg or net
net
module
Inouts
net
net
27
Usage:
nand (out, in1, in2); 2-input NAND without delay and #2 (out, in1, in2, in3); 3-input AND with 2 t.u. delay not #1 N1(out, in); NOT with 1 t.u. delay and instance name xor X1(out, in1, in2); 2-input XOR with instance name
29
31
Initial Blocks
Start execution at sim time zero and finish when their last statement executes
module nothing; initial $display(Im first); initial begin #50; $display(Really?); end endmodule
32 Verilog HDL Basics
Will Willbe bedisplayed displayed at atsim simtime time00 Will Willbe bedisplayed displayed at atsim simtime time50 50
Always Blocks
Start execution at sim time zero and continue until sim finishes
33
Events (i)
@
always @(signal1 or signal2 or ..) begin .. end execution triggers
execution executiontriggers triggersevery every time timeclk clkchanges changes from from0 0to to1 1 execution executiontriggers triggersevery every time timeclk clkchanges changes from from1 1to to0 0
Verilog HDL Basics
34
Examples
3rd half adder implem
module half_adder(S, C, A, B); output S, C; input A, B; reg S,C; wire A, B; always @(A or B) begin S = A ^ B; C = A && B; end endmodule
35
Events (ii)
wait (expr)
always begin wait (ctrl) #10 cnt = cnt + 1; #10 cnt2 = cnt2 + 2; end
execution executionloops loopsevery every time timectrl ctrl= =1 1(level (level sensitive sensitivetiming timingcontrol) control)
36
Example
always @(res or posedge clk) begin if (res) begin Y = 0; W = 0; end else begin Y = a & b; W = ~c; end end
res a b c clk Y
37
Procedural Statements: if
E.g. 4-to-1 mux:
module mux4_1(out, in, sel); output out; input [3:0] in; input [1:0] sel; reg out; wire [3:0] in; wire [1:0] sel; always @(in or sel) if (sel == 0) out = in[0]; else if (sel == 1) out = in[1]; else if (sel == 2) out = in[2]; else out = in[3]; endmodule
38 Verilog HDL Basics
case (expr) item_1, .., item_n: stmt1; item_n+1, .., item_m: stmt2; .. default: def_stmt; endcase
module mux4_1(out, in, sel); output out; input [3:0] in; input [1:0] sel; reg out; wire [3:0] in; wire [1:0] sel; always @(in or sel) case (sel) 0: out = in[0]; 1: out = in[1]; 2: out = in[2]; 3: out = in[3]; endcase endmodule
Verilog HDL Basics
39
Mixed Model
Code that contains various both structure and behavioral styles
module simple(Y, c, clk, res); output Y; input c, clk, res; reg Y; wire c, clk, res; wire n;
res c clk n Y
not(n, c); // gate-level always @(res or posedge clk) if (res) Y = 0; else Y = n; endmodule
42 Verilog HDL Basics