verilog & fpga
DESCRIPTION
Verilog & FPGA. Digital Design. Standard HDL languages. Standards HDL (hardware description language) languages Verilog 1984: Gateway Design Automation Inc. 1990: Cadence -> Open Verilog International 1995: IEEE standardization 2001: Verilog 2001 VHDL 1983-85: IBM, Texas Instruments - PowerPoint PPT PresentationTRANSCRIPT
![Page 1: Verilog & FPGA](https://reader033.vdocuments.us/reader033/viewer/2022061610/56815509550346895dc2f1fc/html5/thumbnails/1.jpg)
Verilog & FPGA
Digital Design
![Page 2: Verilog & FPGA](https://reader033.vdocuments.us/reader033/viewer/2022061610/56815509550346895dc2f1fc/html5/thumbnails/2.jpg)
Standard HDL languages
• Standards HDL (hardware description language) languages– Verilog
• 1984: Gateway Design Automation Inc.• 1990: Cadence -> Open Verilog International• 1995: IEEE standardization• 2001: Verilog 2001
– VHDL• 1983-85: IBM, Texas Instruments• 1987: IEEE standardization• 1994: VHDL-1993
![Page 3: Verilog & FPGA](https://reader033.vdocuments.us/reader033/viewer/2022061610/56815509550346895dc2f1fc/html5/thumbnails/3.jpg)
Other HDL languages
• HDL development is very time consuming compared to software development
• Lot of programmers with C/C++ knowledge, much less HDL designer
• High level hardware description languages– Celoxica Handel-C: based on ANSI-C with special
features– SystemC: standardized, object oriented C++ based
language– Mentor Catapult-C: can generate hardware from
standard C code• Faster simulation, verification• HW/SW co-design
![Page 4: Verilog & FPGA](https://reader033.vdocuments.us/reader033/viewer/2022061610/56815509550346895dc2f1fc/html5/thumbnails/4.jpg)
Purpose of HDL languages
• Modeling hardware behavior– Large part of these languages can only be used for
simulation, not for hardware generation (synthesis)– Synthesizable part depends on the actual synthesizer
• Replace graphical, schematic based design method (which very time consuming)
• RTL (Register Transfer Level) level description– Automatic hardware synthesis– Increase productivity
![Page 5: Verilog & FPGA](https://reader033.vdocuments.us/reader033/viewer/2022061610/56815509550346895dc2f1fc/html5/thumbnails/5.jpg)
HDL languages
• Modular languages• HDL module
– Input and output port definitions– Logic equations between the inputs and the outputs
• Unlike software programming languages, NOT a sequential language– Describes PARALLEL OPERATIONS
![Page 6: Verilog & FPGA](https://reader033.vdocuments.us/reader033/viewer/2022061610/56815509550346895dc2f1fc/html5/thumbnails/6.jpg)
Modules
• Building blocks to design complex, hierarchical systems• Hierarchical description, partitioning
states
state
timer
timer_s
timer
timer_ps
timer
timer_p
timer
timer_z
led[2:0][2:0]rstclk clk
rst[3:0] step_state[3:0]
[3:0]state[3:0]
[2:0]leds[2:0]
clkrst
[0] state[0]
zero
clkrst
[1] state[1]
zero
clkrst
[2] state[2]
zero
clkrst
[3] state[3]
zero
![Page 7: Verilog & FPGA](https://reader033.vdocuments.us/reader033/viewer/2022061610/56815509550346895dc2f1fc/html5/thumbnails/7.jpg)
Verilog Syntax
• Comments (like C)– // one line– /* */ multiple lines
• Constants– <bit width><‘base><value>
• 5’b00100: 00100 decimal value: 4, 5 bit wide• 8’h4e: 01001110 decimal value: 78, 8 bit
wide• 4’bZ: ZZZZ high impedance
state
![Page 8: Verilog & FPGA](https://reader033.vdocuments.us/reader033/viewer/2022061610/56815509550346895dc2f1fc/html5/thumbnails/8.jpg)
Verilog: module (2001)
„module” keyword„module” name
Input ports
Output ports
„endmodule”keyword
Functional description
module test(input clk,input [7:0] data_in,output [7:0] data_out,output reg valid
);…….…….…….endmodule
![Page 9: Verilog & FPGA](https://reader033.vdocuments.us/reader033/viewer/2022061610/56815509550346895dc2f1fc/html5/thumbnails/9.jpg)
Verilog: module
module test(clk, data_in, data_out, valid);input clk;input [7:0] data_in;output [7:0] data_out;output reg valid;…….…….…….endmodule
„module” keyword„module” name
Port list(without type)
„endmodule”keyword
Port types
![Page 10: Verilog & FPGA](https://reader033.vdocuments.us/reader033/viewer/2022061610/56815509550346895dc2f1fc/html5/thumbnails/10.jpg)
Bit operations
• ~, &, |, ^, ~^ (negate, and, or, xor, xnor)• Bitwise operator on vectors, e.g.:
– 4’b1101 & 4’b0110 = 4’b0100• If the operand widths are not equal, the smaller one is
extended with zeros– 2’b11 & 4’b1101 = 4’b0001
• (Logic operators: !, &&, ||)
![Page 11: Verilog & FPGA](https://reader033.vdocuments.us/reader033/viewer/2022061610/56815509550346895dc2f1fc/html5/thumbnails/11.jpg)
Bit reduction operators
• Operates on all bits of a vector, the output is a single bit• &, ~&, |, ~|, ^, ~^ (and, nand, or, nor, xor, xnor)
– &4’b1101 = 1’b0– |4’b1101 = 1’b1– Typical usage scenarios:
• Parity check
![Page 12: Verilog & FPGA](https://reader033.vdocuments.us/reader033/viewer/2022061610/56815509550346895dc2f1fc/html5/thumbnails/12.jpg)
Comparison
• Same as in C• Equal, not-equal
– ==, !=– ===: equality considering „Z”, „X”– !==: not-equal considering „Z”, „X”
• Comparison– <, >, <=, >=
![Page 13: Verilog & FPGA](https://reader033.vdocuments.us/reader033/viewer/2022061610/56815509550346895dc2f1fc/html5/thumbnails/13.jpg)
Arithmetic
• Same as in C• Operators: +, -, *, /, %
– Not all of them is synthesizable• E.g. division, modulo are only synthesizable when
the second operator is power of 2– Negative numbers in twos-complement code
![Page 14: Verilog & FPGA](https://reader033.vdocuments.us/reader033/viewer/2022061610/56815509550346895dc2f1fc/html5/thumbnails/14.jpg)
Other operators
• Concatenate: {}E.g.:– {4’b0101, 4’b1110} = 8’b01011110
• Shift:– <<, >>
• Bit selection– Selected part has to be constant– data[5:3]
![Page 15: Verilog & FPGA](https://reader033.vdocuments.us/reader033/viewer/2022061610/56815509550346895dc2f1fc/html5/thumbnails/15.jpg)
Data types
• wire– Behaves like a real wire (combinatorial logic)– Declaration of an 8 bit wire: wire [7:0] data;
• reg– After synthesis it can translate into
• Wire• Latch• Flip-flop
– E.g.: reg [7:0] data;
![Page 16: Verilog & FPGA](https://reader033.vdocuments.us/reader033/viewer/2022061610/56815509550346895dc2f1fc/html5/thumbnails/16.jpg)
Assign
• Assign can be used only on wire types• Continuous assignment
– Left operand continuously gets a new value• E.g.
– assign c = a & b;
• Only one assign can drive a single variable• Multiple assigns operate parallel to each other• Can be used to describe combinatorial logic
cba
![Page 17: Verilog & FPGA](https://reader033.vdocuments.us/reader033/viewer/2022061610/56815509550346895dc2f1fc/html5/thumbnails/17.jpg)
Always block
• Syntax:
• A variable should be written only in one always block• The sensitivity list cannot contain the outputs (left-side
variables) of the always block• Assign cannot be used within an always block• Multiple always blocks are executed in parallel
always @ (….)begin…..…..end
Sensitivity list
Operations
![Page 18: Verilog & FPGA](https://reader033.vdocuments.us/reader033/viewer/2022061610/56815509550346895dc2f1fc/html5/thumbnails/18.jpg)
Always – assignments
• Blocking: =– Blocks the execution of operations after it till it is
executed -> sequential operation (don’t use it unless really necessary)
• Nonblocking: <=– Nonblocking assignments are executed in parallel ->
hardware-like operation• Always use nonblocking assignment
![Page 19: Verilog & FPGA](https://reader033.vdocuments.us/reader033/viewer/2022061610/56815509550346895dc2f1fc/html5/thumbnails/19.jpg)
Always – Flip Flop
• Flip Flop: edge sensitive storage element
• Synchronous reset
• Asynchronous reset
cba
clk
Q[0]D[0]
always @ (posedge clk)if (rst)
c <= 1'b0;else
c <= a & b;
always @ (posedge clk)c <= a & b;
cba
rst
clk
Q[0]D[0]R
always @ (posedge clk, posedge rst)if (rst)
c <= 1'b0;else
c <= a & b;
Rcb
a
rst
clk
Q[0]D[0]
![Page 20: Verilog & FPGA](https://reader033.vdocuments.us/reader033/viewer/2022061610/56815509550346895dc2f1fc/html5/thumbnails/20.jpg)
Always – Flip Flop
• In Xilinx FPGAs– Reset and set can be synchronous or asynchronous– Priority in synchronous case:
• reset, set, ce• Asynchronous example:
always @ (posedge clk, posedge rst, posedge set)if (rst)
c <= 1'b0;else if (set)
c <= 1'b1;else if (ce)
c <= a & b;c
R
Scb
a
ce
set
rst
clk
Q[0]D[0]E
![Page 21: Verilog & FPGA](https://reader033.vdocuments.us/reader033/viewer/2022061610/56815509550346895dc2f1fc/html5/thumbnails/21.jpg)
Always – comb. logic
• Result is continuously calculated – if any of the inputs changes the output immediately changes
always @ (a, b) c <= a & b;
cba
always @ (*) c <= a & b;
![Page 22: Verilog & FPGA](https://reader033.vdocuments.us/reader033/viewer/2022061610/56815509550346895dc2f1fc/html5/thumbnails/22.jpg)
Always – latch
• Latch: level sensitive storage element– as long as the „gate” input is ‘1’, the input is sampled into the
latch– If the „gate” input is ‘0’, the previously sampled value is kept
always @ (*)If (g) c <= a & b;
lat
c
cba
g
D[0] Q[0]C
![Page 23: Verilog & FPGA](https://reader033.vdocuments.us/reader033/viewer/2022061610/56815509550346895dc2f1fc/html5/thumbnails/23.jpg)
Always – latch error
• Using latch is typically a bad idea; it can be generated by wrong code– Not full if or case statements– Synthesizers typically give a warning
always @ (*)case (sel) 2’b00: r <= in0; 2’b01: r <= in1; 2’b10: r <= in2;endcase
LD
r
0
1
0
1
r
in2
in1
in0
sel[1:0][1:0]
DG Q
[1]
[0]
[1]
[0]
[0]
always @ (*)if (sel==0) r <= in0;else if (sel==1) r <= in1;else if (sel==2) r <= in2;
![Page 24: Verilog & FPGA](https://reader033.vdocuments.us/reader033/viewer/2022061610/56815509550346895dc2f1fc/html5/thumbnails/24.jpg)
Always – correct if/case
• Correct code using combinatorial if/case
always @ (*)case (sel) 2’b00: r <= in0; 2’b01: r <= in1; 2’b10: r <= in2; default: r <= ‘bx;endcase
always @ (*)if (sel==0) r <= in0;else if (sel==1) r <= in1;else r <= in2;
0
1
0
1 r
in2
in1
in0
sel[1:0] [1:0]
[1][0]
[0]
![Page 25: Verilog & FPGA](https://reader033.vdocuments.us/reader033/viewer/2022061610/56815509550346895dc2f1fc/html5/thumbnails/25.jpg)
Blocking – nonblocking (1)
reg t, r;always @ (posedge clk)begin
t <= a & b;r <= t | c;
end
reg t, r;always @ (posedge clk)begin
t = a & b;r = t | c;
end
rt
r
c
ba
clk
Q[0]D[0]Q[0]D[0]
r
r
c
ba
clk
Q[0]D[0]
reg t, r;always @ (posedge clk)begin
r = t | c; t = a & b;end
rt
r
c
ba
clk
Q[0]D[0]Q[0]D[0]
![Page 26: Verilog & FPGA](https://reader033.vdocuments.us/reader033/viewer/2022061610/56815509550346895dc2f1fc/html5/thumbnails/26.jpg)
Blocking – nonblocking (2)
reg t, r;always @ (posedge clk)begin
t = a & b;r <= t | c;
end
r
r
c
ba
clk
Q[0]D[0]
reg t, r;always @ (posedge clk)begin
t <= a & b;r = t | c;
end
rt
r
c
ba
clk
Q[0]D[0]Q[0]D[0]
![Page 27: Verilog & FPGA](https://reader033.vdocuments.us/reader033/viewer/2022061610/56815509550346895dc2f1fc/html5/thumbnails/27.jpg)
Blocking – nonblocking (3)
reg s2, s3;always @ (posedge clk)begin s2 <= in0 + in1; s3 <= s2 + in2;end
reg s0, s1;always @ (posedge clk)begin s0 = in0 + in1; s1 = s0 + in2;end
• Eg. 3 input adderreg s4;always @ (posedge clk)begin s4 <= in0 + in1 + in2;end
s2
s3
6 15
9
In0
In1
In2
2
4
5
6
9
3
s4 11 18
In0
In1
In2
2
4
5
6
9
3
In0
In1
In2
s0
s1
2
4
5
6
11
6
9
3
15
18
![Page 28: Verilog & FPGA](https://reader033.vdocuments.us/reader033/viewer/2022061610/56815509550346895dc2f1fc/html5/thumbnails/28.jpg)
Structural description
• Creating hierarchy: connecting modules
• Port – signal assignment based on the port names
module top_level (input in0, in1, in2, output r);
wire xor0;xor_m xor_inst0(.i0(in0), .i1(in1), .o(xor0));xor_m xor_inst1(.i0(xor0), .i1(in2), .o(r));
endmodule
xor_m
xor_inst0
xor_m
xor_inst1
r
in2
in1in0 i0
i1 o i0i1 o
![Page 29: Verilog & FPGA](https://reader033.vdocuments.us/reader033/viewer/2022061610/56815509550346895dc2f1fc/html5/thumbnails/29.jpg)
Example – MUX (1.)
• 2:1 multiplexer
module mux_21 (input in0, in1, sel, output r);assign r = (sel==1’b1) ? in1 : in0;endmodule
module mux_21 (input in0, in1, sel, output reg r);always @ (*)if (sel==1’b1) r <= in1;else r <= in0;endmodule
module mux_21 (input in0, in1, sel, output reg r);always @ (*)case(sel)
1’b0: r <= in0;1’b1: r <= in1;
endmodule
![Page 30: Verilog & FPGA](https://reader033.vdocuments.us/reader033/viewer/2022061610/56815509550346895dc2f1fc/html5/thumbnails/30.jpg)
Example – MUX (2.)
• 4:1 multiplexer
module mux_41 (input in0, in1, in2, in3, input [1:0] sel, output reg r);always @ (*)case(sel)
2’b00: r <= in0;2’b01: r <= in1;2’b10: r <= in2;2’b11: r <= in3;
endcaseendmodule
0
1
0
1
r
in3
in2
in1
in0
sel[1:0]
I0
I1
[0] S
O[1]
[1]
![Page 31: Verilog & FPGA](https://reader033.vdocuments.us/reader033/viewer/2022061610/56815509550346895dc2f1fc/html5/thumbnails/31.jpg)
Example – 1 bit full adder
module add1_full (input a, b, cin, output cout, s);xor3_m xor(.i0(a), .i1(b), .i2(cin), .o(s));wire a0, a1, a2;and2_m and0(.i0(a), .i1(b), .o(a0));and2_m and1(.i0(a), .i1(cin), .o(a1));and2_m and2(.i0(b), .i1(cin), .o(a2));or3_m or(.i0(a0), .i1(a1), .i2(a2) , .o(cout))endmodule
module add1_full (input a, b, cin, output cout, s); assign s = a ^ b ^ cin;assign cout = (a & b) | (a & cin) | (b & cin);
endmodule
module add1_full (input a, b, cin, output cout, s);assign {cout, s} = a + b + cin;
endmodule
![Page 32: Verilog & FPGA](https://reader033.vdocuments.us/reader033/viewer/2022061610/56815509550346895dc2f1fc/html5/thumbnails/32.jpg)
Example – 4 bit adder, structural
module add4 (input [3:0] a, b, output [4:0] s);wire [3:0] cout;add1_full add0(.a(a[0]), .b(b[0]), .cin(1'b0), .cout(cout[0]), .s(s[0]));add1_full add1(.a(a[1]), .b(b[1]), .cin(cout[0]), .cout(cout[1]), .s(s[1]));add1_full add2(.a(a[2]), .b(b[2]), .cin(cout[1]), .cout(cout[2]), .s(s[2]));add1_full add3(.a(a[3]), .b(b[3]), .cin(cout[2]), .cout(s[4]), .s(s[3]));endmodule
module add4 (input [3:0] a, b, input cin, output cout, output [3:0] sum);assign {cout, sum} = a + b + cin;endmodule
![Page 33: Verilog & FPGA](https://reader033.vdocuments.us/reader033/viewer/2022061610/56815509550346895dc2f1fc/html5/thumbnails/33.jpg)
Example – 4 bit adder, structural
![Page 34: Verilog & FPGA](https://reader033.vdocuments.us/reader033/viewer/2022061610/56815509550346895dc2f1fc/html5/thumbnails/34.jpg)
Example – 4 bit adder, RTL
![Page 35: Verilog & FPGA](https://reader033.vdocuments.us/reader033/viewer/2022061610/56815509550346895dc2f1fc/html5/thumbnails/35.jpg)
Example – Shift register
• 16 bit deep shift register (e.g. for delaying a value)
module shr (input clk, sh, din, output dout);
reg [15:0] shr;always @ (posedge clk)if (sh)
shr <= {shr[14:0], din};
assign dout = shr[15];
endmodule
![Page 36: Verilog & FPGA](https://reader033.vdocuments.us/reader033/viewer/2022061610/56815509550346895dc2f1fc/html5/thumbnails/36.jpg)
Example – Counter
• Binary counter with synchronous reset, clock enable, load and direction inputsmodule m_cntr (input clk, rst, ce, load, dir, input [7:0] din, output [7:0] dout);
reg [7:0] cntr_reg;always @ (posedge clk)if (rst)
cntr_reg <= 0;else if (ce)
if (load)cntr_reg <= din;
else if (dir)cntr_reg <= cntr_reg – 1;
elsecntr_reg <= cntr_reg + 1;
assign dout = cntr_reg;
endmodule
![Page 37: Verilog & FPGA](https://reader033.vdocuments.us/reader033/viewer/2022061610/56815509550346895dc2f1fc/html5/thumbnails/37.jpg)
Example – Secundum counter
• 50 MHz clock frequency, 1 sec = 50 000 000 clocksmodule sec (input clk, rst, output [6:0] dout);
reg [25:0] clk_div;wire tc; always @ (posedge clk)If (rst)
clk_div <= 0;else
if (tc)clk_div <= 0;
elseclk_div <= clk_div + 1;
assign tc = (clk_div == 49999999);
reg [6:0] sec_cntr;always @ (posedge clk)If (rst)
sec_cntr <= 0;else if (tc)
if (sec_cntr==59)sec_cntr <= 0;
elsesec_cntr <= sec_cntr + 1;
assign dout = sec_cntr;
endmodule
![Page 38: Verilog & FPGA](https://reader033.vdocuments.us/reader033/viewer/2022061610/56815509550346895dc2f1fc/html5/thumbnails/38.jpg)
Tri-state lines
• Bi-directional buses, eg.– E.g. data bus of external memories
• The bus drive enable signal is critical (bus_drv), take care when generating it
module tri_state (input clk, inout [7:0] data_io);
wire [7:0] data_in, data_out;wire bus_drv;
assign data_in = data_io;assign data_io = (bus_drv) ? data_out : 8’bz;
endmodule
![Page 39: Verilog & FPGA](https://reader033.vdocuments.us/reader033/viewer/2022061610/56815509550346895dc2f1fc/html5/thumbnails/39.jpg)
FSM – Finite State Machine
• FSM – to create complex control machines• General structure
• State register: state variable• Next state function: determines the next state
(combinatorial logic)• Output function: generates outputs
– Moore: based on the state register– Mealy: based on the state registers and the current
inputs
NEXTSTATE
STATEREGISTERINPUTS
OUTPUTFUNCTION
CLK RESET
Mealy model
OUTPUTS
![Page 40: Verilog & FPGA](https://reader033.vdocuments.us/reader033/viewer/2022061610/56815509550346895dc2f1fc/html5/thumbnails/40.jpg)
FSM example
• Traffic light (simple)– States: red, yellow, green, red-yellow (no blinking
yellow)– Inputs: timers for the different states– Output: state
R
RY
G
Y
![Page 41: Verilog & FPGA](https://reader033.vdocuments.us/reader033/viewer/2022061610/56815509550346895dc2f1fc/html5/thumbnails/41.jpg)
FSM example – Verilog (1)
module light(input clk, rst, output reg [2:0] led);
parameter RED = 2'b00;parameter RY = 2'b01;parameter GREEN = 2'b10;parameter YELLOW = 2'b11;
reg [15:0] timer;reg [1:0] state_reg;reg [1:0] next_state;
always @ (posedge clk)if (rst)
state_reg <= RED;else
state_reg <= next_state;
always @ (*)case(state_reg)
RED: begin if (timer == 0) next_state <= RY; else next_state <= R; endRY: begin if (timer == 0) next_state <= GREEN; else next_state <= RY; endYELLOW: begin if (timer == 0) next_state <= RED; else next_state <= YELLOW; endGREEN: begin if (timer == 0) next_state <= YELLOW; else next_state <= GREEN; enddefault: next_state <= 3'bxxx;
endcase
![Page 42: Verilog & FPGA](https://reader033.vdocuments.us/reader033/viewer/2022061610/56815509550346895dc2f1fc/html5/thumbnails/42.jpg)
FSM example – Verilog (2)
always @ (posedge clk)case(state_reg)
RED: begin if (timer == 0) timer <= 500; //next_state <= RY; else timer <= timer - 1; endRY: begin if (timer == 0) timer <= 4000; //next_state <= GREEN; else timer <= timer - 1; endYELLOW: begin if (timer == 0) timer <= 4500; //next_state <= RED; else timer <= timer - 1; endGREEN: begin if (timer == 0) timer <= 500; //next_state <= YELLOW; else timer <= timer - 1; end
endcase
• Timer– Loads a new value
when state changes– Down-counter– ==0: state change
always @ (*)case (state_reg)
RY : led <= 3'b110;RED: led <= 3'b100;YELLOW: led <= 3'b010;GREEN: led <= 3'b001;default: led <= 3’b100;
endcase
endmodule
![Page 43: Verilog & FPGA](https://reader033.vdocuments.us/reader033/viewer/2022061610/56815509550346895dc2f1fc/html5/thumbnails/43.jpg)
Parameterized modules
• Parameterized adder
• Instantiating the parameterized module
module add(a, b, s);parameter width = 8;input [width-1:0] a, b;output [width:0] s;
assign s = a + b;
endmodule
wire [15:0] op0, op1;wire [16:0] res;
add #( .width(16))add_16(
.a(op0),
.b(op1),
.s(res));
![Page 44: Verilog & FPGA](https://reader033.vdocuments.us/reader033/viewer/2022061610/56815509550346895dc2f1fc/html5/thumbnails/44.jpg)
Simulation
• Testbench creation: two possibilities in Xilinx ISE– Testbench Waveform
• Generating inputs using a GUI– Verilog Test Fixture
• Generating inputs using Verilog• Simulator
– ISE Simulator– Modelsim (MXE)
![Page 45: Verilog & FPGA](https://reader033.vdocuments.us/reader033/viewer/2022061610/56815509550346895dc2f1fc/html5/thumbnails/45.jpg)
Verilog Test Fixture
• Test Fixture– Test Fixture is a Verilog module– The module under test is a sub-module of the test
fixture– All Verilog syntax constructs can be used– There are non-synthesizable constructs
• Time base– ‘timescale 1ns/1ps
• Time base is 1 ns• Simulation resolution: 1 ps
![Page 46: Verilog & FPGA](https://reader033.vdocuments.us/reader033/viewer/2022061610/56815509550346895dc2f1fc/html5/thumbnails/46.jpg)
Test Fixture - initial
• „initial” block– Execution starts at time „0”– Executed once– „initial” blocks are executed in parallel with each other
and with always blocks and assigns• The delays are cumulative, e.g.
initialbegin
a <= 0;#10 a <= 1;#25 a <= 2;#5 a <= 0;
end0
1 2 0
10 35 40
![Page 47: Verilog & FPGA](https://reader033.vdocuments.us/reader033/viewer/2022061610/56815509550346895dc2f1fc/html5/thumbnails/47.jpg)
Test Fixture - always
• Generating clock
• Clocked inputs (propagation time!)
initialclk <= 1;
always #5clk <= ~clk;
initial cntr <= 0;always @ (posedge clk)
#2 cntr <= cntr + 1;
0 1 2 3 4 5 6
t =2nsOH
![Page 48: Verilog & FPGA](https://reader033.vdocuments.us/reader033/viewer/2022061610/56815509550346895dc2f1fc/html5/thumbnails/48.jpg)
Task
• Declaration:– In the module which uses the task– In a different file (more modules can use the same
task)• Arbitrary number of inputs and outputs• Can contain timing• Variables declared in a task are local variables• Global variables can be read or written by the task• A task can call another task
![Page 49: Verilog & FPGA](https://reader033.vdocuments.us/reader033/viewer/2022061610/56815509550346895dc2f1fc/html5/thumbnails/49.jpg)
Example - Task
• Simulating an asynchronous read operation
• Verilog codetask bus_w(input [15:0] addr, input [7:0] data);begin
xaddr <= addr;#5 xdata <= data;#3 xwe <= 0;#10 xwe <= 1; while (xack != 1) wait;#4 xdata <= 8’bz; xaddr <= 0;
endendtask;
XWE
XDATA
XADDR
XACK
![Page 50: Verilog & FPGA](https://reader033.vdocuments.us/reader033/viewer/2022061610/56815509550346895dc2f1fc/html5/thumbnails/50.jpg)
Example - Task
• „bus_w” is located in „tasks.v” file• x* variables used by the task are global variables defined
in the test fixture • Using the task in a test fixture
– 3 write cycles– 10 ns between them
`include “tasks.v”
initialbegin
bus_w(16’h0, 8’h4);#10 bus_w(16’h1, 8’h65);#10 bus_w(16’h2, 8’h42);
end
![Page 51: Verilog & FPGA](https://reader033.vdocuments.us/reader033/viewer/2022061610/56815509550346895dc2f1fc/html5/thumbnails/51.jpg)
File operations
• Reading data into an array
• Writing data into a file
reg [9:0] input_data[255:0];initial
$readmemh(“input.txt”, input_data);
integer file_out;wire res_valid;wire [16:0] res;
initialfile_out =$fopen(“output.txt");
always @ (posedge clk)if (out_valid)
$fwrite(file_out, "%d \n", res);
![Page 52: Verilog & FPGA](https://reader033.vdocuments.us/reader033/viewer/2022061610/56815509550346895dc2f1fc/html5/thumbnails/52.jpg)
FPGAs
• FPGA: Field Programmable Gate Array– Programmable logic devices
• Manufacturers: Xilinx, Altera, Actel, Quicklogic, Lattice• Features
– Function is defined by the configuration– Configuration can be modified, changed– Complexity
• 50000 – 8000000 system gates• 100 – 600 I/O pins• 100 – 400 MHz operating frequency (design
dependant)– Architecture: e.g. RAM or MUX based
![Page 53: Verilog & FPGA](https://reader033.vdocuments.us/reader033/viewer/2022061610/56815509550346895dc2f1fc/html5/thumbnails/53.jpg)
Xilinx FPGAs
• Different families– Spartan: efficient, low cost– Virtex: more complex, higher performance, extended
features• Architecture:
– CLB: configurable logic block– IOB: I/O block– BlockRAM: internal memory– Multiplier, DSP block– Clock resources: DCM, dedicated clock routing– Embedded PowerPC processor– Routing resources
![Page 54: Verilog & FPGA](https://reader033.vdocuments.us/reader033/viewer/2022061610/56815509550346895dc2f1fc/html5/thumbnails/54.jpg)
Xilinx FPGA: configuration
• Configuration (CLB content, routing, connections, other parameters) is stored in SRAM
• Configuration is lost when there is no power supply• Configuration must be loaded after power-up
– From EEPROM automatically– Through a development cable (JTAG)
![Page 55: Verilog & FPGA](https://reader033.vdocuments.us/reader033/viewer/2022061610/56815509550346895dc2f1fc/html5/thumbnails/55.jpg)
Xilinx FPGAs – primitives
• Using FPGA primitives:– The internal building blocks of the FPGA can be
accessed as a primitive -> can be used as an HDL module
– For most primitives synthesizers can infer them from the appropriate register transfer level HDL description
![Page 56: Verilog & FPGA](https://reader033.vdocuments.us/reader033/viewer/2022061610/56815509550346895dc2f1fc/html5/thumbnails/56.jpg)
Xilinx FPGAs
• Implemented design: logic + routing
![Page 57: Verilog & FPGA](https://reader033.vdocuments.us/reader033/viewer/2022061610/56815509550346895dc2f1fc/html5/thumbnails/57.jpg)
Xilinx FPGAs – CLB
• Each CLB consists of 4 slices• Slice:
– 2 LUTs: look up table, used to implement• Combinatorial logic functions• Small ROM and RAM• Efficient shift registers
– 2 Storage elements: configured to FF or latch• Control signals (set, reset, ce) are shared within a
slice– Dedicated multiplexer (MUXFx)– Fast carry logic (MUXCY, XORCY)
![Page 58: Verilog & FPGA](https://reader033.vdocuments.us/reader033/viewer/2022061610/56815509550346895dc2f1fc/html5/thumbnails/58.jpg)
Xilinx FPGA: basic logic element
• Simple schematic of a slice
• 4-input LUT: Look-Up Table– 16x1 bit memory– Address: inputs of the logic equation– Content: truth table– Can implement any 4 input logic equation
4LUT
FFCarry
+MUX
LUT
IN
Carry IN
Carry OUT
MUX IN
Comb. OUT
FF OUT
![Page 59: Verilog & FPGA](https://reader033.vdocuments.us/reader033/viewer/2022061610/56815509550346895dc2f1fc/html5/thumbnails/59.jpg)
Half-slice (4 input LUT)
• Spartan series, and Virtex series (excluding Virtex-5)
![Page 60: Verilog & FPGA](https://reader033.vdocuments.us/reader033/viewer/2022061610/56815509550346895dc2f1fc/html5/thumbnails/60.jpg)
Half-slice (6 input LUT)
• Virtex-5
![Page 61: Verilog & FPGA](https://reader033.vdocuments.us/reader033/viewer/2022061610/56815509550346895dc2f1fc/html5/thumbnails/61.jpg)
LUT ROM
• ROM (asynchronous)– HDL code
– Xilinx primitives• ROM16X1, ROM32x1,…..
module rom16 (input [3:0] address, output reg [7:0] data);always @ (*)case(address)
4’b0000: data <= CONSTANT0;4’b0001: data <= CONSTANT1;……4’b1111: data <= CONSTANT15;
endcaseendmodule
![Page 62: Verilog & FPGA](https://reader033.vdocuments.us/reader033/viewer/2022061610/56815509550346895dc2f1fc/html5/thumbnails/62.jpg)
LUT RAM
• RAM: synchronous write, asynchronous read– HDL code
– Xilinx primitives• Single port: RAM16X1S, …..• Dual port: RAM16X1D, …..
module ram16 (input clk, we, input [3:0] addr, input [7:0] din, output [7:0] dout);reg [7:0] mem[15:0];always @ (posedge clk)if (we)
mem[addr] <= din;
assign dout = mem[addr];endmodule
![Page 63: Verilog & FPGA](https://reader033.vdocuments.us/reader033/viewer/2022061610/56815509550346895dc2f1fc/html5/thumbnails/63.jpg)
LUT RAM timing
• Read: asynchronous– Address generated with a counter
• Write: synchronous– Write happens at the marked rising clock edges
0 1 2 3 4 5 6ADDRESS
D0 D1 D2 D3 D4 D5 D6DATA
0 1 2 3 4 5 6ADDRESS
D0 D1 D2 D3 D4 D5 D6DATA
WE
![Page 64: Verilog & FPGA](https://reader033.vdocuments.us/reader033/viewer/2022061610/56815509550346895dc2f1fc/html5/thumbnails/64.jpg)
Shift register
• LUT based, output addressable shift register– HDL code
– NO reset input– Xilinx primitives
• SRLC16, SRLC16E, SRLC32, SRLC32E
module shr_16x1 (input clk, sh, din, input [3:0] addr, output dout);reg [15:0] shr;always @ (posedge clk)if (sh)
shr <= {shr[14:0], din};
assign dout = shr[addr];
endmodule
![Page 65: Verilog & FPGA](https://reader033.vdocuments.us/reader033/viewer/2022061610/56815509550346895dc2f1fc/html5/thumbnails/65.jpg)
Shift register array
module shr_16x8 (input clk, sh, input [3:0] addr, input [7:0] din, output [7:0] dout);reg [7:0] shr[15:0];integer i;always @ (posedge clk)if (sh)begin
shr[0] <= din;for (i=15; i>0, i=i-1) begin
shr[i] <= shr[i-1];end
end
assign dout = shr[addr];
endmodule
![Page 66: Verilog & FPGA](https://reader033.vdocuments.us/reader033/viewer/2022061610/56815509550346895dc2f1fc/html5/thumbnails/66.jpg)
BlockRAM
• Synchronous dual-port memory– Depth: 16384 + 2048 (parity) bit– Data width: 1, 2, 4, 9, 18, 36 bit
• Ports:– CLK, WE, EN, SSR (clock, write enable, enable,
synchronous reset)– ADDR, DI, DO (address, data in, data out)– All inputs are synchronous– Output changes 2-3 ns after the clock edge
• Xilinx primitives– Single port: RAMB16_S1…RAMB16_S36– Dual port: RAMB16_S1_S1…RAMB16_S36_S36
![Page 67: Verilog & FPGA](https://reader033.vdocuments.us/reader033/viewer/2022061610/56815509550346895dc2f1fc/html5/thumbnails/67.jpg)
BlockRAM timing
• Read: synchronous– Address generated by a counter
• Write: synchronous– Write happens at the marked rising clock edges
0 1 2 3 4 5 6ADDRESS
D0 D1 D2 D3 D4 D5 D6DATA
0 1 2 3 4 5 6ADDRESS
D0 D1 D2 D3 D4 D5 D6DATA
WE
![Page 68: Verilog & FPGA](https://reader033.vdocuments.us/reader033/viewer/2022061610/56815509550346895dc2f1fc/html5/thumbnails/68.jpg)
Read-Write collision
• Output during an active write operation– Does not change (NO_ CHANGE)– Previous data is presented (READ_FIRST)– New data is presented (WRITE_FIRST)
• In dual-port configuration the output of the non-write port is invalid during write cycles (except in READ_FIRST mode)
• Writing to the same address from both ports is forbidden
![Page 69: Verilog & FPGA](https://reader033.vdocuments.us/reader033/viewer/2022061610/56815509550346895dc2f1fc/html5/thumbnails/69.jpg)
BlockRAM using primitive
RAMB16_S9 #( .INIT(9'h000), // Value of output RAM registers at startup .SRVAL(9'h000), // Output value upon SSR assertion .WRITE_MODE("WRITE_FIRST")) RAMB16_S9_inst ( .DO(DO), // 8-bit Data Output .DOP(DOP), // 1-bit parity Output .ADDR(ADDR), // 11-bit Address Input .CLK(CLK), // Clock .DI(DI), // 8-bit Data Input .DIP(DIP), // 1-bit parity Input .EN(EN), // RAM Enable Input .SSR(SSR), // Synchronous Set/Reset Input .WE(WE) // Write Enable Input);
![Page 70: Verilog & FPGA](https://reader033.vdocuments.us/reader033/viewer/2022061610/56815509550346895dc2f1fc/html5/thumbnails/70.jpg)
SP BlockRAM – Read First
module sp_ram(input clk, input we, input en, input [10:0] addr, input [ 7:0] din, output [7:0] dout);
reg [7:0] memory[2047:0];reg [7:0] dout_reg;
always @ (posedge clk)if (en)begin if (we) memory[addr] <= din; dout_reg <= memory[addr];end
assign dout = dout_reg;
endmodule
![Page 71: Verilog & FPGA](https://reader033.vdocuments.us/reader033/viewer/2022061610/56815509550346895dc2f1fc/html5/thumbnails/71.jpg)
SP BlockRAM – Write First
module sp_ram(input clk, input we, input en, input [10:0] addr, input [ 7:0] din, output [7:0] dout);
reg [7:0] memory[2047:0];reg [7:0] dout_reg;
always @ (posedge clk)if (en)begin if (we) memory[addr] = din; dout_reg = memory[addr];end
assign dout = dout_reg;
endmodule
![Page 72: Verilog & FPGA](https://reader033.vdocuments.us/reader033/viewer/2022061610/56815509550346895dc2f1fc/html5/thumbnails/72.jpg)
SP BlockRAM – No Change
module sp_ram(input clk, input we, input en, input [10:0] addr, input [ 7:0] din, output [7:0] dout);
reg [7:0] memory[2047:0];reg [7:0] dout_reg;
always @ (posedge clk)if (en)begin if (we) memory[addr] <= din; else dout_reg <= memory[addr];end
assign dout = dout_reg;
endmodule
![Page 73: Verilog & FPGA](https://reader033.vdocuments.us/reader033/viewer/2022061610/56815509550346895dc2f1fc/html5/thumbnails/73.jpg)
DP BlockRAMmodule dp_ram(input clk_a, we_a, en_a, clk_b, we_b, en_b, input [10:0] addr_a, addr_b, input [ 7:0] din_a, din_b, output [7:0] dout_a, dout_b);
reg [7:0] memory[2047:0];reg [7:0] dout_reg_a, dout_reg_b;
always @ (posedge clk_a)if (en_a)begin if (we_a) memory[addr_a] <= din_a; dout_reg_a <= memory[addr_a];endassign dout_a = dout_reg_a;
always @ (posedge clk_b)if (en_b)begin if (we_b) memory[addr_b] <= din_b; dout_reg_b <= memory[addr_b];endassign dout_b = dout_reg_b;
endmodule
![Page 74: Verilog & FPGA](https://reader033.vdocuments.us/reader033/viewer/2022061610/56815509550346895dc2f1fc/html5/thumbnails/74.jpg)
Multiplier: 18x18, signed
• HDL– Combinatorial
– Synchronous
• Xilinx primitives– MUL18X18, MUL18X18S
module mul_c (input signed [17:0] a, b, output signed [35:0] p); assign p = a*b;
endmodule
module mul_s (input clk, en, input signed [17:0] a, b, output reg signed [35:0] p); always @ (posedge clk)if (en)
p <= a*b;endmodule