Simulering av VHDL: Difference between revisions

From ift
mNo edit summary
(16 intermediate revisions by 2 users not shown)
Line 1: Line 1:
===Konstruksjon og simulering av VHDL-kode med ModelSim===
===Konstruksjon og simulering av VHDL-kode med Modelsim/Questa===


==Innledning==
==Innledning==
Line 5: Line 5:
Hensikten med denne oppgaven er å få et lite innblikk i bruk av høynivåspråk for simulering og uttesting av kretsløsninger. I denne oppgaven skal vi bruker VHDL (Very high speed integrated circuit Hardware Description Language), som er spesielt utviklet for elektronikk. VHDL er definert slik at det passer i en mengde sammenhenger, og er det vil derfor være uoverkommelig å gå inn på detaljer i denne oppgaven. Vi skal ta for oss noen eksempler:
Hensikten med denne oppgaven er å få et lite innblikk i bruk av høynivåspråk for simulering og uttesting av kretsløsninger. I denne oppgaven skal vi bruker VHDL (Very high speed integrated circuit Hardware Description Language), som er spesielt utviklet for elektronikk. VHDL er definert slik at det passer i en mengde sammenhenger, og er det vil derfor være uoverkommelig å gå inn på detaljer i denne oppgaven. Vi skal ta for oss noen eksempler:


* Eksempel 1: Signalflyt i en SR-lås.
* Eksempel 1: Signalflyt i en SR-lås


* Eksempel 2: Signaler og variable.
* Eksempel 2: Signaler og variable


Hvert eksempel beskrives med VHDL som vist i kurskompendiet. I tillegg til VHDL-koden i eksempel 1 trengs en ENTITY-del og en ARCHITECTURE-konstruksjon som omslutter selve programlinjene. Et VHDL program består i hovedsak av ENTITY, som definerer tilkobling mellom programmet og omverden, og ARCHITECTURE, som definerer programmets funksjon. Den komplette VHDL-koden for eksempel 6.1 i kurskompendiet er vist nederst i dette dokumentet.
Et VHDL program består i hovedsak av ENTITY, som definerer tilkobling mellom programmet og omverden, og ARCHITECTURE, som definerer programmets funksjon. Den komplette VHDL-koden for eksempel 1 vist nederst på denne siden.Mentor Graphics har utviklet programvare (Modelsim//Questa) som gjør det mulig å beskrivem, simulere og feilsøke VHDL-kode. Fremgangsmåten for skriving, kompilering og simulering av VHDL-kode finner du under.


Mentor Graphics har utviklet programvare (Modelsim) som gjør det mulig å simulere og debugge VHDL-kode. Design architect kan brukes til å skrive og kompilere VHDL-programmene, men det anbefales å bruke en teksteditor i VHDL-modus, f.eks Emacs. Modelsim brukes til simulering. Fremgangsmåten for skriving, kompilering og simulering av VHDL-kode finner du under.
==Starte Questa Sim==
Når man skal arbeide med Questa Sim fra Mentor Graphics skriv følgende kommando i et terminalvindu.


==Skriving av VHDL kode==
ssh -X mikroserver4
export LM_LICENSE_FILE=1717@lisensserver
source /eda/mentor/2019-20/scripts/PRECISION_2019.1.1_RHELx86.sh
vsim


En ny VHDL kode (et design beskrevet med VHDL kode) påbegynnes med å starte emacs (eller en den innebygde teksteditoren i ModelSim).
==Lage et nytt prosjekt==


Det fine med emacs er at man kan velge VHDL-modus. Dette gjøres med å skrive ''M-x vhdl-mode'' (M står for ''Meta'' og er vanligvis definert som esc-knappen). I emacs har en menyer med alle valg oppe langs kanten som i andre teksteditorer, men programmet skiller seg litt ut med kommandolinjen nederst i vinduet. Når en f. eks. skal lagre filen en har skrevet blir denne kommandolinjen aktiv og en skriver inn sti og filnavn der. Når man lagrer er ikke navnet på kodefilen viktig, men det er fornuftig å kalle den det samme som ENTITY-delen, med ''.vhdl'' som "etternavn". (F. eks. sr_latch.vhdl)
I den følgende teksten er det vist hvordan man kan utføre kompilering, etc. på kommandolinjen. Dette kan enten gjøres i fra X terminalvinduet, eller fra kommandolinjen i Questa. Hvis man velger å bruke Questa-miljøet er de fleste prosedyrer/kommandoer tilgjengelige under menyen.


==Kompilering av VHDL kode==
Start et nytt prosjekt med
 
Simuleringsverktøyet for VHDL (og verilog) heter Modelsim, og startes med kommandoen


<pre>
<pre>
vsim &
File > New > Project
</pre>
</pre>


kommandoen (aliaset) mentor sørger for velge riktige stier og miljøvariable.
[[Image:questa_new_project.png]]


Start et nytt prosjekt med
Velg et fornuftig navn og katalog. Man kan gjerne ha flere uavhengige vhdl-filer i et prosjekt.
Det er en fordel å ha en hovedkatalog til vhdl prosjektene og en underkatalog for prosjektet fex /home/bruker/vhdl_prosjekt/sr_latch


<pre>
==Skriving av VHDL kode==
File > New > Project
</pre>


Velg et fornuftig navn og katalog.
En ny VHDL kode (et design beskrevet med VHDL kode) påbegynnes med å starte emacs i terminal vinduet eller ved å bruke den innebygde teksteditoren i Questa ved å velge Create New File.  


Før man kan kompilere koden må man sette mappen man ønsker at biblioteket av de kompilerte kodene skal ligge. Dette kan gjøres med:
Det fine med emacs er at man kan velge VHDL-modus. Dette gjøres med å skrive ''M-x vhdl-mode'' (M står for ''Meta'' og er vanligvis definert som esc-knappen). I emacs har en menyer med alle valg oppe langs kanten som i andre teksteditorer, men programmet skiller seg litt ut med kommandolinjen nederst i vinduet. Når en f. eks. skal lagre filen en har skrevet blir denne kommandolinjen aktiv og en skriver inn sti og filnavn der. Når man lagrer er ikke navnet på kodefilen viktig, men det er fornuftig å kalle den det samme som ENTITY-delen, med ''.vhdl'' som "etternavn" (f. eks. sr_latch.vhdl).


<pre>
==Kompilering av VHDL kode==
vlib work
</pre>


Mappen work blir da bibliotekmappen.
Koden kompileres med
 
Kommandoen (aliaset) ''mentor'' sørger for velge riktige stier og miljøvariable.
 
Når dette er gjort kompileres koden ved


<pre>
<pre>
vcom sr_latch.vhdl
vcom sr_latch.vhdl
</pre>
</pre>


Hvis det er feil i koden vil disse listes opp. Feilmeldingen har en henvisning til linjenummer, som kan brukes til å lokalisere feilen i teksteditoren.
Hvis det er feil i koden vil det komme en melding i kommando vinduet. Dobbeltklikker du på feilen vil du få opp en liste over kompileringsprosessen og alle feilene. Dobbeltklikker du så på linjen som angir en feil så vises den respektive linjen i editoren.


Merk at navnet til det kompilerte designet blir skrevet med små bokstaver, selv om du har brukt store bokstaver i ENTITY- eller ARCHITECTURE-navnet. Det kompilerte designet blir liggende i work-katalogen.
Merk at navnet til det kompilerte designet blir skrevet med små bokstaver, selv om du har brukt store bokstaver i ENTITY- eller ARCHITECTURE-navnet. Det kompilerte designet blir liggende i work-katalogen.


==Simulering og debugging i Modelsim==
==Simulering og debugging i Questa==


Når koden kompilerer feilfritt kan den simuleres i Modelsim. Dette startes med:
Når koden kompilerer feilfritt kan den simuleres i Questa. Dette startes med:


<pre>
<pre>
vsim &
vsim
</pre>
</pre>


Modelsim bruker et standard X-basert vindusoppsett, og er derfor noen forskjellig fra de andre Mentor-programmene. Når du starter simulatoren åpnes det et vindu som vist i figur 1. Begynn med å åpne diverse vinduer:
Nå dukker det opp en rute der du skal velge hva som skal simuleres, utvid work og velg vhdl filen. Eventuellt kan du skrive vsim work.sr_latch i kommandovinduet


* View > Source
Questa bruker et standard X-basert vindusoppsett, og er derfor noen forskjellig fra de andre Mentor-programmene. Når du starter simulatoren åpnes det et vindu som vist i figur 1. Begynn med å åpne diverse vinduer:


* View > Signals
* View > Wave


Man kan også gi kommandoer i ModelSim-vinduet. F.eks.
* View > Objects
 
* View > Locals
 
Man kan også gi kommandoer i Questa-vinduet. F.eks.


<pre>
<pre>
Wave *
Wave *
</pre>
</pre>
 
Dra de signalene du vil se på i wave vinduet fra object vinduet.
 
Signalverdier settes med kommandoen 'force' eller med
Signalverdier settes med kommandoen 'force' eller med


<pre>
<pre>
Force > Force (i "Signals" vinduet)
Force > Force (i "Signals" vinduet)
</pre>
</pre>


Line 86: Line 87:


<pre>
<pre>
Force > Clock (i "Signals" vinduet)
Force > Clock (i "Signals" vinduet)
</pre>
</pre>


Line 92: Line 93:
===Signalflyt i en SR-lås===
===Signalflyt i en SR-lås===


Simuler SR-låsen. Begynn med å påtrykke stimuli til alle signaler ved tid 0 (t0). Bruk STEP-knappen for å simulere på delta-tid-nivå. (Om en holder musepekeren over knappene i ModelSim, kommer det en forklarende tekst opp.) Når verdiene er stabile kjører du i f.eks. 100 ns før du endrer stimuli (skriv ''run 100'' i et av vinduene). Tilsvarende kan du endre stimuli ved å skrive f.eks. ''force S 0'' i hoved-vinduet. Legg merke til den røde pilen som peker på den linjen som blir utført.
Simuler SR-låsen. Begynn med å påtrykke stimuli til alle signaler ved tid 0 (t0). Bruk STEP-knappen for å simulere på delta-tid-nivå. (Om en holder musepekeren over knappene i Questa, kommer det en forklarende tekst opp.) Når verdiene er stabile kjører du i f.eks. 100 ns før du endrer stimuli (skriv ''run 100'' i et av vinduene). Tilsvarende kan du endre stimuli ved å skrive f.eks. ''force S 0'' i hoved-vinduet. Legg merke til den røde pilen som peker på den linjen som blir utført.


Hvis du vil begynne på ny kan du velge
Hvis du vil begynne på ny kan du velge


<pre>
<pre>
File > Restart -f
File > Restart -f
</pre>
</pre>


Line 103: Line 104:
LIBRARY ieee;
LIBRARY ieee;
USE ieee.std_logic_1164.ALL;
USE ieee.std_logic_1164.ALL;
 
ENTITY SR_latch IS
ENTITY SR_latch IS
  PORT (
PORT (
        S,R  : IN std_logic ;
S,R  : IN std_logic ;
        Q,QB : INOUT std_logic );
Q,QB : INOUT std_logic );
END SR_latch;
END SR_latch;
 
-------------------------------------------------------------------------------
-------------------------------------------------------------------------------
 
ARCHITECTURE behave OF SR_latch IS
ARCHITECTURE behave OF SR_latch IS
 
BEGIN  --  behave
BEGIN  --  behave
  Q <= S nand QB;
Q <= S nand QB;
  QB <= R nand Q;
QB <= R nand Q;
END behave;
END behave;
</pre>
</pre>
Line 123: Line 124:
===Signaler og variable===
===Signaler og variable===


Simuler VHDL-koden i eksempel 6.3 i kompendiet. Bruk Step eller Step Over for å følge prosedyrens utvikling linje for linje.
Simuler VHDL-koden under. Bruk Step eller Step Over for å følge prosedyrens utvikling linje for linje. Simulere med optimaliseringsopsjon "-voptargs=+acc" for å kunne se variablene i wave-vinduet:


Bruk View > Variables for å kikke på innholdet i variablene. Forklar endringene i signaler og variable.
vsim -voptargs=+acc sign_var
 
Bruk View > Objects for å kikke på signalene og View > Local for å se innholdet i variablene. Forklar endringene i signaler og variable. Hva er forskjellen som funksjon av tid/delta-tid?


<pre>
<pre>
LIBRARY ieee;
LIBRARY ieee;
USE ieee.std_logic_1164.ALL;
USE ieee.std_logic_1164.ALL;
 
 
ENTITY sign_var IS
ENTITY sign_var IS
   PORT (CLK : IN std_logic);
   PORT (clk : IN std_logic);
END sign_var;
END sign_var;
 
 
-------------------------------------------------------------------------------
-------------------------------------------------------------------------------
 
 
ARCHITECTURE difference OF sign_var IS
ARCHITECTURE difference OF sign_var IS
 
  signal SA: bit := '0';
signal SA: bit := '0';
  signal SB: bit := '1';
signal SB: bit := '1';
 
begin  --  difference
begin  --  difference
  process
p_test: process
      variable A: bit := '0';
  variable A: bit := '0';
      variable B: bit := '1';
  variable B: bit := '1';
  begin
  begin
    wait until rising_edge(clk);
    wait until rising_edge(clk);
    A := B;
    A := B;
    B := A;
    B := A;
    SA <= SB after 5 ns;
    SA <= SB after 5 ns;
    SB <= SA after 5 ns;
    SB <= SA after 5 ns;
  end process;
  end process p_test;
END architecture difference;
end architecture difference;
</pre>
</pre>

Revision as of 21:06, 4 February 2021

Konstruksjon og simulering av VHDL-kode med Modelsim/Questa

Innledning

Hensikten med denne oppgaven er å få et lite innblikk i bruk av høynivåspråk for simulering og uttesting av kretsløsninger. I denne oppgaven skal vi bruker VHDL (Very high speed integrated circuit Hardware Description Language), som er spesielt utviklet for elektronikk. VHDL er definert slik at det passer i en mengde sammenhenger, og er det vil derfor være uoverkommelig å gå inn på detaljer i denne oppgaven. Vi skal ta for oss noen eksempler:

  • Eksempel 1: Signalflyt i en SR-lås
  • Eksempel 2: Signaler og variable

Et VHDL program består i hovedsak av ENTITY, som definerer tilkobling mellom programmet og omverden, og ARCHITECTURE, som definerer programmets funksjon. Den komplette VHDL-koden for eksempel 1 vist nederst på denne siden.Mentor Graphics har utviklet programvare (Modelsim//Questa) som gjør det mulig å beskrivem, simulere og feilsøke VHDL-kode. Fremgangsmåten for skriving, kompilering og simulering av VHDL-kode finner du under.

Starte Questa Sim

Når man skal arbeide med Questa Sim fra Mentor Graphics skriv følgende kommando i et terminalvindu.

ssh -X mikroserver4
export LM_LICENSE_FILE=1717@lisensserver
source /eda/mentor/2019-20/scripts/PRECISION_2019.1.1_RHELx86.sh
vsim

Lage et nytt prosjekt

I den følgende teksten er det vist hvordan man kan utføre kompilering, etc. på kommandolinjen. Dette kan enten gjøres i fra X terminalvinduet, eller fra kommandolinjen i Questa. Hvis man velger å bruke Questa-miljøet er de fleste prosedyrer/kommandoer tilgjengelige under menyen.

Start et nytt prosjekt med

File > New > Project

Questa new project.png

Velg et fornuftig navn og katalog. Man kan gjerne ha flere uavhengige vhdl-filer i et prosjekt. Det er en fordel å ha en hovedkatalog til vhdl prosjektene og en underkatalog for prosjektet fex /home/bruker/vhdl_prosjekt/sr_latch

Skriving av VHDL kode

En ny VHDL kode (et design beskrevet med VHDL kode) påbegynnes med å starte emacs i terminal vinduet eller ved å bruke den innebygde teksteditoren i Questa ved å velge Create New File.

Det fine med emacs er at man kan velge VHDL-modus. Dette gjøres med å skrive M-x vhdl-mode (M står for Meta og er vanligvis definert som esc-knappen). I emacs har en menyer med alle valg oppe langs kanten som i andre teksteditorer, men programmet skiller seg litt ut med kommandolinjen nederst i vinduet. Når en f. eks. skal lagre filen en har skrevet blir denne kommandolinjen aktiv og en skriver inn sti og filnavn der. Når man lagrer er ikke navnet på kodefilen viktig, men det er fornuftig å kalle den det samme som ENTITY-delen, med .vhdl som "etternavn" (f. eks. sr_latch.vhdl).

Kompilering av VHDL kode

Koden kompileres med

vcom sr_latch.vhdl

Hvis det er feil i koden vil det komme en melding i kommando vinduet. Dobbeltklikker du på feilen vil du få opp en liste over kompileringsprosessen og alle feilene. Dobbeltklikker du så på linjen som angir en feil så vises den respektive linjen i editoren.

Merk at navnet til det kompilerte designet blir skrevet med små bokstaver, selv om du har brukt store bokstaver i ENTITY- eller ARCHITECTURE-navnet. Det kompilerte designet blir liggende i work-katalogen.

Simulering og debugging i Questa

Når koden kompilerer feilfritt kan den simuleres i Questa. Dette startes med:

vsim

Nå dukker det opp en rute der du skal velge hva som skal simuleres, utvid work og velg vhdl filen. Eventuellt kan du skrive vsim work.sr_latch i kommandovinduet

Questa bruker et standard X-basert vindusoppsett, og er derfor noen forskjellig fra de andre Mentor-programmene. Når du starter simulatoren åpnes det et vindu som vist i figur 1. Begynn med å åpne diverse vinduer:

  • View > Wave
  • View > Objects
  • View > Locals

Man kan også gi kommandoer i Questa-vinduet. F.eks.

Wave *

Dra de signalene du vil se på i wave vinduet fra object vinduet.

Signalverdier settes med kommandoen 'force' eller med

Force > Force (i "Signals" vinduet)

Dersom et av signalene skal være klokkesignal, kan dette gjøres enkelt med

Force > Clock (i "Signals" vinduet)

Eksempler

Signalflyt i en SR-lås

Simuler SR-låsen. Begynn med å påtrykke stimuli til alle signaler ved tid 0 (t0). Bruk STEP-knappen for å simulere på delta-tid-nivå. (Om en holder musepekeren over knappene i Questa, kommer det en forklarende tekst opp.) Når verdiene er stabile kjører du i f.eks. 100 ns før du endrer stimuli (skriv run 100 i et av vinduene). Tilsvarende kan du endre stimuli ved å skrive f.eks. force S 0 i hoved-vinduet. Legg merke til den røde pilen som peker på den linjen som blir utført.

Hvis du vil begynne på ny kan du velge

File > Restart -f
LIBRARY ieee;
USE ieee.std_logic_1164.ALL;

ENTITY SR_latch IS
PORT (
S,R  : IN std_logic ;
Q,QB : INOUT std_logic );
END SR_latch;

-------------------------------------------------------------------------------

ARCHITECTURE behave OF SR_latch IS

BEGIN  --  behave
Q <= S nand QB;
QB <= R nand Q;
END behave;


Signaler og variable

Simuler VHDL-koden under. Bruk Step eller Step Over for å følge prosedyrens utvikling linje for linje. Simulere med optimaliseringsopsjon "-voptargs=+acc" for å kunne se variablene i wave-vinduet:

vsim -voptargs=+acc sign_var

Bruk View > Objects for å kikke på signalene og View > Local for å se innholdet i variablene. Forklar endringene i signaler og variable. Hva er forskjellen som funksjon av tid/delta-tid?

LIBRARY ieee;
USE ieee.std_logic_1164.ALL;

ENTITY sign_var IS
  PORT (clk  : IN std_logic);
END sign_var;

-------------------------------------------------------------------------------

ARCHITECTURE difference OF sign_var IS

signal SA: bit := '0';
signal SB: bit := '1';

begin  --  difference
p_test: process
  variable A: bit := '0';
  variable B: bit := '1';
  begin
    wait until rising_edge(clk);
    A := B;
    B := A;
    SA <= SB after 5 ns;
    SB <= SA after 5 ns;
  end process p_test;
end architecture difference;