[Home](index.html) | [Quartus](quartus.htm) | [Blink](blink.htm) | Simulacija # Simulator ModelSim **ModelSim** je program za simulacijo digitalnega vezja opisanega v jeziku VHDL ali Verilog. Program *Modelsim - Intel FPGA Starter Edition* je brezplačno dostopen na [www.altera.com](www.altera.com) v okviru programskega paketa [Quartus Prime](https://www.altera.com/products/design-software/fpga-design/quartus-prime/download.html). Simulacijo lahko poženemo iz orodja **Quartus**, ki pripravi projekt s skripto za prevajanje, ali pa samostojno, tako da naredimo nov projekt programa **ModelSim**. ## Samostojen ModelSim projekt **ModelSim** poženemo tako, da v Windows Start poiščemo ModelSim Intel FPGA Starter Edition. Program odpre okno v katerem kliknemo **Jumpstart** in nato Create Project. Določimo ime in lokacijo projekta, v naslednjem oknu **Add items to the Poject** pa dodamo v projekt VHDL/Verilog datoteke. Datoteke najprej prevedemo z desnim klikom na ime datoteke v oknu **Project** in izbiro Compile > Compile Selected ali Compile All. ![](./img/modelsim_compile2.png) V primeru napak, se v oknu **Transcipt** izpiše sporočilo o neuspešnem prevajanju, z dvoklikom na rdeče obarvano besedilo pa se odpre okno s podrobnejšim opisom napake. Kodo popravimo v urejevalniku, ki ga odpremo z dvoklikom na ime vezja v oknu **Project**. Simulacijo pričnemo s Simulate > Start Simulation..., ki odpre okno v katerem s klikom odpremo knjižnico work, izberemo opis vezja (Design Unit(s)) in potrdimo z OK. ![](./img/modelsim_startsim.png) ## Potek simulacije Rezultate simulacije običajno opazujemo v obliki poteka signalov v oknu **Wave**, ki jih moramo v okno najprej dodati. Če simuliramo le enoto (manjše vezje brez testne strukture) dodamo kar vse signale: Add > To Wave > All items in region. Kadar imamo več enot in signalov, pa jih izbiramo: v levem oknu **Instance** s klikom izberemo ustrezno enoto, da se pokažejo signali te enote v sosednjem oknu **Objects**, od koder jih z miško prenesemo v **Wave**. Vrednosti večbitnih signalov so privzeto prikazane v dvojiški obliki, lahko pa format prikaza nastavimo z desnim klikom na enega ali več izbranih signalov in izbiro v meniju Radix. Najbolj uporabni številski formati so Decimal (predznačeni desetiški), Unsiged (nepredznačeni desetiški) in šestnajstiški. ![](./img/modelsim_radix.png) Če nimamo testne strukture, moramo v simulatorju nastaviti vrednosti vhodnih signalov, kar storimo z ukazi grafičnega vmesnika (GUI) ali pa z ukazi, ki jih vnašamo v konzolo. Ta način je uporaben le za zelo majhna in enostavna vezja, sicer pa je najbolje da dodamo v projekt testno strukturo, ki naredimo npr. s spletnim orodjem [Grafični Test Bench](https://lniv.fe.uni-lj.si/graftb/). V tem primeru izberemo entiteto testne strukture ob zagonu simulacije. ### Nastavitev vhodov z GUI V oknu **Wave** z desnim klikom na signal izberemo Force... in pod Value nastavimo vrednost. Vrednost vnesemo v vektorski (binarni) obliki, ali pa kot desetiško vrednost s predpono 10#, npr. desetiško število 3 zapišemo kot 10#3. ![](./img/modelsim_force.png) Periodične signale, npr. uro, nastavimo tako, da namesto Force... izberemo Clock... in določimo ustrezno periodo (Period). Ko nastavimo vhode, izvedemo simulacijo za določen čas (100 ps) s tipko **F9**, nato spremenimo enega ali več vhodov in ponovno izvedemo simulacijo. Ob pregledu rezultatov lahko spreminjamo skalo - Zoom s tipkami (**I** = Zoom In, **O** = Zoom Out, **F** = Zoom Full) in številski format. Ta način izvedbe simulacije je precej zamuden, zato raje uporabljamo nastavitev vhodov z ukazi ali pa s testno strkuturo. ### Nastavitev vhodov z ukazi Ukaze pišemo v spodnje okno **Transcript**. Ukaz ```force``` uporabimo za nastavitev signalov v simulatorju, kadar niso nastavljeni s testno strukturo. Med simulacijo lahko nastavimo vrednost kateregakoli signala, vendar je smiselno nastavljati le signale, ki so **vhodi** vezja. Primer: dve obliki ukaza, ki nastavi signal a vezja add na vrednost 3: ```tcl force /add/a 0011 force a 10#3 ``` V prvem primeru smo natančno zapisali pot do signala v obliki /ime_vezja/ime_signala in vrednost v privzeti vektorski obliki. Zapis poti do signala nam omogoča, da nastavimo signal v poljubni hierarhični komponenti vezja. Kadar simuliramo le eno vezje, lahko pot izpustimo in zapišemo samo ime signala. Če želimo zapisati vrednost v desetiškem zapisu uporabimo predpono 10#, negativno desetiško vrednost pa določimo tako: ```tcl force a -10#3 ``` V splošnem lahko določimo več vrednosti, ki naj jih dobi signal v nekem časovnem zaporedju: ```TCL force a 10#0, 10#4 @100 ps, 10#5 @200 ps force a 10#0, 10#4 100 ps, 10#5 200 ps ``` Prvi ukaz nastavi signal a najprej na 0, potem na 4 ob času 100 ps in nato na 5 ob času 200 ps. S simbolom @ označujemo absolutni simulacijski čas, če ga izpustimo pa časovni parameter predstavlja relativni čas (drugi primer). S stikalom -r določimo, da naj se časovno zaporedje ponavlja z določeno periodo. Uro bi naprimer določili takole: ```TCL force clk 1 0 ps, 0 {100 ps} -r 200 ps ``` Simulacijo poženemo za določen čas z ukazom run: ```TCL run 500 ps ``` **Privzete vrednosti** Privzeti format zapisa vrednosti ali privzeto časovno enoto lahko spremenimo in v tem primeru ni potrebno zapisati predpone oz. časovne enote. Spodnja dva ukaza nastavita časovno enoto ns in privzeti številski format unsigned: ```tcl set UserTimeUnit ns set DefaultRadix unsigned ``` ## Simulacija iz programa Quartus Simulacijo izvedemo s Tools > Run Simulation > RTL Simulation. Če se simulator ne odpre, preverimo ali smo namestili ModelSim in nastavili pot do programa: Tools > Options, EDA Tool Options: ModelSim-Altera: `C:\intelFPGA_lite\17.0\modelsim_ase\win32aloem` Ko se program **ModelSim** odpre, najprej izvede skripto za prevajanje datotek in javi morebitne napake. Če bi npr. namesto prireditvenega operatorja <= uporabili le =, bi program v oknu **Transcript** izpisal sporočilo o napaki, ki vsebuje ime datoteke, vrstico v oklepaju in vrsto napake. ![](./img/modelsim_err.png) Napako v urejevalniku (npr. v programu **Quartus**) popravimo, shranimo in ponovno poženemo simulator. To lahko storimo s skripto v oknu **Transcipt**, ki jo s puščico navzgor prikličemo iz zgodovine, npr. `do projekt_run_msim_rtl_vhdl.do`, ali pa tako da v oknu **Library** odpremo knjižnico rtl_work, desni klik na add in izberemo Recompile. Simulacijo pričnemo s klikom na Simulate. ![](./img/modelsim_compile.png)