Download - The Verilog Hardware Description Language. GUIDELINES How to write HDL code: How to write HDL code:
![Page 1: The Verilog Hardware Description Language. GUIDELINES How to write HDL code: How to write HDL code:](https://reader035.vdocuments.us/reader035/viewer/2022062313/56649c755503460f949299d4/html5/thumbnails/1.jpg)
The Verilog Hardware The Verilog Hardware Description LanguageDescription Language
![Page 2: The Verilog Hardware Description Language. GUIDELINES How to write HDL code: How to write HDL code:](https://reader035.vdocuments.us/reader035/viewer/2022062313/56649c755503460f949299d4/html5/thumbnails/2.jpg)
GUIDELINESGUIDELINES
How to write HDL code:How to write HDL code:
Q
QSET
CLR
D
Q
QSET
CLR
D
![Page 3: The Verilog Hardware Description Language. GUIDELINES How to write HDL code: How to write HDL code:](https://reader035.vdocuments.us/reader035/viewer/2022062313/56649c755503460f949299d4/html5/thumbnails/3.jpg)
GUIDELINESGUIDELINES
How NOT to write HDL code:How NOT to write HDL code:
if a=b thenx=a^b
else if a>b then...
![Page 4: The Verilog Hardware Description Language. GUIDELINES How to write HDL code: How to write HDL code:](https://reader035.vdocuments.us/reader035/viewer/2022062313/56649c755503460f949299d4/html5/thumbnails/4.jpg)
Think Hardware NOT Think Hardware NOT SoftwareSoftware
Poorly written HDL code will either Poorly written HDL code will either be:be:– UnsynthesizableUnsynthesizable– Functionally incorrectFunctionally incorrect– Lead to poor performance/area/power Lead to poor performance/area/power
resultsresults
![Page 5: The Verilog Hardware Description Language. GUIDELINES How to write HDL code: How to write HDL code:](https://reader035.vdocuments.us/reader035/viewer/2022062313/56649c755503460f949299d4/html5/thumbnails/5.jpg)
ConventionsConventions
Verilog IS case sensitiveVerilog IS case sensitive– CLOCK, clock and Clock are differentCLOCK, clock and Clock are different
Syntax is based on CSyntax is based on C– but is interpreted differentlybut is interpreted differently
![Page 6: The Verilog Hardware Description Language. GUIDELINES How to write HDL code: How to write HDL code:](https://reader035.vdocuments.us/reader035/viewer/2022062313/56649c755503460f949299d4/html5/thumbnails/6.jpg)
Verilog code basic structureVerilog code basic structure
module module module_name module_name (ports);(ports);
inputinput input_signals;input_signals;
output output output_signals;output_signals;
inout inout bidirectional signals;bidirectional signals;
wire wire wire_signals;wire_signals;
reg reg register_type_variables;register_type_variables;
primitive/component primitive/component (ports);(ports);
concurrent/sequential assignmentsconcurrent/sequential assignments
endmoduleendmodule
![Page 7: The Verilog Hardware Description Language. GUIDELINES How to write HDL code: How to write HDL code:](https://reader035.vdocuments.us/reader035/viewer/2022062313/56649c755503460f949299d4/html5/thumbnails/7.jpg)
Port typesPort types
PORT DIRECTIONPORT DIRECTION- IN- IN
-OUT-OUT
-INOUT-INOUT
SIGNAL TYPESIGNAL TYPE– scalar ( input x; )scalar ( input x; )– Vector (input [Vector (input [WIDTH -1 WIDTH -1 : 0] x): 0] x)
![Page 8: The Verilog Hardware Description Language. GUIDELINES How to write HDL code: How to write HDL code:](https://reader035.vdocuments.us/reader035/viewer/2022062313/56649c755503460f949299d4/html5/thumbnails/8.jpg)
Module port declaration example Module port declaration example (1/2)(1/2)
module module and_gate (o, i1, i2);and_gate (o, i1, i2);
output output o;o;
inputinput i1; i1;
inputinput i2; i2;
endmoduleendmodule
![Page 9: The Verilog Hardware Description Language. GUIDELINES How to write HDL code: How to write HDL code:](https://reader035.vdocuments.us/reader035/viewer/2022062313/56649c755503460f949299d4/html5/thumbnails/9.jpg)
Module port declaration example Module port declaration example (2/2)(2/2)
module module adder (carry, sum, i1, i2);adder (carry, sum, i1, i2);
output output carry;carry;
output output [3:0] sum;[3:0] sum;
input input [3:0] i1, i2; [3:0] i1, i2;
endmoduleendmodule
![Page 10: The Verilog Hardware Description Language. GUIDELINES How to write HDL code: How to write HDL code:](https://reader035.vdocuments.us/reader035/viewer/2022062313/56649c755503460f949299d4/html5/thumbnails/10.jpg)
ExampleExample
COUNTER
EN
PRESET
5
COUNT
5
CLK RST
![Page 11: The Verilog Hardware Description Language. GUIDELINES How to write HDL code: How to write HDL code:](https://reader035.vdocuments.us/reader035/viewer/2022062313/56649c755503460f949299d4/html5/thumbnails/11.jpg)
Verilog PrimitivesVerilog Primitives
Verilog primitives are models of Verilog primitives are models of common combinational logic common combinational logic gatesgates
Their functionality is built into the Their functionality is built into the language and can be instantiated language and can be instantiated in designs directlyin designs directly
The output port of a primitive The output port of a primitive must be first in the list of portsmust be first in the list of ports
![Page 12: The Verilog Hardware Description Language. GUIDELINES How to write HDL code: How to write HDL code:](https://reader035.vdocuments.us/reader035/viewer/2022062313/56649c755503460f949299d4/html5/thumbnails/12.jpg)
Structural description exampleStructural description example
i0i1
i2i3
o
S1
S2
module gates (o,i0,i1,i2,i3); output o; input i0,i1,i2,i3; wire s1, s2; and (s1, i0, i1); and (s2, i2, i3); and (o, s1, s2);endmodule
![Page 13: The Verilog Hardware Description Language. GUIDELINES How to write HDL code: How to write HDL code:](https://reader035.vdocuments.us/reader035/viewer/2022062313/56649c755503460f949299d4/html5/thumbnails/13.jpg)
Verilog operatorsVerilog operators
• ArithmeticArithmetic++, - , *, , - , *, SynthesizableSynthesizable
/, %/, % Non-synthesizableNon-synthesizable• BitwiseBitwise& AND& AND| OR| OR~ NOT ~ NOT ^ XOR^ XOR~^ XNOR~^ XNOR• RelationalRelational=, <, >, <=, >==, <, >, <=, >=
![Page 14: The Verilog Hardware Description Language. GUIDELINES How to write HDL code: How to write HDL code:](https://reader035.vdocuments.us/reader035/viewer/2022062313/56649c755503460f949299d4/html5/thumbnails/14.jpg)
User-Defined User-Defined Primitives Truth Table Primitives Truth Table
ModelsModelsprimitive primitive my_UDP (y, x1, x2, x3);my_UDP (y, x1, x2, x3); outputoutput y; y; //the output of a primitive cannot be a //the output of a primitive cannot be a
vector!!vector!! inputinput x1, x2, x3; x1, x2, x3;
tabletable //x1 x2 x3 : y//x1 x2 x3 : y 0 0 0 : 0;0 0 0 : 0; 0 0 1 : 1;0 0 1 : 1; 0 1 0 : 0;0 1 0 : 0; 0 1 1 : 0;0 1 1 : 0; 1 0 0 : 1;1 0 0 : 1; 1 0 1 : 0;1 0 1 : 0; 1 1 0 : 1;1 1 0 : 1; 1 1 1 : 0;1 1 1 : 0; endtableendtableendprimitiveendprimitive
![Page 15: The Verilog Hardware Description Language. GUIDELINES How to write HDL code: How to write HDL code:](https://reader035.vdocuments.us/reader035/viewer/2022062313/56649c755503460f949299d4/html5/thumbnails/15.jpg)
Truth tables with don’t Truth tables with don’t carescarestabletable //? Represents a don’t care condition//? Represents a don’t care condition // on the input// on the input //i1 i2 i3 : y//i1 i2 i3 : y 0 0 0 : 00 0 0 : 0 0 0 1 : 10 0 1 : 1 0 1 0 : 00 1 0 : 0 0 1 1 : 00 1 1 : 0 1 ? ? : 11 ? ? : 1endtableendtable
![Page 16: The Verilog Hardware Description Language. GUIDELINES How to write HDL code: How to write HDL code:](https://reader035.vdocuments.us/reader035/viewer/2022062313/56649c755503460f949299d4/html5/thumbnails/16.jpg)
variable assignmentvariable assignment
variable_name = variable_name = value; //blocking assignmentvalue; //blocking assignmentvariable_name <= variable_name <= value; //non-blocking assignmentvalue; //non-blocking assignment
ExamplesExamplesoutput a;output a;output [6:0] b;output [6:0] b;reg [3:0] c;reg [3:0] c;wire [2:0] d;wire [2:0] d;
CorrectCorrect IncorrectIncorrecta = 1;a = 1; a <= 3;a <= 3;b <= 7’b0101001;b <= 7’b0101001; b = 9’b000011011;b = 9’b000011011;b[1] = 0;b[1] = 0;c <= 0;c <= 0; d <= 0;d <= 0;d <= {b , c};d <= {b , c};b <= {c, d};b <= {c, d};b[5:2] <= c;b[5:2] <= c;
![Page 17: The Verilog Hardware Description Language. GUIDELINES How to write HDL code: How to write HDL code:](https://reader035.vdocuments.us/reader035/viewer/2022062313/56649c755503460f949299d4/html5/thumbnails/17.jpg)
Propagation delayPropagation delay
Used to assign variables or primitives with Used to assign variables or primitives with delay, modeling circuit behaviourdelay, modeling circuit behaviour
# 5 and (s, i0, i1); -- 5 ns and gate delay-- 5 ns and gate delay #5 assign s = i0 & i1; -- 5 ns and gate delay#5 assign s = i0 & i1; -- 5 ns and gate delay #1 assign a = b;#1 assign a = b; --1 ns wire delay--1 ns wire delayNot synthesizableNot synthesizable, is ignored by synthesis , is ignored by synthesis
toolstoolsUseful in testbenches for creating input signal Useful in testbenches for creating input signal
waveformswaveforms always #20 clk = ~clk -- 40 ns clock periodalways #20 clk = ~clk -- 40 ns clock period #0 rst_n = 0;#0 rst_n = 0; #10 rst_n = 1;#10 rst_n = 1;
![Page 18: The Verilog Hardware Description Language. GUIDELINES How to write HDL code: How to write HDL code:](https://reader035.vdocuments.us/reader035/viewer/2022062313/56649c755503460f949299d4/html5/thumbnails/18.jpg)
Concurrent statements Concurrent statements –delta time–delta time
b = ~ a;b = ~ a; (a = 1, b = 1, c =0)(a = 1, b = 1, c =0)
c = a ^ b;c = a ^ b;
TimeTime aa bb cc
00 11 11 00
δδ 11 00 00
22δδ 1 0 1 1 0 1
![Page 19: The Verilog Hardware Description Language. GUIDELINES How to write HDL code: How to write HDL code:](https://reader035.vdocuments.us/reader035/viewer/2022062313/56649c755503460f949299d4/html5/thumbnails/19.jpg)
Continuous Continuous assignmentassignment Multiple driver errorMultiple driver error
assign c = a & b;assign c = a & b;
……..
assign c = d | e;assign c = d | e;
ab
de
c
![Page 20: The Verilog Hardware Description Language. GUIDELINES How to write HDL code: How to write HDL code:](https://reader035.vdocuments.us/reader035/viewer/2022062313/56649c755503460f949299d4/html5/thumbnails/20.jpg)
Combinational circuit Combinational circuit descriptiondescription
modulemodule gates (d, a, c); gates (d, a, c);
outputoutput d; d;
inputinput a, c; a, c;
////wirewire b; b;
assignassign d = c ^ (~a); d = c ^ (~a);
// // assignassign b = ~a; b = ~a;
// // assignassign d = c ^ b; d = c ^ b;
endmoduleendmodule
ab
c
d
![Page 21: The Verilog Hardware Description Language. GUIDELINES How to write HDL code: How to write HDL code:](https://reader035.vdocuments.us/reader035/viewer/2022062313/56649c755503460f949299d4/html5/thumbnails/21.jpg)
Arithmetic unit Arithmetic unit descriptiondescription(full-adder)(full-adder)
modulemodule add1 (cout, sum, a, b, cin); add1 (cout, sum, a, b, cin); inputinput a, b; a, b; inputinput cin; cin; outputoutput sum; sum; outputoutput cout; cout; assignassign {cout,sum} = a + b + cin; {cout,sum} = a + b + cin;
endmoduleendmodule
![Page 22: The Verilog Hardware Description Language. GUIDELINES How to write HDL code: How to write HDL code:](https://reader035.vdocuments.us/reader035/viewer/2022062313/56649c755503460f949299d4/html5/thumbnails/22.jpg)
ExampleExample
Describe a 5-bit multiplier in Describe a 5-bit multiplier in VerilogVerilog..
![Page 23: The Verilog Hardware Description Language. GUIDELINES How to write HDL code: How to write HDL code:](https://reader035.vdocuments.us/reader035/viewer/2022062313/56649c755503460f949299d4/html5/thumbnails/23.jpg)
Conditional assignment - Conditional assignment - describing MUXsdescribing MUXs
assign assign = select_signal ? assignment1 : = select_signal ? assignment1 : assignment1assignment1
module module mux (o, s, i0, i1);mux (o, s, i0, i1); output output o; o; input input i0, i1;i0, i1; input input s;s;
assign assign o = s ? i1 : i0; o = s ? i1 : i0; //if s =1 then o = i1, else o =i0//if s =1 then o = i1, else o =i0endmoduleendmodule
![Page 24: The Verilog Hardware Description Language. GUIDELINES How to write HDL code: How to write HDL code:](https://reader035.vdocuments.us/reader035/viewer/2022062313/56649c755503460f949299d4/html5/thumbnails/24.jpg)
Cyclic behaviorCyclic behavior
• Statements in cyclic behavior execute Statements in cyclic behavior execute sequentiallysequentially
• Can be used to describe either Can be used to describe either combinational circuits (optional) or combinational circuits (optional) or sequential circuits (only way)sequential circuits (only way)
• Signals assigned in always blocks must Signals assigned in always blocks must be of type regbe of type reg
always & (always & (sensitivity listsensitivity list)) beginbegin sequential statementssequential statements endend
![Page 25: The Verilog Hardware Description Language. GUIDELINES How to write HDL code: How to write HDL code:](https://reader035.vdocuments.us/reader035/viewer/2022062313/56649c755503460f949299d4/html5/thumbnails/25.jpg)
Combinational Circuit Combinational Circuit Description using Cyclic Description using Cyclic
BehaviorBehavior
always @ always @ (a or b or c)(a or b or c)beginbegin d = (a &d = (a & b) |b) | c;c;endend
ALL input signals must be in ALL input signals must be in sensitivity list or latches will sensitivity list or latches will be produced!be produced!
![Page 26: The Verilog Hardware Description Language. GUIDELINES How to write HDL code: How to write HDL code:](https://reader035.vdocuments.us/reader035/viewer/2022062313/56649c755503460f949299d4/html5/thumbnails/26.jpg)
If statement If statement (sequential)– (sequential)–
describing MUXsdescribing MUXsif (if (condition1) begincondition1) begin signal1signal1 <= value1; <= value1; signal2 <= signal2 <= value2;value2; endendelse if (else if (condition2) condition2)
beginbegin signal1signal1 <= value3; <= value3; signal2 <= signal2 <= value4;value4; end end … … elseelse beginbegin signal1signal1 <= valuen-1; <= valuen-1; signal2 <= signal2 <= valuen;valuen; endend
module module mux (o, s, i0, i1);mux (o, s, i0, i1); output output o; o; reg o;reg o; input input i0, i1;i0, i1; input input s;s;
always @ (i0 or i1 or s)always @ (i0 or i1 or s) beginbegin if (s == 0)if (s == 0) o = i0;o = i0; elseelse o = i1;o = i1; endendendmoduleendmodule
![Page 27: The Verilog Hardware Description Language. GUIDELINES How to write HDL code: How to write HDL code:](https://reader035.vdocuments.us/reader035/viewer/2022062313/56649c755503460f949299d4/html5/thumbnails/27.jpg)
CASE statement CASE statement (sequential)– describing (sequential)– describing
MUXsMUXscase case (signal)(signal) value1:value1: signal1 <= signal1 <= value2;value2; signal2 <= signal2 <= value3;value3; value2 :value2 : signal1 <= signal1 <= value4;value4; signal2 <= signal2 <= value5;value5; . . . . . . default:default: signal1signal1 <= valuen-1; <= valuen-1; signal2 <= signal2 <= valuen;valuen;endcaseendcase
module module mux (o, s, i0, i1);mux (o, s, i0, i1); output output o; o; reg o;reg o; input input i0, i1;i0, i1; input input s;s;
always @ always @ (i0 or i1 or s)(i0 or i1 or s) beginbegin case case (s)(s) 0: o = i0;0: o = i0; 1: o = i1;1: o = i1; default: o= 1’bx;default: o= 1’bx; endcaseendcase endendendmoduleendmodule
![Page 28: The Verilog Hardware Description Language. GUIDELINES How to write HDL code: How to write HDL code:](https://reader035.vdocuments.us/reader035/viewer/2022062313/56649c755503460f949299d4/html5/thumbnails/28.jpg)
ExampleExample
Describe a 3-bit 4-to-1 MUXDescribe a 3-bit 4-to-1 MUX
![Page 29: The Verilog Hardware Description Language. GUIDELINES How to write HDL code: How to write HDL code:](https://reader035.vdocuments.us/reader035/viewer/2022062313/56649c755503460f949299d4/html5/thumbnails/29.jpg)
CLOCKED PROCESSCLOCKED PROCESS(Latch with asynchronous (Latch with asynchronous
reset)reset)always @ (clk or rst_n)always @ (clk or rst_n)
beginbegin
if (rst_n == 0)if (rst_n == 0)
q <= 0;q <= 0;
else if (clk == 1)else if (clk == 1)
q <= d;q <= d;
endend
![Page 30: The Verilog Hardware Description Language. GUIDELINES How to write HDL code: How to write HDL code:](https://reader035.vdocuments.us/reader035/viewer/2022062313/56649c755503460f949299d4/html5/thumbnails/30.jpg)
CLOCKED PROCESSCLOCKED PROCESS(Latch(Latch with synchronous with synchronous
reset)reset)always @ (clk or rst_n)always @ (clk or rst_n)
beginbegin
if (clk == 1)if (clk == 1)
q <= d;q <= d;
else if (rst_n == 0)else if (rst_n == 0)
q <= 0;q <= 0;
endend
![Page 31: The Verilog Hardware Description Language. GUIDELINES How to write HDL code: How to write HDL code:](https://reader035.vdocuments.us/reader035/viewer/2022062313/56649c755503460f949299d4/html5/thumbnails/31.jpg)
CLOCKED PROCESSCLOCKED PROCESS(Flip-flop with asynchronous (Flip-flop with asynchronous
reset)reset)always @(posedge clk or negedge rst_n)always @(posedge clk or negedge rst_n)
beginbegin
if (rst_n == 0)if (rst_n == 0)
q <= 0;q <= 0;
elseelse
q <= d;q <= d;
endend
![Page 32: The Verilog Hardware Description Language. GUIDELINES How to write HDL code: How to write HDL code:](https://reader035.vdocuments.us/reader035/viewer/2022062313/56649c755503460f949299d4/html5/thumbnails/32.jpg)
CLOCKED PROCESSCLOCKED PROCESS(Flip-flop with synchronous (Flip-flop with synchronous
reset)reset)always @(posedge clk)always @(posedge clk)
beginbegin
if (rst_n == 0)if (rst_n == 0)
q <= 0;q <= 0;
elseelse
q <= d;q <= d;
endend
![Page 33: The Verilog Hardware Description Language. GUIDELINES How to write HDL code: How to write HDL code:](https://reader035.vdocuments.us/reader035/viewer/2022062313/56649c755503460f949299d4/html5/thumbnails/33.jpg)
for loop statement – shift for loop statement – shift registerregister
module shift_reg (o, clk, rst_n, i);output o;input i;input clk, rst_n;reg [3:0] d;integer k;
always @ (posedge clk or negedge rst_n) begin if (rst_n ==0) d <= 0; else begin d[0] <= i; for (k=0; k <4; k=k+1) d[k+1] <= d[k]; end endassign o = d[3];endmodule
![Page 34: The Verilog Hardware Description Language. GUIDELINES How to write HDL code: How to write HDL code:](https://reader035.vdocuments.us/reader035/viewer/2022062313/56649c755503460f949299d4/html5/thumbnails/34.jpg)
CLOCKED VS CLOCKED VS COMBINATIONAL PROCESS COMBINATIONAL PROCESS
(1/2)(1/2)
MUX2X1
a
b
c
q
always @ always @ (a or b or c)(a or b or c) beginbegin case case (c)(c) 0: q = a;0: q = a; 1: q = b;1: q = b; default: q= 1’bx;default: q= 1’bx; endcaseendcase endend
always @ always @ (posedge clk or negedge (posedge clk or negedge rst_n)rst_n) beginbegin if (rst_n == 0) if (rst_n == 0) q <= 0;q <= 0; elseelse case case (c)(c) 0: q = a;0: q = a; 1: q = b;1: q = b; default: q= 1’bx;default: q= 1’bx; endcaseendcase endend
MUX2X1
a
b
c
q
Q
QSET
CLR
D
clk
rst
![Page 35: The Verilog Hardware Description Language. GUIDELINES How to write HDL code: How to write HDL code:](https://reader035.vdocuments.us/reader035/viewer/2022062313/56649c755503460f949299d4/html5/thumbnails/35.jpg)
CLOCKED VS CLOCKED VS COMBINATIONAL PROCESS COMBINATIONAL PROCESS
(2/2)(2/2)always @ always @ (a or b or c)(a or b or c)
beginbegin
d = (a d = (a & & b) b) | | c;c;
endenda
b
c
d
always @ always @ (posedge clk)(posedge clk)beginbegin if (rst_n == 0)if (rst_n == 0) d <= 0;d <= 0; elseelse d <= (a d <= (a & & b) b) | | c;c;endend
a
b
c
d
Q
QSET
CLR
D
clk
rst
![Page 36: The Verilog Hardware Description Language. GUIDELINES How to write HDL code: How to write HDL code:](https://reader035.vdocuments.us/reader035/viewer/2022062313/56649c755503460f949299d4/html5/thumbnails/36.jpg)
EXAMPLEEXAMPLE
DESCIBE A BINARY UP/DOWN DESCIBE A BINARY UP/DOWN COUNTER WITH ENABLE THAT COUNTER WITH ENABLE THAT COUNTS UPTO 12 AND THEN COUNTS UPTO 12 AND THEN STARTS AGAIN FROM ZEROSTARTS AGAIN FROM ZERO
![Page 37: The Verilog Hardware Description Language. GUIDELINES How to write HDL code: How to write HDL code:](https://reader035.vdocuments.us/reader035/viewer/2022062313/56649c755503460f949299d4/html5/thumbnails/37.jpg)
TESTBENCHTESTBENCH`timescale 1ns / 100ps`timescale 1ns / 100ps
module module testbench_name ();testbench_name (); reg ….; reg ….; //declaration of register variables for DUT inputs//declaration of register variables for DUT inputs wire …;wire …; //declaration of wires for DUT outputs //declaration of wires for DUT outputs
DUT_name(DUT ports);DUT_name(DUT ports);
initial $monitor(); initial $monitor(); //signals to be monitored (optional)//signals to be monitored (optional)initial begininitial begin #100 $finish; //end simulation#100 $finish; //end simulationendend
initial initial begin begin clk = 1’b0; //initialize clkclk = 1’b0; //initialize clk #10 a = 0;#10 a = 0; #10 a = 1;#10 a = 1; … … endend
always # 50 clk = ~clk; //50 ns clk period (if there is a clock)always # 50 clk = ~clk; //50 ns clk period (if there is a clock) endmoduleendmodule
![Page 38: The Verilog Hardware Description Language. GUIDELINES How to write HDL code: How to write HDL code:](https://reader035.vdocuments.us/reader035/viewer/2022062313/56649c755503460f949299d4/html5/thumbnails/38.jpg)
TESTBENCH EXAMPLETESTBENCH EXAMPLE
`timescale 1ns / 100ps`timescale 1ns / 100ps modulemodule mux_tb (); mux_tb (); reg reg i0, i1, s;i0, i1, s; wire wire o;o; mux M1 (o, s, i0, i1);mux M1 (o, s, i0, i1);
initial begininitial begin #100 $finish; #100 $finish;
//end simulation//end simulation endend
initial begin initial begin //stimulus pattern//stimulus pattern #10 i0 = 0; i1=0; s=0; #10 i0=1; #10 i0 = 0; i1=1; #10 i0=1; #10 i0=0; i1= 0; s=1; #10 i0=1; #10 i0 = 0; i1=1; #10 i0=1; endendmodule
![Page 39: The Verilog Hardware Description Language. GUIDELINES How to write HDL code: How to write HDL code:](https://reader035.vdocuments.us/reader035/viewer/2022062313/56649c755503460f949299d4/html5/thumbnails/39.jpg)
FINITE STATE FINITE STATE MACHINESMACHINES
![Page 40: The Verilog Hardware Description Language. GUIDELINES How to write HDL code: How to write HDL code:](https://reader035.vdocuments.us/reader035/viewer/2022062313/56649c755503460f949299d4/html5/thumbnails/40.jpg)
FINITE STATE MACHINE FINITE STATE MACHINE IMPLEMENTATIONIMPLEMENTATION
COMBINATIONAL LOGIC
Q
QSET
CLR
D
Q
QSET
CLR
D
...
STATE MEMORY
OUTPUT LOGIC
CLK
INPUTS
PREVIOUS STATE
NEXT STATE
OUTPUTS
(MEALY ONLY)
![Page 41: The Verilog Hardware Description Language. GUIDELINES How to write HDL code: How to write HDL code:](https://reader035.vdocuments.us/reader035/viewer/2022062313/56649c755503460f949299d4/html5/thumbnails/41.jpg)
Mealy machines (1/5)Mealy machines (1/5)
module fsm (y, clk, rst_n, x);
output y;
input clk, rst_n, x;
reg [1:0] state_pr, state_nx;
reg y;
parameter a = 0,
b = 1,
c = 2,
d = 3,
dont_care_state = 2’bx,
dont_care_out = 1’bx;
![Page 42: The Verilog Hardware Description Language. GUIDELINES How to write HDL code: How to write HDL code:](https://reader035.vdocuments.us/reader035/viewer/2022062313/56649c755503460f949299d4/html5/thumbnails/42.jpg)
Mealy machines (2/5)Mealy machines (2/5)
always @ (posedge clk or negedge rst_n) always @ (posedge clk or negedge rst_n) //state memory//state memory
beginbegin if (rst_n == 0)if (rst_n == 0) state_pr <= a; //default statestate_pr <= a; //default state elseelse state_pr <= state_nx;state_pr <= state_nx; endend
![Page 43: The Verilog Hardware Description Language. GUIDELINES How to write HDL code: How to write HDL code:](https://reader035.vdocuments.us/reader035/viewer/2022062313/56649c755503460f949299d4/html5/thumbnails/43.jpg)
Mealy machines (3/5)Mealy machines (3/5)
always @ (x or state_pr) //combinational partalways @ (x or state_pr) //combinational partbeginbegin CASE (state_pr)CASE (state_pr) a: if (x == 1) begina: if (x == 1) begin state_nx = b;state_nx = b; y=0;y=0; endend else if (x == 0) begin else if (x == 0) begin state_nx <= a; --optionalstate_nx <= a; --optional y=0;y=0; endend
![Page 44: The Verilog Hardware Description Language. GUIDELINES How to write HDL code: How to write HDL code:](https://reader035.vdocuments.us/reader035/viewer/2022062313/56649c755503460f949299d4/html5/thumbnails/44.jpg)
Mealy machines (4/5)Mealy machines (4/5)
b: if (x == 1) beginb: if (x == 1) begin state_nx = c;state_nx = c; y=0; --Mealy machiney=0; --Mealy machine endend else if (x==0) beginelse if (x==0) begin state_nx <= a; state_nx <= a; y=0; --Mealy machiney=0; --Mealy machine endend c: if (x == 1) beginc: if (x == 1) begin state_nx = c; --optionalstate_nx = c; --optional y=0; --Mealy machiney=0; --Mealy machine endend else if (x==0) beginelse if (x==0) begin state_nx <= d; state_nx <= d; y=0; --Mealy machiney=0; --Mealy machine endend
![Page 45: The Verilog Hardware Description Language. GUIDELINES How to write HDL code: How to write HDL code:](https://reader035.vdocuments.us/reader035/viewer/2022062313/56649c755503460f949299d4/html5/thumbnails/45.jpg)
Mealy machines (5/5)Mealy machines (5/5)
d: if (x == 1) begind: if (x == 1) begin state_nx = b;state_nx = b; y=1; --Mealy machiney=1; --Mealy machine endend else if (x==0) beginelse if (x==0) begin state_nx <= a; state_nx <= a; y=0; --Mealy machiney=0; --Mealy machine endend
default: begin default: begin state_nx <= dont_care_state;state_nx <= dont_care_state; y <= dont_care_out;y <= dont_care_out; endend endcaseendcaseendendendmoduleendmodule
![Page 46: The Verilog Hardware Description Language. GUIDELINES How to write HDL code: How to write HDL code:](https://reader035.vdocuments.us/reader035/viewer/2022062313/56649c755503460f949299d4/html5/thumbnails/46.jpg)
Moore machinesMoore machines
always @ (x or state_pr) --combinational partalways @ (x or state_pr) --combinational partbeginbegin CASE (state_pr)CASE (state_pr) s0: y = <value>; --Moore machines0: y = <value>; --Moore machine if (a == 1)if (a == 1) state_nx = s1;state_nx = s1; elseelse state_nx = s0; --optionalstate_nx = s0; --optional
![Page 47: The Verilog Hardware Description Language. GUIDELINES How to write HDL code: How to write HDL code:](https://reader035.vdocuments.us/reader035/viewer/2022062313/56649c755503460f949299d4/html5/thumbnails/47.jpg)
MOORE MACHINESMOORE MACHINES
S1: y = <value>; --Moore machineS1: y = <value>; --Moore machine
if (x == 1)if (x == 1)
state_nx = S0;state_nx = S0;
elseelse
state_nx = S1; --optionalstate_nx = S1; --optional
endcaseendcase
endend
![Page 48: The Verilog Hardware Description Language. GUIDELINES How to write HDL code: How to write HDL code:](https://reader035.vdocuments.us/reader035/viewer/2022062313/56649c755503460f949299d4/html5/thumbnails/48.jpg)
EXAMPLE: OUT-OF-EXAMPLE: OUT-OF-SEQUENCE COUNTERSEQUENCE COUNTER DESCRIBE A COUNTER WITH THE DESCRIBE A COUNTER WITH THE
FOLLOWING SEQUENCE:FOLLOWING SEQUENCE:– ““000” => “010” => “011” => 000” => “010” => “011” =>
“001” => “111” => “000”“001” => “111” => “000”
![Page 49: The Verilog Hardware Description Language. GUIDELINES How to write HDL code: How to write HDL code:](https://reader035.vdocuments.us/reader035/viewer/2022062313/56649c755503460f949299d4/html5/thumbnails/49.jpg)
ROM description (1/2)ROM description (1/2)
module rominfr (data, en, addr);
output [3:0] data;
input en;
input [4:0] addr;
reg [3:0] ROM [31:0];
assign data = ROM[addr];
![Page 50: The Verilog Hardware Description Language. GUIDELINES How to write HDL code: How to write HDL code:](https://reader035.vdocuments.us/reader035/viewer/2022062313/56649c755503460f949299d4/html5/thumbnails/50.jpg)
ROM description (2/2)ROM description (2/2)initial begin ROM[0] = 4’b0001; ROM[1] = 4’b0010; ROM[2] = 4’b0011; ROM[3] = 4’b0100; ROM[4] = 4’b0101; ROM[5] = 4’b0110; ROM[6] = 4’b0111; ROM[7] = 4’b1000; ROM[8] = 4’b1001; ROM[9] = 4’b1010; ROM[10] = 4’b1011; ROM[11] = 4’b1100; ROM[12] = 4’b1101; ROM[13] = 4’b1110; ROM[14] = 4’b1111; ROM[15] = 4’b0001; ROM[16] = 4’b0010; ROM[17] = 4’b0011; ROM[18] = 4’b0100; ROM[19] = 4’b0101; ROM[20] = 4’b0110; ROM[21] = 4’b0111; ROM[22] = 4’b1000; ROM[23] = 4’b1001; ROM[24] = 4’b1010; ROM[25] = 4’b1011; ROM[26] = 4’b1100; ROM[27] = 4’b1101; ROM[28] = 4’b1110; ROM[29] = 4’b1111; ROM[30] = 4’b0000; ROM[31] = 4’b0001;endendmodule
![Page 51: The Verilog Hardware Description Language. GUIDELINES How to write HDL code: How to write HDL code:](https://reader035.vdocuments.us/reader035/viewer/2022062313/56649c755503460f949299d4/html5/thumbnails/51.jpg)
DUAL –PORT RAM (1/2)DUAL –PORT RAM (1/2)
module v_rams_12 (clk1, clk2, we, add1, add2, di, do1, do2);
input clk1; input clk2; input we; input [5:0] add1; input [5:0] add2; input [15:0] di; output [15:0] do1; output [15:0] do2; reg [15:0] ram [63:0]; reg [5:0] read_add1; reg [5:0] read_add2;
![Page 52: The Verilog Hardware Description Language. GUIDELINES How to write HDL code: How to write HDL code:](https://reader035.vdocuments.us/reader035/viewer/2022062313/56649c755503460f949299d4/html5/thumbnails/52.jpg)
DUAL –PORT RAM (2/2)DUAL –PORT RAM (2/2)
always @(posedge clk1) begin if (we) ram[add1] <= di; read_add1 <= add1; end assign do1 = ram[read_add1]; always @(posedge clk2) begin read_add2 <= add2; end assign do2 = ram[read_add2];endmodule
![Page 53: The Verilog Hardware Description Language. GUIDELINES How to write HDL code: How to write HDL code:](https://reader035.vdocuments.us/reader035/viewer/2022062313/56649c755503460f949299d4/html5/thumbnails/53.jpg)
Include filesInclude files
`include "timing.vh"`include "timing.vh"module counter1(count, reset, clk) ;module counter1(count, reset, clk) ; output [output [77:0] count;:0] count; input reset, clk;input reset, clk; reg [reg [77:0] count;:0] count; always @(posedge clk or posedge reset)always @(posedge clk or posedge reset) if(reset)if(reset) count <= #(`REG_DELAY)count <= #(`REG_DELAY) 8 8'b0;'b0; elseelse count <= #(`REG_DELAY) count + count <= #(`REG_DELAY) count + 88 'b1; 'b1;. . .. . . //contents of ”timing.vh” file//contents of ”timing.vh” file
`timescale Ins/Ins`timescale Ins/Ins`define REG_DELAY 1`define REG_DELAY 1
![Page 54: The Verilog Hardware Description Language. GUIDELINES How to write HDL code: How to write HDL code:](https://reader035.vdocuments.us/reader035/viewer/2022062313/56649c755503460f949299d4/html5/thumbnails/54.jpg)
Parametric modelsParametric models
`include “rominfr_pkg.vh”module rominfr (data, en, addr); output [`wordlength-1:0] data; input en; input [`addr_size-1:0] addr; reg [`wordlength-1:0] ROM [`ROM_size-1:0];. . .
//contents of “rominfr_pkg.vh”`define`define wordlength 8`define`define addr_size 5`define`define ROM_size 32
![Page 55: The Verilog Hardware Description Language. GUIDELINES How to write HDL code: How to write HDL code:](https://reader035.vdocuments.us/reader035/viewer/2022062313/56649c755503460f949299d4/html5/thumbnails/55.jpg)
ExampleExample
Create an ALU with parametric wordlength, Create an ALU with parametric wordlength, and the following function tableand the following function table
S2S2 S1S1 S0S0 FUNCTIONFUNCTION 00 00 00 A + BA + B 00 00 11 A – BA – B 00 11 00 A + 1A + 1 00 11 11 B + 1B + 1 11 00 00 A AND BA AND B 11 00 11 A OR BA OR B 11 11 00 A XOR BA XOR B 11 11 11 NOT ANOT A
![Page 56: The Verilog Hardware Description Language. GUIDELINES How to write HDL code: How to write HDL code:](https://reader035.vdocuments.us/reader035/viewer/2022062313/56649c755503460f949299d4/html5/thumbnails/56.jpg)
Common Verilog Common Verilog PitfallsPitfalls
![Page 57: The Verilog Hardware Description Language. GUIDELINES How to write HDL code: How to write HDL code:](https://reader035.vdocuments.us/reader035/viewer/2022062313/56649c755503460f949299d4/html5/thumbnails/57.jpg)
Name inconsistencyName inconsistency
Compile: errorCompile: error Severity: TrivialSeverity: Trivial
modulemodule wrong_name (o, i0, i1, i2); wrong_name (o, i0, i1, i2);
outputoutput o; o;
inputinput i1, i2, i3; i1, i2, i3;
assignassign o = i0 & i1 ^ i2; o = i0 & i1 ^ i2;
endmoduleendmodule
![Page 58: The Verilog Hardware Description Language. GUIDELINES How to write HDL code: How to write HDL code:](https://reader035.vdocuments.us/reader035/viewer/2022062313/56649c755503460f949299d4/html5/thumbnails/58.jpg)
Multiple unconditional Multiple unconditional concurrent concurrent assignmentsassignments Simulation: ‘X’ valueSimulation: ‘X’ value
Synthesis: ERROR: signal is multiply drivenSynthesis: ERROR: signal is multiply driven Severity: SeriousSeverity: Serious
module …
assign x = a & b;
...
assign x = b ^ c;
always @ (b or c)
begin
x <= b | c;
end
![Page 59: The Verilog Hardware Description Language. GUIDELINES How to write HDL code: How to write HDL code:](https://reader035.vdocuments.us/reader035/viewer/2022062313/56649c755503460f949299d4/html5/thumbnails/59.jpg)
Incomplete sensitivity Incomplete sensitivity list list
Simulation: Unexpected behaviorSimulation: Unexpected behavior Synthesis: Warning: Incomplete sensitivity listSynthesis: Warning: Incomplete sensitivity list Severity: SeriousSeverity: Serious Solution: complete sensitivity listSolution: complete sensitivity list
always @ always @ (a or b)(a or b)
beginbegin
d <= (a &d <= (a & b) |b) | c; //c is missing from sensitivity list!!!c; //c is missing from sensitivity list!!!
endend
![Page 60: The Verilog Hardware Description Language. GUIDELINES How to write HDL code: How to write HDL code:](https://reader035.vdocuments.us/reader035/viewer/2022062313/56649c755503460f949299d4/html5/thumbnails/60.jpg)
Not assigning all outputs Not assigning all outputs in combinational always in combinational always blockblock Simulation: Simulation: Synthesis: Warning: Signal not always assigned, Synthesis: Warning: Signal not always assigned,
storage may be neededstorage may be needed Severity: SeriousSeverity: Serious Solution: assign all signalsSolution: assign all signals
always @ always @ (a or b or c)(a or b or c)beginbegin if (c == 0) thenif (c == 0) then d <= (a d <= (a & & b) |b) | c; //d assigned only first time, c; //d assigned only first time, else if (c == 1) else if (c == 1) e <= a; //e assigned only second e <= a; //e assigned only second
time!!! time!!! endend
![Page 61: The Verilog Hardware Description Language. GUIDELINES How to write HDL code: How to write HDL code:](https://reader035.vdocuments.us/reader035/viewer/2022062313/56649c755503460f949299d4/html5/thumbnails/61.jpg)
Unassigned signalsUnassigned signals Simulation: Undefined value (‘U’)Simulation: Undefined value (‘U’) Synthesis: Warning: Signal is Synthesis: Warning: Signal is
never used/never assigned a valuenever used/never assigned a value Severity: ModerateSeverity: Moderatemodule …
output y;
input input1, input2;
wire s;
assign y = input1 & input2; //s never assigned
endmodule
![Page 62: The Verilog Hardware Description Language. GUIDELINES How to write HDL code: How to write HDL code:](https://reader035.vdocuments.us/reader035/viewer/2022062313/56649c755503460f949299d4/html5/thumbnails/62.jpg)
Output not assigned or Output not assigned or not connectednot connected Simulation: UndefinedSimulation: Undefined Synthesis: Error: All logic Synthesis: Error: All logic
removed from the designremoved from the design Severity: SeriousSeverity: Seriousmodule my_module (o, input1, input2); output o; input input1, input2; wire s; assign s = input1 & input2; //output never assignedendmodule
![Page 63: The Verilog Hardware Description Language. GUIDELINES How to write HDL code: How to write HDL code:](https://reader035.vdocuments.us/reader035/viewer/2022062313/56649c755503460f949299d4/html5/thumbnails/63.jpg)
Using sequential Using sequential instead of concurrent instead of concurrent processprocess Simulation: Unexpectedly delayed Simulation: Unexpectedly delayed
signalssignals Synthesis: More FFs than Synthesis: More FFs than
expectedexpected
![Page 64: The Verilog Hardware Description Language. GUIDELINES How to write HDL code: How to write HDL code:](https://reader035.vdocuments.us/reader035/viewer/2022062313/56649c755503460f949299d4/html5/thumbnails/64.jpg)
Confusing reg with Confusing reg with wirewiremodule my_module (o, input1, input2); output o; input input1, input2; assign o = input1 & input2; //output is wire by defaultendmodule
module my_module (o, input1, input2); output o; reg o; input input1, input2;
always @ (input1 or input2) //using always blocko = input1 & input2; //output must be reg
endmodule