Simulazione. Simulazione verilog. Testbench. Testbench

Documenti analoghi
Logica sequenziale: implementazione verilog

Logica sequenziale: implementazione verilog

Fondamenti di Informatica

3. Indicare cosa sta a significare la figura geometrica del rombo in un diagramma a blocchi

Addizionatori: metodo Carry-Lookahead. Costruzione di circuiti combinatori. Standard IEEE754

Simulazione Spice. Simulazione Circuitale Spice. Netlist. Netlist

Linguaggi di Descrizione del Hardware: VERILOG. Livelli di astrazione. Livelli di astrazione. Livelli di astrazione. Introduzione

Variabili e Istruzioni

Algebra di Boole. Modulo 2. Università di Cagliari Dipartimento di Ingegneria Elettrica ed Elettronica Laboratorio di Elettronica (EOLAB)

Richiami di Algebra di Commutazione

Elementi di Base. Introduzione a Python.

Introduzione alla programmazione. Alice Pavarani

Esercitazioni di Reti Logiche

Prof. Pagani Corrado INTRODUZIONE AL LINGUAGGIO C

I circuiti digitali: dalle funzioni logiche ai circuiti

Espressione di chiamata di funzione

Per gli esercizi sulla algebra booleana, si consiglia di verificare tramite tabelle di verità le equivalenze logiche proposte sulle dispense.

Esercitazione 2 Introduzione a GATESIM

ERRATA CORRIGE. void SvuotaBuffer(void); void SvuotaBuffer(void) { if(getchar()!=10) {svuotabuffer();} }

senza stato una ed una sola

L AMBIENTE CODE BLOCKS E L IO

Introduzione a Matlab

Unità Didattica 1 Linguaggio C. Fondamenti. Struttura di un programma.

APPUNTI DI ELETTRONICA DIGITALE

I CARATTERI E LE STRINGHE

Descrizione delle operazioni di calcolo. Espressioni costanti semplici

Algebra di Boole X Y Z V. Algebra di Boole

C array. Problema: scrivere un programma che, ricevuto in input un intero n ed n interi positivi, li stampi in ordine inverso.

Introduzione alla programmazione in linguaggio C

ESECUZIONE DI PROGRAMMI C SU MACCHINE REALI. Docente: Giorgio Giacinto AA 2008/2009. formalizzazione degli algoritmi in linguaggio C

Fortran in pillole : prima parte

INTRODUZIONE AL LINGUAGGIO DI PROGRAMMAZIONE PASCAL. Per iniziare lo studio del linguaggio di programmazione pascal, consideriamo il seguente esempio.

Reti Logiche Combinatorie

Qualsiasi programma in C++ segue lo schema:

Variabili. Unità 2. Domenico Daniele Bloisi. Corso di Programmazione e Metodi Numerici Ingegneria Aerospaziale BAER

Architettura degli elaboratori Tema d esame del 20/01/2016

Lezione 6 Introduzione al C++ Mauro Piccolo

I.3 Porte Logiche. Elisabetta Ronchieri. Ottobre 13, Università di Ferrara Dipartimento di Economia e Management. Insegnamento di Informatica

Algebra di Boole Algebra di Boole

Moduli combinatori Barbara Masucci

Transcript:

Simulazione Simulazione verilog Lucidi del Corso di Elettronica Digitale Modulo 8 Università di Cagliari Dipartimento di Ingegneria Elettrica ed Elettronica Laboratorio di Elettronica (EOLAB) Il verilog come prima cosa è un linguaggio per la simulazione dei sistemi digitali: viene usato come design entry per software di simulazione (noi useremo ModelSim) che simulano, appunto, il comportamento del sistema nel tempo Per simulare un sistema è necessario per prima cosa descriverlo (descrivere il modulo che lo implementa) e poi definire un insieme di stimoli esterni opportuni per validarne il funzionamento Testbench Testbench Concetto base per la simulazione è il testbench (letteralmente banco di prova) Il testbench non è altro che un modulo ad alto livello che contiene al suo interno: L istanziazione del modulo da testare La generazione degli stimoli Eventuali strumenti di visualizzazione dei risultati Gli stimoli possono essere generati dal testbench stesso (con blocchi initial ed always) oppure da sottomoduli istanziati nel testbench Generazione degli stimoli UUT (Unit Under Test) TESTBENCH Visualizzazione o verifica dei risultati

Testbench Esempio Il testbench non ha né ingressi né uscite Contiene sempre al suo interno il modulo da testare (UUT) Gli ingressi del UUT, all interno del modulo testbech sono definiti come reg perché devono essere imposti dal testbench stesso (a meno che non vengano generati da moduli istanziati nel testbench, nel qual caso sono wire) Le uscite del UUT, dentro il testbench sono sicuramente wire perché devono essere imposte dal UUT e NON dal testbench module tb_and; reg A,B; wire Z; my_and UUT(A,B,Z); initial begin A=0; B=0; #5 A=1; #5 A=0; B=1; #5 A=1; #5 $stop; end initial $monitor($time,, A,B,,Z); Ovviamente my_and è un modulo che va definito a parte Istanziazione del modulo da testare Generazione degli stimoli Visualizzazione delle uscite Funzioni di visualizzazione e controllo In verilog le espressioni che iniziano con $ sono funzioni di sistema (che vengono usate SOLO nei testbench per opportune verifiche e visualizzazioni). Fra queste: $monitor( Qualsiasi stringa,,var1, str2,var2) Serve per visualizzare i risultati, viene stampato ciò che compare fra parentesi ogni volta che i segnali del sistema cambiano. Si può usare la stessa formattazione del C $stop Serve per interrompere la simulazione dopo un certo tempo (altrimenti continuerebbe all infinito soprattutto se ci fossero dei blocchi always) Accesso ai file Il verilog mette a disposizione due costrutti (fra gli altri) per leggere dati da un file $readmemb (per leggere dati in forma binaria) $readmemh (per leggere dati esadecimali) L uso di dati da file può essere utile in un testbench per prelevare gli stimoli da un file precedentemente preparato, oppure per inizializzare il contenuto di una memoria (per esempio con un programma)

Accesso ai file $readmemb( nomefile,memory_name [,indirizzo_iniziale [,indirizzo_finale]]) nomefile è evidentemente il nome del file da cui leggere i dati memory_name è il nome del array dove inserire i dati letti dal file indirizzo_iniziale (opzionale) è l indirizzo da cui iniziare a scrivere (l elemento dell array da cui si inizia a riempire l array stesso con il contenuto del fie) indirizzo_finale (opzionale) è l ultimo elemento dell array che viene riempito La sintassi di $readmemh è uguale, ma i dati sono esadecimali e non binari module testbench; reg [7:0] mem [0:9]; reg [7:0] outbus; integer kk; Accesso ai file: esempio initial $readmemb("prova.txt",mem); prova.txt 00000000 00000001 00000010 00000011 00000100 00000101 00000110 00000111 00001000 00001001 Nel testbench mem è un array di 10 posizioni, ciascuna di 8 bit. I valori da assegnare a ciascun bit vengono presi dal file prova.txt che è un semplice file di testo Accesso ai file: esempio prova.txt 00000000 00000001 00000010 // Il file può contenere commenti che verranno // ignorati 00000011 // Si può esplicitare la posizione in cui inserire // il dato utilizzando la sintassi // @posizione dato // come qui sotto @4 00000100 00000101 00000110 00000111 00001000 00001001 VERILOG Modello fisico Università di Cagliari Dipartimento di Ingegneria Elettrica ed Elettronica Laboratorio di Elettronica (EOLAB)

Verso un modello fisico Le rappresentazioni verilog viste finora sono tutte equivalenti fra loro perché danno solo una rappresentazione funzionale del blocco logico Simulare una rappresentazione strutturale, dataflow od algoritmica di uno stesso blocco quindi fornisce gli stessi risultati Per potere realizzare fisicamente un sistema è però necessario arrivare fino ad una descrizione circuitale dello stesso: la descrizione circuitale aggiunge informazioni (le prestazioni fisiche del circuito) Verilog: simulazione fisica Il verilog può essere utilizzato anche per una simulazione del comportamento reale dei circuiti, in sostituzione di spice Le simulazioni spice infatti richiedono molto tempo e sono ragionevoli solo per singole porte logiche (di cui bisogna determinare i parametri) Le simulazioni di sistemi costituiti da molte porte logiche, invece, vengono fatte a livello di descrizione verilog, pur tenendo conto delle informazioni fisiche (tempi di propagazione) sulle singole porte ricavate con spice Verilog: ritardi In verilog è possibile rappresentare in tempo di propagazione di una primitiva logica (porta logica) per mezzo dell operatore # and #2 g1(z,a,b); Tempo di propagazione di 2nsec Ha senso definire un tempo di propagazione per le singole porte logiche (che saranno implementate circuitalmente in CMOS) Timescale La direttiva timescale viene usata per determinare l unità di tempo usata nelle simulazioni. Viene inserita all inizio di un file verilog (al di fuori della definizione dei moduli) `timescale <unità di tempo>/<precisione> L unità in cui sono espressi i tempi La precisione con cui vengono approssimati i tempi inseriti Es. `timescale 1ns/1ns

`timescale 1ns/1ns module my_and(a,b,z); input A,B; output Z; wire A,B,Z; Esempio: porta AND and #2 a1(z,a,b); Rappresentazione di una porta AND con un tempo di propagazione di 2ns Timescale (fuori dal modulo) L apice (`) si scrive con ALT+96, NON è l apostrofo ( ) che c è nella tastiera Primitiva con ritardo Definizione dei ritardi Ogni ritardo inserito può essere costituito da una tripletta (minimo, tipico, massimo) i cui elementi sono separati dal simbolo : (due punti) and #(1:2:3) g1(z,a,b); Si possono inserire separatamente i tempi di propagazione LH e HL separandoli con virgole and #(2,3) g1(z,a,b); (tplh=2ns, tphl=3ns) Si possono mettere le due cose insieme (min:typ:max per tplh e tphl) and #(1:2:3, 2:3:4) g1(z,a,b); Esempio Ritardo inerziale A and #2 g1(z,a,b); Una combinazione che dà luogo ad una commutazione dell uscita viene rigettata (inerzia) se dura per un tempo più breve del ritardo della porta B Z tplh tphl Rigettato Nell esempio precedente la seconda combinazione A=1, B=1 dura solo 1ns contro un ritardo complessivo della porta di 2ns, quindi l uno logico che dovrebbe risultare da tale combinazione non riesce mai ad arrivare in uscita (ritardo inerziale) t

Circuiti reali Esempio Se le primitive logiche contengono un ritardo due diverse implementazioni di una stessa funzione non sono più equivalenti ma avranno tempi di risposta complessivi differenti a seconda di come sono state implementate. `timescale 1ns/1ns module my_and(a,b,z); input A,B; output Z; wire A,B,Z; `timescale 1ns/1ns module my_and2(a,b,z); input A,B; output Z; wire A,B,C,Z; and #3 a1(z,a,b); Ritardo complessivo 3ns nand #1 a1(c,a,b); not #1 b1(z,c); Ritardo complessivo 2ns