Download presentation
Presentation is loading. Please wait.
Published byBrendan Small Modified over 9 years ago
1
The Verilog Hardware Description Language
2
GUIDELINES How to write HDL code: How to write HDL code:
3
GUIDELINES How NOT to write HDL code: How NOT to write HDL code:
4
Think Hardware NOT Software Poorly written HDL code will either be: Poorly written HDL code will either be: –Unsynthesizable –Functionally incorrect –Lead to poor performance/area/power results
5
Conventions Verilog IS case sensitive Verilog IS case sensitive –CLOCK, clock and Clock are different Syntax is based on C Syntax is based on C –but is interpreted differently
6
Verilog code basic structure module module_name (ports); inputinput_signals; output output_signals; output output_signals; inout bidirectional signals; wire wire_signals; wire wire_signals; reg register_type_variables; reg register_type_variables; primitive/component (ports); primitive/component (ports); concurrent/sequential assignments concurrent/sequential assignmentsendmodule
7
Port types PORT DIRECTION PORT DIRECTION - IN -OUT-INOUT SIGNAL TYPE SIGNAL TYPE –scalar ( input x; ) –Vector (input [WIDTH -1 : 0] x)
8
Module port declaration example (1/2) module and_gate (o, i1, i2); output o; output o; input i1; input i2; input i2;endmodule
9
Module port declaration example (2/2) module adder (carry, sum, i1, i2); output carry; output carry; output [3:0] sum; output [3:0] sum; input [3:0] i1, i2; input [3:0] i1, i2;endmodule
10
Example
11
Verilog Primitives Verilog primitives are models of common combinational logic gates Verilog primitives are models of common combinational logic gates Their functionality is built into the language and can be instantiated in designs directly Their functionality is built into the language and can be instantiated in designs directly The output port of a primitive must be first in the list of ports The output port of a primitive must be first in the list of ports
12
Structural description example 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
13
Verilog operators Arithmetic Arithmetic +, -, *, Synthesizable /, %Non-synthesizable /, %Non-synthesizable Bitwise Bitwise & AND | OR ~ NOT ^ XOR ~^ XNOR Relational Relational =,, =
14
User-Defined Primitives Truth Table Models primitive my_UDP (y, x1, x2, x3); output y;//the output of a primitive cannot be a vector!! output y;//the output of a primitive cannot be a vector!! input x1, x2, x3; input x1, x2, x3; table table //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; endtable endtableendprimitive
15
Truth tables with don’t cares table //? 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 : 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 ? ? : 1 1 ? ? : 1endtable
16
variable assignment variable_name = value; //blocking assignment variable_name <= value; //non-blocking assignment Examples output a; output [6:0] b; reg [3:0] c; wire [2:0] d; CorrectIncorrect a = 1;a <= 3; b <= 7’b0101001;b = 9’b000011011; b[1] = 0; c <= 0;d <= 0; d <= {b, c}; b <= {c, d}; b[5:2] <= c;
17
Propagation delay Used to assign variables or primitives with delay, modeling circuit behaviour -- 5 ns and gate delay # 5 and (s, i0, i1); -- 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 ns wire delay #1 assign a = b;--1 ns wire delay Not synthesizable, is ignored by synthesis tools Useful in testbenches for creating input signal waveforms always #20 clk = ~clk -- 40 ns clock period always #20 clk = ~clk -- 40 ns clock period #0 rst_n = 0; #0 rst_n = 0; #10 rst_n = 1; #10 rst_n = 1;
18
Concurrent statements – delta time b = ~ a;(a = 1, b = 1, c =0) c = a ^ b; Timeabc 0110 0110 δ100 δ100 2δ 1 0 1
19
Continuous assignment Multiple driver error Multiple driver error assign c = a & b; …. assign c = d | e;
20
Combinational circuit description module gates (d, a, c); output d; output d; input a, c; input a, c; //reg b; //reg b; assign d = c ^ (~a); assign d = c ^ (~a); // assign b = ~a; // assign b = ~a; // assign d = c ^ b; // assign d = c ^ b;endmodule
21
Arithmetic unit description (full-adder) module add1 (cout, sum, a, b, cin); input a, b; input a, b; input cin; input cin; output sum; output sum; output cout; output cout; assign {cout,sum} = a + b + cin; assign {cout,sum} = a + b + cin;endmodule
22
Example Describe a 5-bit multiplier in Verilog.
23
Conditional assignment - describing MUXs assign = select_signal ? assignment1 : assignment1 module mux (o, s, i0, i1); output o; output o; input i0, i1; input i0, i1; input s; input s; assign o = s ? i1 : i0; assign o = s ? i1 : i0; //if s =1 then o = i1, else o =i0 endmodule
24
Cyclic behavior Statements in cyclic behavior execute sequentially Statements in cyclic behavior execute sequentially Can be used to describe either combinational circuits (optional) or sequential circuits (only way) Can be used to describe either combinational circuits (optional) or sequential circuits (only way) always & (sensitivity list) begin begin sequential statements sequential statements end end
25
Combinational Circuit Description using Cyclic Behavior always @ (a or b or c) begin d = (a & b) | c; d = (a & b) | c;end ALL input signals must be in sensitivity list or latches will be produced!
26
If statement (sequential)– describing MUXs if (condition1) begin signal1 <= value1; signal1 <= value1; signal2 <= value2; signal2 <= value2; end end else if (condition2) begin signal1 <= value3; signal1 <= value3; signal2 <= value4; signal2 <= value4; end end … else else begin begin signal1 <= valuen-1; signal1 <= valuen-1; signal2 <= valuen; signal2 <= valuen; end end module mux (o, s, i0, i1); output o; output o; reg o; reg o; input i0, i1; input i0, i1; input s; input s; always @ (i0 or i1 or s) always @ (i0 or i1 or s) begin begin if (s == 0) if (s == 0) o = i0; o = i0; else else o = i1; o = i1; end endendmodule
27
CASE statement (sequential)– describing MUXs case (signal) value1: value1: signal1 <= value2; signal1 <= value2; signal2 <= value3; signal2 <= value3; value2 : value2 : signal1 <= value4; signal1 <= value4; signal2 <= value5; signal2 <= value5;...... default: default: signal1 <= valuen-1; signal1 <= valuen-1; signal2 <= valuen; signal2 <= valuen;endcase module mux (o, s, i0, i1); output o; output o; reg o; reg o; input i0, i1; input i0, i1; input s; input s; always @ (i0 or i1 or s) begin begin case (s) case (s) 0: o = i0; 0: o = i0; 1: o = i1; 1: o = i1; default: o= 1’bx; default: o= 1’bx; endcase endcase end endendmodule
28
Example Describe a 3-bit 4-to-1 MUX Describe a 3-bit 4-to-1 MUX
29
CLOCKED PROCESS (Latch with asynchronous reset) always @ (clk or rst_n) begin if (rst_n == 0) if (rst_n == 0) q <= 0; q <= 0; else if (clk == 1) else if (clk == 1) q <= d; q <= d;end
30
CLOCKED PROCESS (Latch with synchronous reset) always @ (clk or rst_n) begin if (clk == 1) if (clk == 1) q <= d; q <= d; else if (rst_n == 0) else if (rst_n == 0) q <= 0; q <= 0;end
31
CLOCKED PROCESS (Flip-flop with asynchronous reset) always @(posedge clk or negedge rst_n) begin begin if (rst_n == 0) if (rst_n == 0) q <= 0; q <= 0; else else q <= d; q <= d; end end
32
CLOCKED PROCESS (Flip-flop with synchronous reset) always @(posedge clk) begin begin if (rst_n == 0) if (rst_n == 0) q <= 0; q <= 0; else else q <= d; q <= d; end end
33
for loop statement – shift register 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 <2; k=k+1) d[k+1] <= d[k]; end assign o = d[3]; endmodule
34
CLOCKED VS COMBINATIONAL PROCESS (1/2) always @ (a or b or c) begin begin case (c) case (c) 0: q = a; 0: q = a; 1: q = b; 1: q = b; default: q= 1’bx; default: q= 1’bx; endcase endcase end end always @ (posedge clk or negedge rst_n) begin begin if (rst_n == 0) if (rst_n == 0) q <= 0; q <= 0; else else case (c) case (c) 0: q = a; 0: q = a; 1: q = b; 1: q = b; default: q= 1’bx; default: q= 1’bx; endcase endcase end end
35
CLOCKED VS COMBINATIONAL PROCESS (2/2) always @ (a or b or c) begin d = (a & b) | c; d = (a & b) | c;end always @ (posedge clk) begin if (rst_n == 0) if (rst_n == 0) d <= 0; d <= 0; else else d <= (a & b) | c; d <= (a & b) | c;end
36
EXAMPLE DESCIBE A BINARY UP/DOWN COUNTER WITH ENABLE THAT COUNTS UPTO 12 AND THEN STARTS AGAIN FROM ZERO DESCIBE A BINARY UP/DOWN COUNTER WITH ENABLE THAT COUNTS UPTO 12 AND THEN STARTS AGAIN FROM ZERO
37
TESTBENCH `timescale 1ns / 100ps module testbench_name (); reg ….; //declaration of register variables for DUT inputs reg ….; //declaration of register variables for DUT inputs wire …; //declaration of wires for DUT outputs wire …; //declaration of wires for DUT outputs DUT_name(DUT ports); initial $monitor(); //signals to be monitored (optional) initial begin #100 $finish; //end simulation #100 $finish; //end simulationendinitial begin begin clk = 1’b0; //initialize clk clk = 1’b0; //initialize clk #10 a = 0; #10 a = 0; #10 a = 1; #10 a = 1; … end end 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) endmodule
38
TESTBENCH EXAMPLE `timescale 1ns / 100ps module mux_tb (); module mux_tb (); reg i0, i1, s; reg i0, i1, s; wire o; wire o; mux M1 (o, s, i0, i1); mux M1 (o, s, i0, i1); initial begin initial begin #100 $finish; //end simulation #100 $finish; //end simulation end end initial begin //stimulus pattern initial begin //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; end endmodule
39
FINITE STATE MACHINES
40
FINITE STATE MACHINE IMPLEMENTATION
41
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;
42
Mealy machines (2/5) always @ (posedge clk or negedge rst_n) //state memory begin begin if (rst_n == 0) if (rst_n == 0) state_pr <= a; //default state state_pr <= a; //default state else else state_pr <= state_nx; state_pr <= state_nx; end end
43
Mealy machines (3/5) always @ (x or state_pr) //combinational part begin CASE (state_pr) CASE (state_pr) a: if (x == 1) begin a: if (x == 1) begin state_nx = b; state_nx = b; y=0; y=0; end end else if (x == 0) begin else if (x == 0) begin state_nx <= a; --optional state_nx <= a; --optional y=0; y=0; end end
44
Mealy machines (4/5) b: if (x == 1) begin b: if (x == 1) begin state_nx = c; state_nx = c; y=0; --Mealy machine y=0; --Mealy machine end end else if (x==0) begin else if (x==0) begin state_nx <= a; state_nx <= a; y=0; --Mealy machine y=0; --Mealy machine end end c: if (x == 1) begin c: if (x == 1) begin state_nx = c; --optional state_nx = c; --optional y=0; --Mealy machine y=0; --Mealy machine end end else if (x==0) begin else if (x==0) begin state_nx <= d; state_nx <= d; y=0; --Mealy machine y=0; --Mealy machine end end
45
Mealy machines (5/5) d: if (x == 1) begin state_nx = b; state_nx = b; y=1; --Mealy machine y=1; --Mealy machine end end else if (x==0) begin else if (x==0) begin state_nx <= a; state_nx <= a; y=0; --Mealy machine y=0; --Mealy machine end end default: begin state_nx = dont_care_state; state_nx = dont_care_state; y <= dont_care_out; y <= dont_care_out; end end endcase endcaseendendmodule
46
Moore machines always @ (x or state_pr) --combinational part begin CASE (state_pr) CASE (state_pr) s0: y = ; --Moore machine s0: y = ; --Moore machine if (x == 1) if (x == 1) state_nx = s1; state_nx = s1; else else state_nx = s0; --optional state_nx = s0; --optional
47
MOORE MACHINES S1: y = ; --Moore machine if (x == 1) if (x == 1) state_nx = S0; state_nx = S0; else else state_nx = S1; --optional state_nx = S1; --optionalendcaseend
48
EXAMPLE: OUT-OF- SEQUENCE COUNTER DESCRIBE A COUNTER WITH THE FOLLOWING SEQUENCE: DESCRIBE A COUNTER WITH THE FOLLOWING SEQUENCE: –“000” => “010” => “011” => “001” => “111” => “000”
49
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];
50
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; end endmodule
51
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;
52
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
53
Include files `include "timing.vh" module counter1(count, reset, clk) ; output [7:0] count; output [7:0] count; input reset, clk; input reset, clk; reg [7:0] count; reg [7:0] count; always @(posedge clk or posedge reset) always @(posedge clk or posedge reset) if(reset) if(reset) count <= #(`REG_DELAY) 8'b0; count <= #(`REG_DELAY) 8'b0; else else count <= #(`REG_DELAY) count + 8 'b1; count <= #(`REG_DELAY) count + 8 'b1;... //contents of ”timing.vh” file //contents of ”timing.vh” file `timescale Ins/Ins `define REG_DELAY 1
54
Parametric 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
55
Example Create an ALU with parametric wordlength, and the following function table Create an ALU with parametric wordlength, and the following function table S2S1S0FUNCTION S2S1S0FUNCTION 000A + B 000A + B 001A – B 001A – B 010A + 1 010A + 1 011B + 1 011B + 1 100A AND B 100A AND B 101A OR B 101A OR B 110A XOR B 110A XOR B 111NOT A 111NOT A
56
Blocking vs Non-Blocking Assignments Blocking (=) and non-blocking (<=) assignments appear in sequential (procedural) code only. Blocking (=) and non-blocking (<=) assignments appear in sequential (procedural) code only. Both are not allowed in the same block Both are not allowed in the same block The assign statement in non- procedural code is non-blocking The assign statement in non- procedural code is non-blocking
57
Blocking VS Non-blocking in Simulation module block(); reg a, b, c; // Blocking assignments initial begin a = #10 1'b1;// assign 1 to a at time 10 b = #20 1'b0;// assign 0 to b at time 30 c = #40 1'b1;// assign 1 to c at time 70 endendmodule module nonblock(); // Nonblocking assignments reg a, b, c; // non-blocking assignments initial begin initial begin a <= #10 1'b1;//assign 1 to a at time 10 b <= #20 1'b0;//assign 0 to b at time 20 c <= #40 1'b1;//assign 1 to c at time 40 endendmodule
58
Blocking VS non-blocking in Hardware Non-blocking assignments are closer to hardware behavior and should be preferred when describing flip-flops and registers. Non-blocking assignments are closer to hardware behavior and should be preferred when describing flip-flops and registers.
59
Example Design an 8-bit shift register. Use first blocking and then non-blocking assignments for the flip-flops. Synthesize your descriptions. Which type of assignment corresponds to correct hardware? Design an 8-bit shift register. Use first blocking and then non-blocking assignments for the flip-flops. Synthesize your descriptions. Which type of assignment corresponds to correct hardware?
60
Tasks and Functions A task begins with keyword task and ends with keyword endtask A task begins with keyword task and ends with keyword endtask Inputs and outputs are declared after the keyword task. Inputs and outputs are declared after the keyword task. Local variables are declared after input and output declaration. Local variables are declared after input and output declaration. Coding tasks separately allows them to be called from several modules Coding tasks separately allows them to be called from several modules
61
Task example module FP_task(); task conv2FP; input [15:0] binary; output [31:0] fp; reg sign; reg [7:0] exponent; reg [22:0] significand; integer i; integer dp; integer flag; beginflag=0; for (i=15; i>-1; i=i-1) begin for (i=15; i>-1; i=i-1) begin if (binary[i]== 1 && flag==0) begin if (binary[i]== 1 && flag==0) begin dp=i; dp=i; flag=1; end else elsesignificand[i]=binary[i]; end endexponent=127+15-dp;significand[8:0]=0;sign=0;fp={sign,exponent,significand};endendtaskendmodule
62
Calling a Task module FP_task_tb (); FP_task UUT (); wire [15:0] number; reg [31:0] fp_out; assign number=9; always @ (number) conv2FP (number, fp_out); endmodule
63
Functions Very similar to tasks Very similar to tasks Can only have one output Can only have one output Can call other functions but not tasks Can call other functions but not tasks Timing delays are not allowed in functions Timing delays are not allowed in functions A function begins with keyword function and ends with keyword endfunction A function begins with keyword function and ends with keyword endfunction inputs are declared after the keyword function. inputs are declared after the keyword function. They can be called with an assignment They can be called with an assignment
64
Common Verilog Pitfalls
65
Name inconsistency Compile: error Compile: error Severity: Trivial Severity: Trivial module wrong_name (o, i0, i1, i2); output o; output o; input i1, i2, i3; input i1, i2, i3; assign o = i0 & i1 ^ i2; assign o = i0 & i1 ^ i2;endmodule
66
Multiple unconditional concurrent assignments Simulation: ‘X’ value Simulation: ‘X’ value Synthesis: ERROR: signal is multiply driven Synthesis: ERROR: signal is multiply driven Severity: Serious Severity: Serious module … assign x = a & b;... assign x = b ^ c; always @ (b or c) begin x <= b | c; end
67
Incomplete sensitivity list Simulation: Unexpected behavior Simulation: Unexpected behavior Synthesis: Warning: Incomplete sensitivity list Synthesis: Warning: Incomplete sensitivity list Severity: Serious Severity: Serious Solution: complete sensitivity list Solution: complete sensitivity list always @ (a or b) begin d <= (a & b) | c; //c is missing from sensitivity list!!! d <= (a & b) | c; //c is missing from sensitivity list!!!end
68
Not assigning all outputs in combinational always block Simulation: Simulation: Synthesis: Warning: Signal not always assigned, storage may be needed Synthesis: Warning: Signal not always assigned, storage may be needed Severity: Serious Severity: Serious Solution: assign all signals Solution: assign all signals always @ (a or b or c) begin if (c == 0) then if (c == 0) then d <= (a & b) | c; //d assigned only first time, d <= (a & b) | c; //d assigned only first time, else if (c == 1) else if (c == 1) e <= a; //e assigned only second time!!! e <= a; //e assigned only second time!!!end
69
Unassigned signals Simulation: Undefined value (‘U’) Simulation: Undefined value (‘U’) Synthesis: Warning: Signal is never used/never assigned a value Synthesis: Warning: Signal is never used/never assigned a value Severity: Moderate Severity: Moderate module … output y; input input1, input2; reg s; assign y = input1 & input2; //s never assigned endmodule
70
Output not assigned or not connected Simulation: Undefined Simulation: Undefined Synthesis: Error: All logic removed from the design Synthesis: Error: All logic removed from the design Severity: Serious Severity: Serious module my_module (o, input1, input2); output o; input input1, input2; reg s; assign s = input1 & input2; //output never assigned endmodule
71
Using sequential instead of concurrent process Simulation: Unexpectedly delayed signals Simulation: Unexpectedly delayed signals Synthesis: More FFs than expected Synthesis: More FFs than expected
Similar presentations
© 2024 SlidePlayer.com. Inc.
All rights reserved.