Riistvarakirjelduskeel

**Riistvarakirjelduskeel** (*Hardware Description Language* ehk **HDL**) on keel digitaalelektroonikalülituste formaalseks kirjeldamiseks või modelleerimiseks. Sellega on võimalik kirjeldada loodava elektroonikalülituse funktsioone ja süsteemi ülesehitust. Riistvarakirjelduskeelse mudeli põhjal on võimalik hiljem süsteemi arvutis simuleerida või füüsilise elektroonikalülitusena teostada.

## Omadused
Riistvarakirjelduskeelte peaeesmärk on riistvarafunktsioonide kirjeldamine sõltumatult rakendusest. 
Keeled võimaldavad kirjeldada elektroonikalülituse kasutamist, selle arhitektuuri ja ühesehitust ning testida selle kasutamisvõimalusi arvutisimulatsiooni vahendite abil. Võrreldes tarkvara programmeerimisel kasutatavate keeltega sisaldavad HDL-i süntaks ja semantika täpseid kirjaviise aja ja samaaegsuse väljendamiseks. Signaalide ajaliste seoste kirjeldamine on riistvara puhul võtmetähtsusega.

Kirjeldused võivad põhineda kas lülituse struktuuril või käitumisel. 
*Struktuurikirjeldus on mingi seadise või selle graafilise skeemi (tekstiline) kirjeldus. Süsteemi struktuuri kirjeldatakse hierarhilise mudeliga. Kirjeldatava seadise hierarhia madalaim tase koosneb primitiivosast, mis on kasutatavale keelele spetsiifiline. 
*Käitumusliku mudeli ehk funktsionaalne lähenemise puhul kirjeldatakse mida loogikaseadis teeb. Objekti vaadeldakse kui plokki millel on teatud omadused (sisendid, väljundid, funktsioonid). Käitumusliku mudeli puhul pole disaini algetapis rakendus oluline. Loogikaseadise tegelik struktuur ja skeem genereeritakse alles hiljem – loogikaseadme sünteesimise etapis.

Keeled, millele on iseloomulikuks väljendada ainult struktuuri, st hierarhiaplokkidevahelisi ühendusi, liigitatakse "netlisti" keelteks.

## Kasutus

Riistvarakirjelduskeeli kasutatakse programmeeritavate loogikalülituste, näiteks lihtsate programmeeritavate loogikaseadiste (SPLD) ja keerukate programmeeritavate loogikalülituste (CPLD) funktsioonide kirjeldamiseks elektroonikaseadmetes.

Keele simulaatorprogramm on ettenähtud tõlgendama aluseks oleva semantika abil keele lauseid koos aja kulgemise simuleerimisega. See võimaldab riistvara disaineril modelleerida osa riistvarast enne selle füüsiliselt valmistamist. Taoline võimalus programmi simulaatoril täita tekitab riistvarakirjelduskeele puhul illusiooni et tegemist on "programmeerimiskeelega". Riistvarakirjelduskeeled on täpsemalt määratletud kui spetsifikatsioonikeeled või modelleerimiskeeled. On olemas simulaatoreid koos vastavate HDL keeltega millega saab kirjeldada nii diskreetseid (digitaalseid) sündmusi kui ka analoog-elektrilülituste mudeleid.

Kindlasti on võimalik kirjaldada riistvara semantikat ka traditsiooniliste programmeerimiskeeltega, nagu C++, kuigi sellised programmid peavad olema varustatud ulatusliku ning üheselt tõlgendatava teegiga. Tarkvara programmeerimiseks mõeldud keeltel puuduvad võimalused ühemõtteliselt aega määratleda ning seetõttu pole neil piisavat funktsionaalsust riistvara kirjeldamiseks.

Enne SystemVerilogi kasutati programmeerimiskeele C++ integreerimist loogikasimulaatorisse, mis oli üks väheseid objektorienteeritud programmeerimiskeele (OOP) kasutusi riistvara töövõime kontrollimisel. SystemVerilog oli esimene suurem HDL, mis võimaldas objektorienteeritust ja "prügi kogumist".

## Ajalugu
Esimesed riistvarakirjelduskeeled olid ISP (Instruction Set Processor), mis töötati välja Carnegie Melloni Ülikoolis, ja KARL, mida arendati Kaiserslauterni Ülikoolis 1977. aastal. ISP oli siiski pigem tarkvaraarenduskeel, mida kasutati disaini sisendite ja väljundite vaheliste seoste kirjeldamiseks. Seega sai ISP'd kasutada disaini simuleerimisel, kuid mitte lülituste sünteesil. KARL lisas omadused, mis olid vajalikud VLSI (Very-large-scale integration) kiipide struktureeritud riistvaradisainil.

See oli ühtlasi aluseks KARL-i interaktiivsele graafilisele sõsarkeelele ABL, mis loodi telekommunikatsiooni uurimiskeskuse CSELT poolt Torinos Itaalias kui ABLED graafikaga VLSI disaini redaktor. 
1980. aastate keskpaiku arendas rahvusvaheline Euroopa firmade konsortsium koos ülikoolidega, VLSI disaini KARL-i ja ABLi peal. Aastal 1973 tutvustati firma Data-I/O poolt keelt ABEL. See oli mõeldud programmeeritavate loogikaseadmete kirjeldamiseks ning seda kasutati peamiselt lõplikel olekumasinatel (*finite-state machine*).

Esimene kaasaegne HDL oli Verilog, mille tõi turule ettevõte Gateway Design Automation 1985. aastal. Firma Cadence Design Systems omandas hiljem õigused Verilog-Xl-ile ehk HDL simulaatorile. Sellest kujunes järgmise kümnendi *de facto* standard Verilog simulaatorite seas.

1987. aastal viis Ameerika Ühendriikide kaitseministeeriumi tellimus väga kiirete integraallülituste (VHSIC ehk *Very High Speed Integrated Circuit*) VHDL-i (lühend sõnadest *VHSIC Hardware Description Language*) väljatöötamiseni. VHDL põhines programmeerimskeelel Ada. Algselt olid Verilog ja VHDL kasutusel juba olemasolevate elektroonikalülituste disainikirjelduste dokumenteerimiseks ja simuleerimiseks. HDL-simulatsioon võimaldas inseneridel töötada kõrgemal abstraktsioonitasemel kui seda oli sellele eelnenud skeemide tase. Sellega suurendati disaini suurust sadadelt transistoridelt tuhandeteni.

Loogikasünteesi võidukäik tõstis riistvarakirjelduskeeled digitaaldisaini mõistes taustalt esiplaanile. Loogikasüntees tõstis riistvarakirjelduskeeled digitaalse disaini tehnoloogia kesksesse rolli.

Vaid mõne aastaga kerkisid nii VHDL kui ka Verilog elektroonikatööstuses domineerivale kohale, samas vanemad ja väiksemate võimalustega riistvarakirjelduskeeled järk-järgult igapäevakasutusest kadusid. Sellegipoolest on VHDL-il ja Verilogil sarnaseid piiranguid: kumbki keel ei sobi analoog- ja segasignaaliga skeemi simulatsiooniks. Kumbki ei oma keelelisi võimalusi rekursiivselt genereeritud loogikastruktuuride kirjeldamiseks. Spetsiaalsed HDL-id (nt Confluence) tulid turule eesmärgiga ületada spetsiifilisi Verilogi/VHDL-i piiranguid, kuid ükski nendest polnud kunagi mõeldud VHDL-i või Verilogi asendajaks.

Üle aastate on palju panustatud HDL-ide arendamisse. Viimane versioon Verilogist, ametlikult tuntud kui IEEE 1800–2005. SystemVerilogi keel tutvustas paljusid uusi keele võimalusi (klassid, muutujad ning atribuudid ja deklaratsioonid), et rahuldada nõudlust parema disainihierarhia ja objektide taaskasutuse järele. Oodatakse, et uus arenduses olev VHDL keele versioon oleks SystemVerilogi keelega võrdväärsete võimalustega.

## Digitaalelektroonikalülituste disain riistvarakirjelduskeeltega

Töö efektiivsuse suurenemine riistvarakirjelduskeelte kasutamisel on viinud selleni, et suurem osa tänapäeva digitaalskeemide disainist põhineb riistvarakirjelduskeeltel. Enamik disainidest algab nõuete komplekti koostamisega või kõrgetasemelise arhitektuurilise skeemina. Kontrolli- ja otsustusstruktuurid on sageli prototüüpidena näidatud voogdiagrammide rakendustes või sisestatud taseme töötlusskeemi või töötlusprogrammi. HDL-i kirjelduse sisestamise protsess sõltub palju skeemi iseloomust ja disaineri eelistusest kodeerimisstiili valikul. Riistvarakirjelduskeel on pelgalt ideede sisestamise keel (*capture language*) mis võimaldab kõrgetasemelist algoritmilist kirjeldamist nagu C++ või matemaatiline mudelgi. Elektroonikadisainerid kasutavad sageli lisaks skriptimise keeli (nagu Perl), et automaatselt genereerida korduvaid skeemistruktuure riistvarakirjelduskeeltes.

Lisavõimalustega tekstiredaktorid võimaldavad riistvarakirjelduskeeles kirjutatu automaatset värvimist ja automaatseid taandridu sõltuvalt süntaksist. Spetsiaalsetel tekstiredaktoritel on makrodel põhinevad olemite, arhitektuuride ja signaalide deklareerimise laiendused.

Pärast sisestamist läbivad teksti kujul kirjeldused kontrollimise või revideerimise. Elektroonikalülituse loogikasünteesi ettevalmistusena antakse HDL keelne tekst mitmesugustele automaatsetele kontrollimisprogrammidele. Kontrollimisprogrammid raporteerivad kõrvalekalletest standardiseeritud koodi piirmääradest ning tuvastavad potentsiaalelt ebakorrektseid koodi konstruktsioone, enne kui need võivad hakata midagi segama ja kontrollib tavalisi loogikakodeerimise vigu, nagu määramata olekuga ehk "rippuvad" väratid (ports) või lühistatud väljundid. Kontrolliprotsess aitab lahendada probleeme ja parandada disainivigu enne lülituse koodi sünteesimist. http://en.wikipedia.org/wiki/Hardware_description_language

Kui lihtsamate programmeeritavate loogikakiipide (SPLD) puhul tehakse lihtsa riistvarakirjelduskeele kompilaatoriga madalatasemelisest mudelist otse vastavale kiibile sobiv kood, siis tänapäevaste kõrgtasemeliste riistvarakirjelduskeelte ja keerukate loogikakiipide (CPLD) puhul on koodi moodustamine jagatud mitmesse etappi:
* Loogika automaatsüntees (*automatic logic synthesis*)
* Sünteesitud skeemi paigutamine kiipi (*fitter*, *place-and-route*)

## Simulatsioon ja vigade kõrvaldamine

Riistvarakirjelduskeelega disainides on väga oluline disaini simuleerimise võimalus. Simulatsioon võimaldab kirjeldusel ehk mudelil läbida disaini kontrollimise. See on oluline vaheetapp, mis valideerib HDL kirjelduses disaini funktsiooni ja rakendamisvõimalused. 
See annab ühtlasi võimalusi uuteks leidudeks süsteemi arhitektuuri osas. Insener saab eksperimenteerida mitmete disaini variatsioonidega, tehes erinevaid modifikatsioone peadisainist ning seejärel võrreldes nende käitumist simulatsioonis. Seetõttu on simulatsioon eluliselt tähtis osa riistvarakirjelduskeelses elektroonikadisainis.

Disaini lõplik kinnitamine on sageli kõige aeganõudvam osa disainiprotsessist, seda järgnevate lahkhelide tõttu: seadmete funktsionaalsed spetsifikatsioonid, disaineri interpretatsioon spetsifikatsioonist ning HDL keele ebatäpsused. Valdav osa esmasest testimise ja vigade kõrvaldamise tsüklist viiakse läbi HDL simulaatori keskkonnas sest disaini varajane etapp on täis sagedasi ning mahukaid muutusi skeemides. HDL kirjeldust saab prototüüpida (valmistada füüsiline prototüüp) ning testida ka riistvaras. Sageli kasutatakse selleks programmeeritavaid loogikaseadmeid. Riistvara prototüüpimine on märkimisväärselt kulukam kui HDL simulatsioon, kuid seevastu pakub see pärismaailma vaatenurka disainist. Prototüüpimine on parim viis, et kontrollida kasutajaliideseid erinevate riistvaraliste seadmete ja riistvara prototüüpidega. Isegi need füüsilised mudelid, mida käitab aeglane FPGA (*field-programmable gate array*), pakuvad tunduvalt kiiremat simulatsiooni kui puhas HDL-i arvutisimulatsioon.

## Disaini töövõimelisuse kontroll riistvarakirjelduskeeles

Ajalooliselt oli elektroonikadisaini töövõime kontroll väga vaevarikas, korduvad tsüklid mudelite kirjutamist ning simulatsioonide käitamist katsekeskkonnas. Kuna kiibidisain on kasvanud mahukaks ning keerukamaks, siis on disaini valideerimine laienenud tervele disaini meeskonnale. Otsides lahendusi disainiprotsessi produktiivsuse tõstmiseks, on elektroonilise disaini automatiseerimise (*Electronic Design Automation*, EDA) süsteemides arendatud välja omaduste spetsifitseerimise keel PSL (*Property Specification Language*).

Ametliku verifikatsiooni puhul on omadus faktiline väide eeldatud või tellija oodatud käitumisest mingi teise objekti suhtes. Ideaalis, antud HDL kirjelduses oleks omaduse või omaduste väärtusi võimalik nimetada kas õigeks või valeks, kasutades matemaatilisi meetodeid. Praktiliselt aga pole paljude omaduste puhul seda võimalik tõestada, kuna need hõlmavad sidumata lahenduse ruumi. Kuigi andes ette mingi hulga operatiivseid eeldusi või piiranguid, oleks omaduste kontrollijal võimalik tõestada või ümber lükata rohkem omadusi, üle piiratud lahenduste hulga.

Need tõestused ei modelleeri skeemi aktiivsust, vaid hõlmavad ja dokumenteerivad disaineri kavatsusi HDL keeles. Simulatsiooni keskkonnas, kui simulaator hindab kõiki määratud tõestusi, raporteerides rikke asukoha ning mingi rikkumise tõsiduse. Sünteesikeskkonnas, kus sünteesi vahend tavaliselt opereerib sünteeside peatamisega mingite rikkumiste korral. Tõestusel põhinev valideerimine on veel lapsekingades kuid, sellelt oodatakse integreeritud osa HDL disaini töövahendites.

## Riistvarakirjelduskeeled ja programmeerimiskeeled

Riistvarakirjelduskeeled sarnanevad tarkvaraarenduses kasutatavate programmeerimiskeeltega, kuid suurte erinevustega. Mõni programmeerimiskeel on loomupäraselt protseduuriline, piiratud süntaktilise ja semantilise toega, toetamaks samaaegsust. HDL-id seevastu sarnanevad samaaegse programmeerimise (*concurrent programming*) keeltega oma võimekuselt modelleerida paralleelselt mitut protsessi, mis töötavad automaatselt ja üksteisest sõltumatult. Vähimgi muutus protsesside sisendis vallandab automaatselt uuenduse simulaatori protsesside hulgas. Nii programmeerimiskeeled kui ka HDL-id on töödeldavad kompilaatoriga (HDL-i puhul nimetatakse seda tavaliselt süntesaatoriks), kuid erinevate eesmärkidega.

Teisalt, tarkvara kompilaator teisendab lähtekoodi loetelu mikroprotsessori-spetsiifiliseks objektkoodiks, et panna see tööle valitud mikroprotsessoril. Kuna HDL ja programmeerimiskeeled laenavad üksteiselt kontseptsioone ja omadusi, on nende vaheline piir üha hägustumas. Siiski puhas HDL ei sobi üldotstarbeliste tarkvararakenduste arendamisel, samamoodi nagu üldotstarbelised programmeerimiskeeled ei sobi riistvara modelleerimiseks. Kuid kuna elektroonilised süsteemid muutuvad ühe keerukamateks ning ümberseadistatavad süsteemid levivad aina laiemalt, siis nõudlus sellise ühe keele järele, mis sobiks nii riistvaradisainiks kui ka tarkvaraarenduseks, aina suureneb. Näide sellisest keelest on SystemC – sisseehitatud süsteemi riistvara osi saab modelleerida, kui ebadetailseid arhitektuurilisi plokke. Sihtrakendus on kirjutatud C/C++ keeles ning algupäraselt kompileeritud hostarendussüsteemile (vastupidi mikroprotsessorile suunatust). SystemC mudelite kõrge abstraktsioonitase sobitub hästi varajasse arhitektuurilisse uuringusse, kuna arhitektuurilisi modifikatsioone saab lihtsa vaevaga hinnata. Kuid SystemC puhul kasutatav mudel ja selle sõltuvus jagatud mälust tähendavad seda, et see ei saa paralleelsete käskude ja madalama taseme mudelitega hästi hakkama.

## MyHDL

MyHDL on tarkvaraarenduses kasutatud objektorienteeritud programmeerimiskeelel Python põhinev riistvarakirjelduskeel.http://www.vallaste.ee/index.htm?Type=UserId&otsing=2998 MyHDL on tasuta, vabavaraline pakett, mis võimaldab kasutada kõrgkeelt Python riistvara kirjeldamise ja verifitseerimise keelena. Programm MyHDL suudab teisendada disaini Verilogi või VHDL-i. See annab võimaluse disaini hiljem traditsiooniliste vahenditega jätkata.

## Vaata ka
*PALASM
*CUPL
*ABEL (Advanced Boolean Expression Language)
*VHDL
*Verilog
*MyHDL

## Viited

## Muud allikad
* http://www.cs.ucsb.edu/~gaurav_mehta/reports/cs263.pdf
* http://en.wikipedia.org/wiki/Hardware_description_language
* http://www.vallaste.ee/index.htm?Type=UserId&otsing=2998
* http://www.myhdl.org/doku.php/overview