Vai al contenuto

Primario: Sky Slate Blackcurrant Watermelon Strawberry Orange Banana Apple Emerald Chocolate Marble
Secondario: Sky Slate Blackcurrant Watermelon Strawberry Orange Banana Apple Emerald Chocolate Marble
Sfondo: Blank Waves Squares Notes Sharp Wood Rockface Leather Honey Vertical Triangles
Corsi di Laurea










ROX @ Unisa - Forum degli studenti di Ingegneria utilizza i cookie. Se prosegui la navigazione accetti il loro uso.    Accetto l'uso dei cookie
-->
Foto

VHDL testbench


  • Effettua l'accesso per rispondere
Questa discussione ha avuto 10 risposta/e

#1
ritac

ritac

    Advanced Member

  • Utente
  • StellaStellaStella
  • 87 Messaggi:
Salve a tutti, volevo chiedere se qualcuno potrebbe spiegarmi il procedimento per effettuare il testbench, dato che durante il corso mi sono persa alcune lezioni e dalle slide non riesco a capire bene da dove partire...

Grazie!!!!



#2
superdory

superdory

    Advanced Member

  • Utente
  • StellaStellaStella
  • 469 Messaggi:
in pratica con il testbench tu 'manualmente' assegni dei valori agli ingressi in modo da verificare che i risultati siano quelli attesi.
Dal punto di vista del codice, provo a farti 1 esempio:
se precedentemente avevi scritto

entity example is
port(a, b: in bit;
c: out bit
);
end example;

per il testbench devi assegnare tutti i possibili valori ad a e b (se fossero tanti basta un sottoinsieme dei + significativi), così che simulando puoi fare un'analisi dell'uscita. Un file testbench non è altro che un altro file vhdl che nella sua dichiarazione non ha bisogno di porte perchè non necessita di comunicare con l'esterni. Quindi avrai:

entity example_tb is
end example_tb;

dopodichè nell'architettura inizi richiamando il componente di cui vuoi fare la simulazione con le relative porte:

architecture test of example_tb is
component example
port(a, b: in bit:
c: out bit
);
end component;

dopodichè dichiari i segnali per fare la simulazione:

signal a_s, b_s, c_s: bit;

finite le dichiarazioni, passi all'architettura vera e propria, iniziando con la port map con cui associ i segnali che hai dichiarato a componente:

begin
uut: example port map(a, b, c);

si continua associando ad ogni segnale di input un processo in cui appunto assegni tutti i valori possibili per la simulazione


a_p: process
begin
a_s <= '0';
wait for 15 ns;
a_s <= '1';
wait for 20 ns;
end process;

b_p: process
begin
b_s <= '0';
wait for 5 ns;
b_s <= '1';
wait for 10 ns;
end process;
end test;

i ns dei wait for li devi scegliere sempre in modo tale che tu dalla simulazione possa ottenere più combinazioni possibili, per esempio in questo caso se c fosse un and di a e b, associando gli stessi ns, simulando anche per 500 ns avrei sempre 2 combinazione: a = 0 e b = 0 (c = 0) e a = 1 e b = 1 (c = 1).

Oddio spero di essere stata chiara, se hai qualche dubbio più specifico ... io ho cercato di inquadrare in generale l'argomento testbench, ho approfittato per ripetere ^^

#3
ritac

ritac

    Advanced Member

  • Utente
  • StellaStellaStella
  • 87 Messaggi:
Allora, il mio dubbio principale è proprio sugli ns dei wait for...nel senso, devo sceglierli io arbitrariamente in modo da poter ottenere il numero maggiore di possibili combinazioni, oppure c'è un criterio da seguire???

#4
eferre

eferre

    Advanced Member

  • Utente
  • StellaStellaStella
  • 1502 Messaggi:

Allora, il mio dubbio principale è proprio sugli ns dei wait for...nel senso, devo sceglierli io arbitrariamente in modo da poter ottenere il numero maggiore di possibili combinazioni, oppure c'è un criterio da seguire???


Devi sceglierli in modo da poter avere tutte le possibili configurazioni dell'ingresso... se questo non è possibile perché sono troppe, devi sceglierli in modo tale da avere le combinazioni più significative, quelle cioè che ti consentono di analizzare alcuni "casi limite" o "casi particolari"

#5
ritac

ritac

    Advanced Member

  • Utente
  • StellaStellaStella
  • 87 Messaggi:
quindi, se ho capito bene, ogni TB può essere diverso da un altro anche se si sta simulando lo stesso componente???

#6
superdory

superdory

    Advanced Member

  • Utente
  • StellaStellaStella
  • 469 Messaggi:
certo ognuno può testare tempi diversi ... hai presente quando lanci un programma e fai delle prove? per esempio hai il programma 'somma tra due numeri' ... si apre il prompt ... inserisci x, inserisci y, e ti esce il risultato ... magari provi più volte per vedere che effettivamente il risultato sia corretto e il programma funge e ognuno prova numeri diversi ... esattamente la stessa cosa ... la differenza è che avendo a che fare con tempi, con segnali, se progetti bene i tempi, a tempo di simulazione, hai già tutte le combinazioni, senza dover tornare al codice e cambiare valori ...

#7
Luigo

Luigo

    Admin

  • Utente
  • StellaStellaStella
  • 1149 Messaggi:

quindi, se ho capito bene, ogni TB può essere diverso da un altro anche se si sta simulando lo stesso componente???


si,il "codice" vero e proprio, può cambiare, per il semplice motivo che i ns sono abbastanza arbitrari...ma concettualmente resta lo stesso.....

Luigi_Banner_sig_by_Chivi_chivik.png


#8
ritac

ritac

    Advanced Member

  • Utente
  • StellaStellaStella
  • 87 Messaggi:
ok, Grazie a tutti per le risposte!

#9
dipoppaww

dipoppaww

    Newbie

  • Utente
  • Stella
  • 2 Messaggi:
ciao a tutti, mi sto avvicinando proprio ora al vhdl ed ho iniziato a fare le prime prove. Come prima esempio ho fatto una porta AND, con relativo testbench.
il test funziona se da riga di comando uso il comando force x 0 0 ns, 1 10 ns -repeat 20ns ; force y 0 0 ns, 1 10 ns -repeat 40 ns; run 80 ns; mentre utilizzando il testbench l'uscita z resta sempre a zero. dove che sbaglio?
eccovi il codice:

entity AND_ent is
port (x,y:in bit;
z:out bit);
end AND_ent;

architecture AR of AND_ent is
begin
z <= x and y;
end AR;

metre come testbench:

entity tb_AND is
end tb_AND;

architecture tb_bevh of tb_AND is
component TBAND
port (x: in bit;
y:in bit;
z:out bit);
end component;
signal x:bit;
signal y:bit;
signal z:bit;
begin
DUT: TBAND port map (x,y,z);
stimoloA: process
begin
x<='0';
wait for 20 ns;
x<='1';
wait for 20 ns;
end process;

stimoloB: process
begin
y<='1';
wait for 10 ns;
y<='0';
wait for 10 ns;
end process;
end tb_bevh;

Grazie in anticipo, scusate la niubbezza XD

#10
dipoppaww

dipoppaww

    Newbie

  • Utente
  • Stella
  • 2 Messaggi:
niente?? :help:

#11
eferre

eferre

    Advanced Member

  • Utente
  • StellaStellaStella
  • 1502 Messaggi:
Il codice va inserito nei tag "code" per regolamento!




Leggono questa discussione 0 utenti

0 utenti, 0 ospiti, 0 utenti anonimi