process!

Transkrypt

process!
Języki Opisu Sprzętu
Studium Zaoczne III rok
kierunek Elektronika
Język VHDL cz.3
Program wykładu
• Wstęp do syntezy
• Sprzętowa reprezentacja
obiektów w VHDL
• Synteza obiektów VHDL
• Synteza instrukcji VHDL
• Przykłady aplikacji
Kontakt z prowadzącymi:
C-3 p.502 tel. (617)3980
dr inŜ. Jerzy Kasperek [email protected]
dr inŜ. Paweł J.Rajda [email protected]
Archiwum wykładu http://fpga.elektro.agh.edu.pl/dydaktyka
Wstęp do syntezy
Literatura:
• „A VHDL Synthesis primer” J.Bhasker,
• „VHDL A Logic Synthesis Approach” D.Naylor, S.Jones,
•„Reuse Methodology Manual” M.Keating, P.Bricaud,
• Xilinx Foundation Express User Guide Synopsys, Inc.
Projekt oparty o VHDL w środowisku Aldec AHDL
Zewnętrzne
narzędzia do
przeprowadzenia
syntezy i
Implementacji
Graficzny
Shell po wybraniu
Opcji:
Prefereces/Flows/
Xilinx Flow (TCL based)
Sprzętowa reprezentacja obiektów w VHDL
Obiekt - sygnał lub zmienna moŜe być
reprezentowany jako:
• przewód
• przerzutnik (element pamięciowy wyzwalany
zboczem)
• przerzutnik latch (element pamięciowy
wyzwalany poziomem)
Sprzętowa reprezentacja obiektów w VHDL
signal A,B,C,D: bit
...
NO_MEMORY: process (A,B,C)
variable TMP: bit;
begin
TMP:= A and B;
D <= TMP or C;
end process;
A
B
TMP
D
C
Implementacja TMP : przewód
signal A,B,C: bit
...
IS_IT_LATCH: process (A,B,C)
variable TMP: bit;
begin
C <= TMP and B;
TMP := A or C;
Implementacja TMP : zatrzask ?!
end process;
Synteza typów numerycznych: Integer, real
• Typy i podtypy które zawierają wartości ujemne w swojej
definicji zakresu kodowane są w kodzie uzupełnień do 2
• Typy i podtypy które zawierają tylko wartości dodatnie
kodowane są binarnie
• Liczb uŜytych bitów zaleŜy od największej dopuszczalnej
wartości dla danego obiektu
-- a binary encoding having 7bits.
type int1 is range 10 to 100 -- a binary encoding having 7bits
type int2 is range -1 to 100 -- a 2's complement encoding having
-8 bits (including sign).
subtype int3 is int2 range 0 to 7 -- a binary encoding having 3bits.
type int0 is range 0 to 100
Synteza typów numerycznych: Integer, real
type short is integer 0 to 255;
subtype shorter is short range 0 to 31;
subtype shortest is short range 0 to 15;
signal op1,op2,res1 : shortest;
. signal res2 : shorter;
signal res3 : short
begin
res1 <= op1 + op2;-- truncate carry
res2 <= op1 + op2;-- use carry
res3 <= op1 + op2;-- use carry and zero extend
Synteza typów wyliczeniowych
• Typy wyliczeniowe syntezowane są przez binarne
kodowanie.
Poszczególnym elementów asygnowane są kolejne
wartości przy czym pierwszy od lewej otrzymuje
wartość zero.
• Liczba asygnowanych elementów (n) będzie
najmniejsza z moŜliwych liczba elementów <= 2**n
• Typ bit jest syntezowany jako „wire”
• Typ character jest syntezowany jako 8 x „wire”
Synteza typów wyliczeniowych
Deklaracja:
Jest syntezowana jako
type direction is (left, right, up, down); -- Two wires.
type cpu_op is (execute, load, store);
-- Two wires;
-- the encoding of
-- 11 is a "don't care."
subtype mem_op is cpu_op
range load to store;
Two wires;
the encodings of
00 and 11 are "don't cares.”
User Defined Encoding
attribute enum_encoding of enum_t : type is "001 010 100";
-- or ... : type is "one hot";
-- or ... : type is "1-hot";
Typ: std_logic_1164
type std_ulogic is
'X',
‘0',
'1',
'Z',
'W',
'L',
'H',
'-'
);
-- Uninitialized
Forcing Unknown
Forcing 0
Forcing 1
High Impedance
Weak
Unknown
Weak
0
Weak
1
Don't care
('U',
---------
attribute enum_encoding of std_ulogic : type is
"M M 0 1 Z M 0 1 -";
'0' 'L'
'1' 'H'
'Z'
'U' 'X' 'W'
'-'
------
Logic value 0
Logic value 1
Logic value tristate
Metalogic value
Don’t care value
Synteza instrukcji przypisań - operatory logiczne
entity logical_ops_1 is
port (a, b, c, d: in bit;
end logical_ops_1;
m: out bit);
architecture example of logical_ops_1 is
signal e: bit;
begin
m <= (a and b) or e; -- concurrent signal
e <= c xor d;
-- assignments
end example;
entity logical_ops_2 is
port (a, b: in bit_vector (0 to 3);
m: out bit_vector (0 to 3));
end logical_ops_2
architecture example of logical_ops_2 is
begin
m <= a and b;
end example;
Synteza instrukcji przypisań - operatory relacji
entity relational_ops_1 is
port (a, b: in bit_vector (0 to 3);
m: out boolean);
end relational_ops_1;
architecture example of relational_ops_1 is
begin
m <= a = b;
end example;
entity relational_ops_2 is
port (a, b: in integer range 0 to 15;
m: out boolean);
end relational_ops_2;
architecture example of relational_ops_2 is
begin
m <= a >= b;
end example;
Synteza operatorów arytmetycznych
package example_arithmetic is
type small_int is range 0 to 7;
end example_arithmetic;
use work.example_arithmetic.all;
entity arithmetic is
port (a, b: in small_int;
m: out small_int);
end arithmetic;
architecture example of arithmetic
is
begin
m <= a + b;
end example;
Synteza instrukcji wyboru
VHDL wyraŜenia współbieŜne (concurrent)
conditional signal assignment
selected signal assignment
( when.. )
(with.. )
VHDL wyraŜenia sekwencyjne (sequential)
(if.. )
(case..)
Synteza współbieŜnych instrukcji wyboru
entity control_stmts is
port (a, b, c:in boolean; m: out boolean);
end control_stmts;
architecture example of control_stmts is
begin
m <= b when a else c;
end example;
entity control_stmts is
port (sel: bit_vector (0 to 1); a,b,c,d : bit;
bit);
end control_stmts;
architecture example of control_stmts is
begin
with sel select
m <= c when b"00",
m <= d when b"01",
m <= a when b"10",
m <= b when others;
end example;
m: out
Synteza sekwencyjnych instrukcji wyboru
entity control_stmts is
port (a, b, c: in boolean;
end control_stmts;
m: out boolean);
architecture example of control_stmts is
begin
process (a, b, c)
variable n: boolean;
begin
if a then
n := b;
else
n := c;
end if;
m <= n;
end process;
end example;
Synteza sekwencyjnych instrukcji wyboru
Synteza sekwencyjnych instrukcji wyboru
entity control_stmts is
port (sel: bit_vector (0 to 1);
m: out bit);
end control_stmts;
a,b,c,d : bit;
architecture example of control_stmts is
begin
process (sel,a,b,c,d)
begin
case sel is
when b"00" =>
m <= c;
when b"01" =>
m <= d;
when b"10" =>
m <= a;
when others =>
m <= b;
end case;
end process;
end example;
Synteza instrukcji „powielających logikę”
entity loop_stmt is
port (a: bit_vector (0 to 3);
m: out bit_vector (0 to 3));
end loop_stmt;
architecture example of loop_stmt is
begin
process (a)
variable b:bit;
begin
b := '1';
for i in 0 to 3 loop --don't need to declare i
b := a(3-i) and b;
m(i) <= b;
end loop;
end process;
end example;
Synteza instrukcji „powielających logikę”
entity subprograms is
port (a: bit_vector (0 to 2);
m: out bit_vector (0 to 2));
end subprograms;
architecture example of subprograms is
function simple (w, x, y: bit) return bit is
begin
return (w and x) or y;
end;
begin
process (a)
begin
m(0) <= simple(a(0), a(1), a(2));
m(1) <= simple(a(2), a(0), a(1));
m(2) <= simple(a(1), a(2), a(0));
end process;
end example
Synteza instrukcji „powielających logikę”
Synteza instrukcji sekwencyjnych
Specyfikacja warunkowa
if clk then
y <= a;
else
-- do nothing
end if;
sygnał y latch
if clk then
y <= a;
else
y <= b;
end if;
sygnał y- mux
if clk
and
clk'event
then
y <= a;
end if;
sygnał yD Flip Flop
Instrukcje implikujące syntezę do FF typu latch
process (clk,a,b) -- a list of all signals used in the process
begin
if clk then
y <= a and b;
end if;
end process;
procedure my_latch (signal clk, a, b: in boolean;
signal y: out boolean)
begin
if clk then
y <= a and b;
end if;
end;
-- A concurrent conditional signal assignment,
y <= a and b when clk else y;
y <= a and b when clk;
Instrukcje implikujące syntezę do FF typu D
Proces zawierający listę aktywującą:
process (clk) --a list of all signals that result in
begin
--propagation delay
if clk and clk'event then --rising clock edge
y <= a and b; end if; end process;
Proces zawierający klauzulę wait:
process
begin
wait until not clk; --falling clock edge
y <= a and b; end process;
Procedura uŜyta jako wywołanie współbieŜne:
procedure my_ff (signal clk, a, b: boolean;
signal y: out boolean);
begin
if not clk and clk'event then --falling clock edge
y <= a and b; end if; end;
WspółbieŜne przypisania warunkowe:
y <= a and b when clk and clk'event else y; -- ERROR
y <= a and b when clk and clk'event;--FPGA Express SYNTAX-ERR
Instrukcje implikujące synchroniczny Set/Reset
process(clk)
begin
if clk and clk'event then -- clock rising
if set then
y <= true; -- y is type boolean
else
y <= a and b;
end if;
end if;
end process;
-- 29 bits reset , 3 bits set by init
process
begin
wait until clk
-- clock rising
if init then
y <= 7;
-- y is type integer
else
y <= a + b;
end if;
end process;
Instrukcje implikujące synchroniczny Set/Reset
y <= false when reset else a when clk and clk 'event else y;
process (clk, reset)
begin
if reset then
q <= false;
-- y is type boolean
else
if clk and clk'event then -- clock rising
q <= d;
end if;
end if;
end process;
procedure ff_async_set (signal clk, a, set: boolean; signal
q : out boolean)
begin
if set then
q <= true;
elsif clk and clk'event then
-- clock rising
q <= a;
end if;
end;
Styl kodowania
Struktura
• Jednolita struktura projektów
• UŜycie zmiennych systemowych w ścieŜkach do projektów
• UŜycie przyrostków w nazwach plików dla określenia ich
zawartości (np.: _tb, _beh, _struct, _rtl, _synt, _impl itp.)
Komentarze
•
•
•
Nagłówek kaŜdego pliku (skryptu teŜ) zawiera: nazwę pliku,
autora, opis funkcji, datę utworzenia, historię modyfikacji)
Komentarz opisuje intencje projektanta, a nie zachowanie się
kodu
Kasowanie złego kodu (zamiast zamiany na komentarz)
Układ
•
•
Wcięcia na min. 3 spacje
Jedna operacja na jedną linię kodu
Styl kodowania
Układ c.d.
• Limit długości linii (przeniesienie logiczne!)
• UŜycie tabulatorów np. w klauzuli port deklaracji entity
Składnia
•
•
•
Grupowanie często uŜywanych operacji w podprogramy
UŜywanie pętli i tablic
Minimalizowanie liczby poziomów zagnieŜdŜenia instrukcji
warunkowych
Kapitalizacja
•
•
•
•
Nie dodawać znaczenia przez uppercase w narzędziach
case-insensitive
Zamiast tego uŜywać przedrostków i przyrostków
UŜywać underscore zamiast uppercase dla oddzielania słów
UŜywać uppercase tylko dla stałych
Styl kodowania
Identyfikatory
• UŜywać znaczących nazw (min. 5 znaków)
• Nazywać obiekty stosownie do ich funkcji, a nie typu
• Nie wykorzystywać zakresu działania obiektów
• Wykorzystywać stałe symboliczne (nie „magiczne”)
Język VHDL
•
•
•
•
•
•
•
Parametryzacja kodu (szerokość magistral, atrybuty np.: ‘left)
W kaŜdym pliku źródłowym tylko jedna jednostka projektowa:
(entity, architecture, configuration, package)
Deklaracja portów w porządku interfejsów, a nie ich kierunku
Etykiety dla instrukcji współbieŜnych (process!) oraz end
Nie tworzyć zbyt wielu podtypów (range zamiast subtype)
Nie uŜywać trybu buffer (sprzęŜenia zwrotne lokalne)
Nie uŜywać przypisań guarded i sygnału guard
Styl kodowania
•
•
•
•
•
•
•
•
UŜywać nazwy clk dla sygnałów zegarowych i rst dla sygnałów
kasowania
Nie zmieniać nazwy tego samego sygnału w poszczególnych
blokach projektowanego systemu
Zaznaczać poziom aktywności sygnału, np. sygnały aktywne
stanem niskim kończyć: „_n”
UŜywać porządku „downto” w obiektach wektorowych
Standard VITAL IEEE1076.4: Nie uŜywać „underscore” w
nazwach entity. Po syntezie jest on uŜywany w pliku SDF.
Konwencje nazw deklaracji architecture:
ARCHITECTURE rtl OF my_syn_model IS
dla symulacji po syntezie lub:
ARCHITECTURE sim OF my_behave_model IS
dla symulacji behawioranej.
W deklaracjach portmap uŜywać notacji specyfikacyjnej
Stosować tylko typ std_logic
Styl projektowania
CLK
Modelowa struktura projektu:
• Jeden sygnał zegarowy
• Wszystkie przerzutniki wyzwalane tym samym zboczem
Problemy przy dwóch aktywnych zboczach:
• ZaleŜność od współczynnika wypełnienia (tolerancja na
zmiany duty cycle w dokumentacji projektu!)
• Problemy z metodą testowania typu ścieŜka brzegowa
(JTAG 1149)
Styl projektowania
CLK
Asynchroniczne kluczowanie zegara - same problemy!
(niewykorzystanie zasobów dystrybucji sygnałów zegarowych,
problemy z testowaniem, gorsze parametry czasowe itp.)
Rozwiązanie – stosowanie wejść CE – kodowanie przez warunek:
if ce=‘1’ po sekwencji if clk’event and clk=‘1’.
Styl projektowania
CLK
Nie naleŜy stosować wewnętrznie (asynchronicznie!) generowanych
sygnałów zegarowych.
CE
CLK
NaleŜy natomiast projektować układy synchroniczne lub uŜywać
kilku sygnałów zegarowych (patrz: DLL).
Styl projektowania
A
A
B
A+B+C
A+B+C
A+B+C
A+B+C
C
C
Kodowanie uwzględniające proces syntezy
1. Rejestry wyjściowe dla sygnałów
2. Jeden atrybut signal‘event na jeden proces
3. Sterowanie sygnału tylko z jednego procesu
(jeŜeli występuje potrzeba kontroli z 2 lub więcej procesów –
ok- ale wtedy potrzebny dodatkowa instrukcja arbitraŜu)
4. Odpowiedni podział modułów logiki kombinacyjnej
5. Podział na bloki z uwagi na wymaganą szybkość działania
(speed versus area optimisation)
6. Rozdzielenie bloków logiki asynchronicznej
i synchronicznej (instrukcja process a instrukcje współbieŜne)
7. Odpowiednie rozwiązania dla modułów realizujących funkcje
arytmetyczne
8. Grupowanie sygnałów pod kątem czasu syntezy
9. Unikanie „multicycle paths” – czyli ścieŜek sygnałów,
które odchodzą od reguły „jednego okresu”.
Weryfikacja projektów
• Weryfikacja zajmuje 70% czasu realizacji projektu („critical path”)
• Zagadnieniami weryfikacji zajmuje się dwa razy więcej
inŜynierów niŜ wprowadzaniem projektu (oddzielne ekipy !)
• Kod testbencha stanowi do 80% całego projektu
Weryfikacja
Specyfikacja
Interpretacja
Transformacja
Model źródłowy
Model docelowy
Weryfikacja
Transformacja to n.p.: kodowanie RTL, synteza, implementacja
Weryfikacja wymaga wspólnego początku z transformacją
Uwaga na „human factor” - jeŜeli ten sam projektant przeprowadza
interpretację, kodowanie i weryfikację.
Weryfikacja
• Automatyzacja (pomysł OK, ale jak go zrealizować ?)
• Strategia atomizacji problemu: sprowadzenie ludzkich
decyzji do elementarnych problemów
• Wprowadzenie redundacji: dwa konkurencyjne zespoły
Interpretacja A
Transformacja
Model źródłowy
Specyfikacja
Interpretacja B
Model docelowy
Model źródłowy
Weryfikacja
Weryfikacja
Functional verification answers
the question:
“did I build the right thing?” as
opposed to implementation
verification, which answers the
question
“did I build the thing right?”
1. Porównanie zgodności
• Porównanie dwóch list
połączeń (netlist)
• Wykrycie ew. błędów
narzędzia
syntezy
Model RTL
Synteza
Weryfikacja
Model po syntezie
2. Sprawdzanie modelu
• Sprawdzenie zachowania się
modelu w sytuacjach błędnych
• Problem: jak te
sytuacje znaleźć? Specyfikacja
(automaty stanu,
inne zachowanie
się magistral itp.)
Kodowanie RTL
Model RTL
„Problemy”
Interpretacja
Sprawdzanie
modelu
Weryfikacja formalna Linting
ALINT is a highly optimized HDL design rule checker. ALINT includes a
clear and informative set of violation messages, generated during linting
with a direct cross-link to source code, for early bug detection, ensuring
correct RTL code early in the design cycle.
Key Features
•Supports 200 VHDL and Verilog Design Rules.
•Clock Domain Crossing (CDC) support.
•Source code checks, design elaboration and synthesis
emulation.
•User Modified Design Rules.
•Cross-Probing of error messages, Violation Viewer.
•Configuration Management
Przykłady reguł ALINT
LINT_3003: Memory '%s' is read and written at the same time
Sample Code:
process (clk, address, data, rw)
type ramtype is array(natural range <>) of std_logic_vector(7 downto 0);
variable ram : ramtype(15 downto 0);
begin
LINT_5009 Reset signal '%s' is active
if (rising_edge(clk)) then
high and low
if (rw = '1') then
Sample Code:
ram(address) := data;
architecture tb of tb is
end if;
signal a, b : std_logic;
data <= ram(address);
begin
end if;
process (reset)
end process;
begin
LINT_3001
if (reset = '1') then
Incomplete sensitivity list
Sample Code:
a <= '0';
process (clk)
end if;
begin
end process;
if (reset = '1') then
process (reset)
sig <= '0';
begin
elsif (rising_edge(clk)) then
if (reset = '0') then
sig <= not clk;
b <= '0';
end if;
end if;
end process;
end process;
end architecture tb;
Weryfikacja a testowanie
Kodowanie
Wytwarzanie
Model
Specyfikacja
Weryfikacja
Pomyłki
Błędy
Zły Projekt
Dobry Projekt
Krzem
Testowanie
Brak
błędów
Typ II
Typ I
Basic goals of any comprehensive verification process:
1. It must verify that the design does everything it is supposed to do.
2. It must verify that the design does not do anything it is not supposed to do.
3. It must show when the first two goals have been met.
Plan weryfikacji
Współczesne realia wymagają definiowania czasu realizacji
poszczególnych etapów projektu (w tym czasu weryfikacji).
1. Odpowiednia i dokładna specyfikacja (kiedy koniec?)
2. Plan pierwszego sukcesu (tylko najwaŜniejsze funkcje)
3. Definicja poziomu weryfikacji:
• unit-level, system-level, board-level
4. Strategie weryfikacji (black-box, white-box, grey-box, losowa)
5. Identyfikacja weryfikowanych funkcji
6. Priorytety (must-have, should-have, nice-to-have)
7. Projektowanie „łatwo weryfikowalne” (design for verification)
(np.: elementy ładowalne, wprowadzanie modułów w tryb
przeźroczysty (unit bypass), punkty weryfikacji (sample
points), error injection mechanism itp.)
Weryfikacja funkcjonalna - pytania
What Documents?
Hardware Requirements Specification
Commerical Bus/Component Specifications
Hardware Design Specification
Verification Environment Specification
Test Plan
ISO 9000 Process Flow
Error Logs
Status Reports
What Lanaguage for Verification?
Specman (HVL)
Vera (HVL)
System Verilog
SystemC with SCV (SystemC Verification Library)
TestBuilder (C++)
Custom C++
Za:
Verilog
VHDL
http://home.comcast.net/~cnibb/
Chet Nibby's
Functional Verification Page
Weryfikacja funkcjonalna - pytania
What HDL design Language?
Verilog
VHDL
Mixed Verilog/VHDL
What HDL level?
Block (unit)
Device
System
What test visibility?
Black box
White box
Gray box
Type of test?
Directed
Random
Directed Random
What data level?
Vector or bit
Transaction
Data creation?
Manual
Random Generation (Pre-run)
Random Generation (On-the-fly)
Testbench checking?
Manual
Golden model
Self-checking (Post-run)
Self-checking (On-the-fly)
Assertion Checking
Are we done?
Code coverage
Functional coverage
Other Considerations?
Source Control
DUT Performance
Code Reuse
Regression Testing
Load Sharing
Simulation performance
Acceleration
Gate Level
Weryfikacja funkcjonalna - pytania
Zarządzanie procesem weryfikacji
Kontrola kolejnych wersji/rewizji
Obsługa zdarzeń weryfikacji:
- wykryte błędy,
- wykryte błędy lub niespójności w specyfikacji,
- zagadnienia optymalizacji area/speed,
- nowe pomysły na kolejne warianty weryfikacji,
Obsługa:
- rozmowa z inŜynierem/-ami (w wielu małych firmach działa☺
☺)
wady – brak jasnej odpowiedzialności, brak historii,
- karteczka na biurko inŜyniera
wady – czasami się odkleja... i spada na podłogę
+ brak priorytetyzacji zadań, brak historii..
- procedury,
- bazy danych.
W kaŜdej z metod czas przeznaczony na zgłoszenie błędu
nie powinien być dłuŜszy niŜ korekta błędu!
TESTBENCH – połączenie Process/Component
Process
TestBench
Component
Signals
UUT
Rodzaje procesów testujących
•
•
•
Ad Hoc
Zbiór wektorów testowych do podstawowych testów funkcjonalnych.
Algorytmiczny
Prosty algorytm generujący wymuszenia, np. pętla zwiększająca
zmienną przez cały jej zakres do testowania dekodera lub ALU.
Plik wektorów
Rozwiązanie strukturalne: proces czytający plik z wektorami do
testowania.
NAJLEPIEJ: Testbench automatycznie sprawdzający działanie i
generujacy wynik: Error lub OK !!!
TESTBENCH – przykład
General Testbench Guidelines:
-osobne procesy :
-obsługa danych,
-zegar systemowy,
-asynchroniczne sterowanie (reset)
TESTBENCH – przykład
library IEEE;
use IEEE.STD_LOGIC_1164.all;
entity counter_tb is
end counter_tb;
architecture TB_ARCHITECTURE of counter_tb is
-- Component declaration of the tested unit
component counter
port(
CLK : in STD_LOGIC;
DATA : in STD_LOGIC_VECTOR(3 DOWNTO 0);
RESET : in STD_LOGIC;
LOAD : in STD_LOGIC;
Q : out STD_LOGIC_VECTOR(3 DOWNTO 0) );
end component;
-- Stimulus signals - signals mapped to the input and inout ports of tested entity
signal CLK : STD_LOGIC;
signal DATA : STD_LOGIC_VECTOR(3 DOWNTO 0);
signal RESET : STD_LOGIC;
signal LOAD : STD_LOGIC;
-- Observed signals - signals mapped to the output ports of tested entity
signal Q : STD_LOGIC_VECTOR(3 DOWNTO 0);
-- User can put declaration here
shared variable ENDSIM: boolean:=false;
constant CLK_PERIOD:time:= 30 ns;
constant RESET_LENGTH:time:= 50 ns;
TB część 1
TESTBENCH – przykład
begin
-- Unit Under Test port map
UUT : counter
port map
(CLK => CLK,
DATA => DATA,
RESET => RESET,
LOAD => LOAD,
Q => Q );
-- User can put stimulus here
CLK_GEN: process
begin
if ENDSIM=false then
CLK <= '0';
wait for CLK_PERIOD/2;
CLK <= '1';
wait for CLK_PERIOD/2;
else
wait;
end if;
end process;
TB część 2
-- reset process
RES: process
begin RESET<='0';
wait for RESET_LENGTH;
RESET<='1';
wait;
end process;
-- stimulus process
STIM: process
begin
DATA<="0110";
LOAD<='0';
wait for 350 ns;
LOAD<='1';
wait for 50 ns;
LOAD<='0';
wait for 100 ns;
ENDSIM:=true;
wait;
end process;
end TB_ARCHITECTURE;
TB część 3
TESTBENCH – warianty WAIT
junk : process
begin
CLK <= ’0’, ’1’ after 25 ns; -- not recomended
wait for 50 ns;
end process;
Szybciej symulowane są
TB oparte jedynie o
behawioralne instrukcje
wait for
--Process with explicit “wait for time” statement
--This is a testbench process
process
--Process with explicit “wait on or sensitivity list”
begin
--statement process
RESET <= '0';
--Synthesizable (non-testbench) process style
wait for 50 ns;
begin
RESET <= '1';
wait on WR;
wait for 50 ns;
DATA <= BUS_DATA;
RESET <= '0';
end process;
wait;
end process;
--Process with explicit “wait until edge” statement
--This is a synthesizable (non-testbench) sequential
process
--Combination of “wait on, until, and or” statement
begin
--Synthesizable (non-testbench) process style
wait until CLK = 1;
wait on IN1 until CLK = ’0’;
B <= A;
end process;
TESTBENCH – pole dla instrukcji behavioralnych
Kod TB jest bardzo wdzięcznym miejscem na
modelowanie systemu instrukcjami
behawioralnymi
Przykład – „akcja potwierdzenia”
–When d_valid = 1 & ACK = 0
–When d_valid = 1 & ACK = 1
–When d_valid = 0 & ACK = 1
–When d_valid = 0 & ACK = 0
Zalety podejścia behawioralnego:
• moŜliwość wykorzystania bogatego zbioru instrukcji HDL,
(brak ograniczeń kodowania zgodnego z RTL – jak np. uŜywamy
artybutu sygnału ‘event tyle razy ile chcemy, instrukcje wait for itp.)
• szybkość pisania kodu,
• krótszy czas symulacji.
TESTBENCH – pole dla instrukcji behavioralnych
comb: process (state, ACK)
begin
next_state <= state;
case state is
...
when MAKE_REQ=>
d_valid <= ‘1’;
if ACK = ‘1’ then
next_state <= RELEASE;
end if;
when RELEASE=>
d_valid <= ‘0’;
if ACK = ‘0’ then
next_state <= ...;
end if;
...
endcase;
end;
SEQ: process (CLK)
begin
if CLK’event and CLK = ‘1’ then
if RESET = ‘1’ then
state <= ….;
else
state <=next_state;
……
end process SEQ;
process
begin
...
d_valid <= ‘1’;
wait until ACK = ‘1’;
d_valid <= ‘0’;
wait until ACK = ‘0’;
...
end process
Łatwo, szybko i przyjemnie...
TESTBENCH – zalecenia
--Generacja podzielonego zegara
--głównego
divider: process
Begin
clk50 <= ’0’;
clk100 <= ’0’;
clk200 <= ’0’;
loop -- forever
for j in 1 to 2 loop
for k in 1 to 2 loop
wait on clk;
clk200 <= not clk200;
end loop;
clk100 <= not clk100;
end loop;
clk50 <= not clk50;
end loop;
end process divider;
W przypadku stosowania osobnych
domen czasowych +> osobne
procesy generujące CLK
Clock_A : process
begin
CLK_A <= ’0’;
wait for 200 ns;
CLK <= ’1’;
wait for 200 ns;
end process;
Clock_B : process
begin
CLK_B <= ’0’;
wait for 33 ns;
CLK_B <= ’1’;
wait for 33 ns;
end process;
TESTBENCH – zalecenia
decode: process
procedure do_instr(instr:t, data:d) is
begin
....
end do_instr;
begin
case I1 is
when "0000" => do_instr(STOP, data);
when "0001" => do_instr(JMP, data);
when "0010" => do_instr(CALL, data);
...
end case;
Redukcja wielokrotnych
wywołań
decode: process
procedure do_instr(instr:t, data:d) is
begin
....
end do_instr;
begin
case I1 is
when "0000" => instr := STOP;
when "0001" => instr := JMP;
when "0010" => instr := CALL;
...
end case;
do_instr(instr, data);
...
TESTBENCH – sterowanie sygnałów R/W
Library IEEE;
use IEEE.STD_LOGIC_1164.all;
use IEEE.STD_LOGIC_UNSIGNED.all;
entity bidir_infer is
port (
DATA : inout STD_LOGIC_VECTOR(1 downto 0);
READ_WRITE : in STD_LOGIC);
end bidir_infer ;
architecture XILINX of bidir_infer is
signal LATCH_OUT : STD_LOGIC_VECTOR(1 downto 0);
begin
process(READ_WRITE, DATA)
begin
if (READ_WRITE = ’1’) then
LATCH_OUT <= DATA;
end if;
end process;
process(READ_WRITE, LATCH_OUT)
begin
if (READ_WRITE = ’0’) then
DATA(0) <= LATCH_OUT(0) and LATCH_OUT(1);
DATA(1) <= LATCH_OUT(0) or LATCH_OUT(1);
else
DATA(0) <= ’Z’;
DATA(1) <= ’Z’;
end if;
end process;
end XILINX;
Sygnały dwukierunkowe
MUSZĄ być wysterowane
w stan ‘Z’ w stanie odczytu
od „strony” TB
TESTBENCH – podejście strukturalne
•
•
•
•
BFMs to control & monitor I/O transactions
Externally generated data and expected results
Concurrent, coordinated system process modeling
Internal transaction and bus monitors
AHDL – wsparcie dla TB
• Szablony TB
- generacja zegara,
- wymuszenia wartości sygnałów:
- Concurrent mode,
- Sequenced mode,
- porównanie wyników,
- zapisywanie wyników,
- funkcje randomizacji,
• Standard Waveform and Vector Exchang
WAVES (IEEE-STD-1029.1)
• Code Coverage
• Linting
AHDL – Code Coverage
Code Coverage provides the
following benefits to the designer:
•The users can easily find sections
of a model that have not been
exercised by a testbench. It allows
a modification of the testbench to
cover all untested parts of the
design.
•Code Coverage helps to identify
sections of the model executed
very frequently. This allows the
user to optimize the execution of
the model during the simulation.
•Code Coverage is integrated
into the Active-HDL simulation
kernel.
•Code Coverage can measure
the effectiveness of testbenches
so the most effective test can be
run first. This helps to uncover
bugs in the design verification
process immediately during
long regression tests.
Standard Waveform & Vector Exchange WAVES
Methodology
RASSP
Reinventing
Testbench
Development (cont.)
Electronic
Design
Architecture
DARPA
Infrastructure
Tri-Service
WAVES Testbench Diagram
Testbench
Input Stimulus
WAVES
Waveform
Generator
VHDL
Model
Instantiation
Expected
Response
Monitor
Processes
Actual Response
Copyright  1995-1999 SCRA
WAVES
Test Vector Set
Error
Messages
12
http://www.eda.org/rassp/modules/m61/m61_03_00.ppt
Aplikacje HDL <=> FPGA – „glue logic”
Chyba najbardziej popularne zastosowanie układów
programowalnych projektowanych przy wsparciu HDL
– inteligentne wsparcie dla uP
Aplikacje HDL <=> FPGA DSP
Aplikacje HDL <=> FPGA DSP
Koniec wykładu wpis zaliczeń
Ciąg dalszy
nastąpi...

Podobne dokumenty