Στη μηχανική υπολογιστών, μια **γλώσσα περιγραφής υλικού** (**hardware description language** ή **HDL**) είναι μια γλώσσα που ανήκει σε μια κλάση γλωσσών προγραμματισμού, γλωσσών προδιαγραφών ή γλωσσών μοντελοποίησης για την τυπική περιγραφή και σχεδίαση ηλεκτρονικών κυκλωμάτων, και συνηθέστερα, ψηφιακής λογικής. Μπορεί να περιγράψει τη λειτουργία, τη σχεδίαση και την οργάνωση του κυκλώματος, μαζί με δοκιμές που επιβεβαιώνουν τη λειτουργία του μέσω προσομοίωσης.

Οι HDL είναι κλασικές εκφράσεις σε κείμενο της χωρικής και χρονικής δομής και συμπεριφοράς των ηλεκτρονικών συστημάτων. Όπως και οι γλώσσες ταυτόχρονου προγραμματισμού, η σύνταξη και η σημασιολογία μιας HDL περιλαμβάνουν τον χρόνο, που είναι βασική ιδιότητα του υλικού. Οι γλώσσες με μοναδικό χαρακτηριστικό την έκφραση συνδέσεων κυκλωμάτων ανάμεσα σε μια ιεραρχία μπλοκ κατατάσσονται στις γλώσσες συνόλων συνδέσεων (netlist) που χρησιμοποιούνται στη σχεδίαση μέσω υπολογιστή (CAD).

Οι γλώσσες περιγραφής υλικού χρησιμοποιούνται για τη συγγραφή εκτελέσιμων προδιαγραφών για κάποιο συγκεκριμένο υλικό. Ένα πρόγραμμα προσομοίωσης, που έχει σχεδιαστεί να υλοποιεί τη σημασιολογία των εντολών της γλώσσας μαζί με την προσομοίωση του χρόνου που περνά, δίνει στον σχεδιαστή του υλικού τη δυνατότητα να μοντελοποιήσει μια συσκευή υλικού πριν αυτή κατασκευαστεί. Αυτή η δυνατότητα εκτέλεσης δίνει στις HDL την εμφάνιση γλωσσών προγραμματισμού, ενώ πιο σωστά αυτές κατατάσσονται στις γλώσσες προδιαγραφών ή στις γλώσσες μοντελοποίησης. Υπάρχουν προσομοιωτές που μπορούν να μοντελοποιήσουν συστήματα διακριτών συμβάντων (ψηφιακά) και συνεχούς χρόνου (αναλογικά), με τις κατάλληλες HDL αντίστοιχα.

Η σημασιολογία του υλικού μπορεί να αναπαρασταθεί και με παραδοσιακές γλώσσες προγραμματισμού όπως η C++, αν και για να λειτουργήσουν αυτά τα προγράμματα πρέπει να συνδεθούν με εκτεταμένες και δύσχρηστες βιβλιοθήκες. Το βασικό πρόβλημα είναι ότι οι γλώσσες προγραμματισμού δεν περιλαμβάνουν δυνατότητες έκφρασης του χρόνου και για αυτόν τον λόγο δε μπορούν να λειτουργήσουν σαν γλώσσες περιγραφής υλικού. Πριν από την εμφάνιση της SystemVerilog, η χρήση της C++ σε συνδυασμό με έναν λογικό προσομοιωτή ήταν ένας από τους λίγους τρόπους που μπορούσε να χρησιμοποιηθεί ο αντικειμενοστρεφής προγραμματισμός στην επαλήθευση του υλικού. Η SystemVerilog ήταν η πρώτη μεγάλη HDL που πρόσφερε αντικείμενα και συλλογή απορριμμάτων.

Με τη χρήση του κατάλληλου υποσυνόλου μιας γλώσσας προγραμματισμού ή περιγραφής υλικού, ένα πρόγραμμα που ονομάζεται synthesizer (ή εργαλείο σύνθεσης) μπορεί να βρει τις λογικές λειτουργίες υλικού που προκύπτουν από τις εντολές της γλώσσας και να παράγει μια ισοδύναμη netlist από γενικές πρωτογενείς λειτουργίες υλικού που υλοποιούν τη ζητούμενη συμπεριφορά. Τα εργαλεία σύνθεσης συνήθως αγνοούν την έκφραση δομών χρονισμού στο κείμενο. Τα εργαλεία ψηφιακής λογικής σύνθεσης για παράδειγμα, γενικά χρησιμοποιούν τις ακμές του ρολογιού για τον χρονισμό του κυκλώματος, αγνοώντας οποιεσδήποτε εντολές χρονισμού. Η ύπαρξη ενός συντιθέμενου υποσυνόλου της γλώσσας δεν οδηγεί πάντα σε μια πλήρη γλώσσα περιγραφής υλικού.

Ιστορικό
--------

Οι πρώτες γλώσσες περιγραφής υλικού ήταν η ISP (Instruction Set Processor), στο Πανεπιστήμιο Κάρνεγκι Μέλον, και η KARL, στο Πανεπιστήμιο Κάιζερσλάουτερν, που αναπτύχθηκαν την ίδια εποχή, κατά το 1977. Η ISP έμοιαζε περισσότερο με γλώσσα προγραμματισμού λογισμικού που χρησιμοποιούνταν για να περιγράψει σχέσεις μεταξύ των εισόδων και των εξόδων μιας σχεδίασης. Επομένως μπορούσε να χρησιμοποιηθεί για να προσομοιώσει τη σχεδίαση, αλλά όχι για να την συνθέσει. Η KARL περιλάμβανε χαρακτηριστικά γλώσσας λογισμού σχεδίασης (design calculus language) που υποστήριζαν χωροταξική διάσταση στα τσιπ VLSI (floorplanning) και δομημένη σχεδίαση υλικού, που αποτελούσαν επίσης τη βάση για την, παρόμοια με την KARL, διαδραστική γραφική γλώσσα ABL. Η ABL υλοποιήθηκε στις αρχές της δεκαετίας του 1980 ως ο γραφικός διορθωτής σχεδιάσεων VLSI με το όνομα ABLED, από το κέντρο έρευνας στις τηλεπικοινωνίες CSELT στο Τορίνο της Ιταλίας. Στα μέσα της δεκαετίας του 1980, υλοποιήθηκε ένα πλαίσιο σχεδίασης VLSI γύρω από την KARL και την ABL από μια διεθνή κοινοπραξία με τη χρηματοδότηση της επιτροπής της Ευρωπαϊκής Ένωσης (κεφάλαιο στο ). Το 1983 η Data-I/Ο κυκλοφόρησε τη γλώσσα περιγραφή υλικού ABEL. Σκοπός της ήταν η περιγραφή προγραμματιζόμενων λογικών συσκευών και χρησιμοποιούνταν κυρίως για τη σχεδίαση μηχανών πεπερασμένων καταστάσεων.

Η πρώτη σύγχρονη γλώσσα περιγραφής υλικού, η Verilog, κυκλοφόρησε από την Gateway Design Automation το 1985. Αργότερα η Cadence Design Systems αγόρασε τα δικαιώματα του Verilog-XL, του προσομοιωτή που θα γινόταν το ντε φάκτο πρότυπο προσομοιωτών της γλώσσας την επόμενη δεκαετία. Το 1987, οι απαιτήσεις από το Υπουργείο Άμυνας των Ηνωμένων Πολιτειών οδήγησαν στην ανάπτυξη της VHDL (VHSIC Hardware Description Language ή Γλώσσα Περιγραφής Υλικού VHSIC, όπου VHSIC σημαίνει Very High Speed Integrated Circuit ή Ολοκληρωμένο Κύκλωμα Πολύ Υψηλής Ταχύτητας). Η VHDL βασίστηκε στη γλώσσα προγραμματισμού Ada. Αρχικά η Verilog και η VHDL χρησιμοποιούνταν για την τεκμηρίωση και την προσομοίωση σχεδιάσεων κυκλωμάτων που υπήρχαν ήδη σε άλλη μορφή (όπως ένα αρχείο σχηματικού διαγράμματος). Η προσομοίωση γλωσσών περιγραφής υλικού επέτρεψε στους μηχανικούς να δουλεύουν σε υψηλότερο επίπεδο αφαίρεσης σε σχέση με την προσομοίωση σε επίπεδο σχηματικού διαγράμματος, με αποτέλεσμα να αυξηθεί η δυνατότητα σχεδίασης από εκατοντάδες τρανζίστορ σε χιλιάδες.

Η εμφάνιση της λογικής σύνθεσης για γλώσσες περιγραφής υλικού έφερε τις γλώσσες αυτές στο προσκήνιο της ψηφιακής σχεδίασης. Εργαλεία σύνθεσης μεταγλώττιζαν αρχεία πηγαίου κώδικα σε κάποια γλώσσα περιγραφής υλικού (γραμμένα σε μια περιορισμένη μορφή που ονομάζεται RTL) σε μια περιγραφή συνόλου συνδέσεων σε επίπεδο πυλών και τρανζίστορ, που μπορούσε να κατασκευαστεί. Η συγγραφή αρχείων RTL που μπορούσαν να συντεθούν απαιτούσε εμπειρία και πειθαρχεία από τον σχεδιαστή - σε σχέση με τις παραδοσιακές σχεδιάσεις με σχηματικά διαγράμματα, τα σύνολα συνδέσεων που μπορούσαν να συντεθούν σε μορφή RTL ήταν συνήθως μεγαλύτερα σε επιφάνεια και με χειρότερη ταχύτητα. Η σχεδίαση κυκλωμάτων από έναν ικανό μηχανικό, με βάση σχηματικά διαγράμματα και διάταξη με το χέρι, ήταν πιο δύσκολη αλλά σχεδόν πάντα μπορούσε να έχει καλύτερα αποτελέσματα από την αντίστοιχη σχεδίαση που είχε συντεθεί λογικά, αλλά η λογική σύνθεση είχε ένα πλεονέκτημα: ήταν πιο παραγωγική με αποτέλεσμα να υπερισχύσει σε πολλούς τομείς, όπως τα κυκλώματα πολύ υψηλής ταχύτητας, μικρής κατανάλωσης, ή τα ασύγχρονα κυκλώματα. Η λογική σύνθεση έκανε την τεχνολογία γλωσσών περιγραφής υλικού σε βασικό στοιχείο της ψηφιακής σχεδίασης.

Μέσα σε μερικά χρόνια η VHDL και η Verilog έγιναν οι κυρίαρχες γλώσσες περιγραφής υλικόυ στη βιομηχανία των ηλεκτρονικών, με τις παλαιότερες και λιγότερο εκφραστικές γλώσσες περιγραφής υλικού να έχουν εξαφανιστεί. Και οι δύο γλώσσες όμως έχουν τους ίδιους περιορισμούς: καμία δεν είναι κατάλληλη για την προσομοίωση αναλογικών ή μεικτών κυκλωμάτων, ούτε περιλαμβάνουν δομές που να μπορούν να περιγράψουν λογικές δομές που έχουν δημιουργηθεί αναδρομικά. Εμφανίστηκαν εξειδικευμένες γλώσσες περιγραφής υλικού (όπως η Confluence) που βασικό τους στόχο είχαν την διόρθωση κάποιου βασικού περιορισμού της Verilog ή της VHDL, χωρίς να έχουν όμως σκοπό να τις αντικαταστήσουν.

Έχουν γίνει αρκετές προσπάθειες να βελτιωθούν οι γλώσσες περιγραφής υλικού. Η τελευταία έκδοση της Verilog, γνωστή και ως IEEE 1800-2005 SystemVerilog, εισάγει αρκετά νέα χαρακτηριστικά (κλάσεις, τυχαίες μεταβλητές, ιδιότητες, βεβαιώσεις) για να αντεπεξέλθει στις αυξανόμενες απαιτήσεις για καλύτερη τυχαία προσομοίωση testbench, ιεραρχία σχεδίασης και επαναχρησιμοποίηση. Αναπτύσσεται επίσης μια μελλοντική έκδοση της VHDL, η οποία θα έχει αντίστοιχες βελτιώσεις με την SystemVerilog.

Σχεδίαση με τη χρήση γλώσσας περιγραφής υλικού
----------------------------------------------

Η αποδοτικότητα που προκύπτει από τη χρήση γλωσσών περιγραφής υλικού σημαίνει ότι το μεγαλύτερο μέρος της σύγχρονης ψηφιακής σχεδίασης χρησιμοποιεί αυτές τις γλώσσες. Οι περισσότερες σχεδιάσεις αρχίζουν σαν ένα σύνολο απαιτήσεων ή ένα αρχιτεκτονικό διάγραμμα υψηλού επιπέδου. Οι δομές ελέγχου και αποφάσεων συχνά δημιουργούνται σε δοκιμαστικό στάδιο σαν διαγράμματα ροής (flowcharts) ή δίνονται σε κάποιον διορθωτή διαγραμμάτων καταστάσεων. Η διαδικασία συγγραφής μιας περιγραφής σε μια γλώσσα περιγραφής υλικού εξαρτάται σε σημαντικό βαθμό από τον τύπο του κυκλώματος και τις προτιμήσεις του σχεδιαστή όσον αφορά το στυλ προγραμματισμού. Η γλώσσα περιγραφής υλικόυ είναι απλά η γλώσσα στην οποία εκφράζονται οι απαιτήσεις, οι οποίες συχνά μπορεί να έχουν ξεκινήσει σαν μια αλγοριθμική περιγραφή όπως ένα μαθηματικό μοντέλο σε C++. Οι σχεδιαστές συχνά χρησιμοποιούν γλώσσες σεναρίων (όπως η Perl) για την αυτόματη δημιουργία επαναλαμβανόμενων δομών κυκλωμάτων στη γλώσσα περιγραφής υλικού. Υπάρχουν ειδικοί διορθωτές που προσφέρουν αυτόματη στοίχιση, χρωματισμό της σύνταξης και επέκταση μακροεντολών για τις δηλώσεις οντοτήτων, αρχιτεκτονικής και σημάτων.

Ο κώδικας σε γλώσσα περιγραφής υλικού υπόκειται στη συνέχεια σε έλεγχο (code review ή auditing). Κατά την προετοιμασία για σύνθεση, η περιγραφή σε γλώσσα περιγραφής υλικού δοκιμάζεται από κάποιους αυτόματους ελεγκτές, οι οποίοι αναφέρουν παρεκκλίσεις από κανόνες προγραμματισμού, εντοπίζουν αμφιλεγόμενες δομές κώδικα πριν αυτές προκαλέσουν προβλήματα, και αναζητούν συχνά λάθη λογικής κωδικοποίησης, όπως οι ξεχασμένες θύρες (dangling ports) ή οι βραχυκυκλωμένες έξοδοι (shorted outputs). Η διαδικασία αυτή βοηθά στην επίλυση λαθών πριν συντεθεί ο κώδικας.

Η σχεδίαση μέσω γλώσσας περιγραφής υλικού λήγει με το στάδιο της σύνθεσης. Όταν το εργαλείο σύνθεσης έχει αντιστοιχίσει την περιγραφή σε ένα σύνολο συνδέσεων πυλών, αυτό το σύνολο δίνεται στο τελικό στάδιο. Ανάλογα με την τεχνολογία που χρησιμοποιείται στην πράξη (FPGA, ASIC gate array, ASIC standard cell), οι γλώσσες περιγραφής υλικού μπορεί να έχουν σημαντικό ρόλο στη ροή αυτού του σταδίου ή όχι. Γενικά, καθώς η ροή της σχεδίασης προχωρά προς τη φυσική μορφή που θα υλοποιηθεί, η βάση δεδομένων της σχεδίασης γεμίζει με πληροφορίες που έχουν να κάνουν με την τεχνολογία που χρησιμοποιείται, οι οποίες δε μπορούν να εκφραστούν σε μια γενική γλώσσα περιγραφής υλικού. Τελικά, κατασκευάζεται ή προγραμματίζεται ένα ολοκληρωμένο κύκλωμα, έτοιμο για χρήση.

Προσομοίωση και αποσφαλμάτωση κώδικα σε γλώσσα περιγραφής υλικού
----------------------------------------------------------------

Κύριο λήμμα: Λογική προσομοίωση
Στη σχεδίαση μέσω γλώσσας περιγραφής υλικού είναι απαραίτητη η δυνατότητα προσομοίωσης των προγραμμάτων που γράφονται. Η προσομοίωση επιτρέπει σε μια περιγραφή μιας σχεδίασης (που ονομάζεται μοντέλο) να επαληθεύεται σχεδιαστικά, κάτι που αποτελεί κομβικό σημείο για την εγκυρότητα της ζητούμενης λειτουργίας (προδιαγραφής) της σχεδίασης σε σχέση με την υλοποίηση σε κώδικα γλώσσας περιγραφής υλικού. Επιτρέπει επίσης την εξερεύνηση της αρχιτεκτονικής. Ο μηχανικός μπορεί να πειραματιστεί με επιλογές στη σχεδίαση γράφοντας διάφορες παραλλαγές σε μια βασική σχεδίαση, και στη συνέχεια συγκρίνοντας τη συμπεριφορά τους στην προσομοίωση. Κατά αυτόν τον τρόπο, η προσομοίωση παίζει βασικό ρόλο σε μια επιτυχημένη σχεδίαση με γλώσσα περιγραφής υλικού.

Για την προσομοίωση ενός μοντέλου ο μηχανικός γράφει ένα καθολικό περιβάλλον προσομοίωσης (που αποκαλείται testbench). Ένα testbench περιλαμβάνει τουλάχιστον ένα στιγμιότυπο του μοντέλου (που αποκαλείται η συσκευή υπό δοκιμή ή DUT), δηλώσεις ακίδας (pin) ή σήματος (signal) για την είσοδο-έξοδο του μοντέλου, και μια κυματομορφή ρολογιού. Ο κώδικας ενός testbench οδηγείται από τα γεγονότα (event driven): ο μηχανικός γράφει εντολές σε γλώσσα περιγραφής υλικού για να υλοποιήσει ένα σήμα επαναφοράς που παράγεται από το testbench, για να υλοποιήσει συναλλαγές της διεπαφής (όπως η ανάγνωση ή η εγγραφή στο δίαυλο του υπολογιστή-host), και για να παρακολουθεί την έξοδο της DUT. Ένας προσομοιωτής είναι ένα πρόγραμμα που εκτελεί το testbench και διατηρεί ένα ρολόι προσομοιωτή, το οποίο είναι το βασικό σήμα αναφοράς για όλα τα γεγονότα στην προσομοίωση testbench. Τα γεγονότα συμβαίνουν μόνο τις στιγμές που ορίζονται από τη γλώσσα περιγραφής υλικού του testbench (όπως ένας διακόπτης επαναφοράς που έχει κωδικοποιηθεί στο testbench), ή όταν το μοντέλο αντιδρά σε ερεθίσματα και γεγονότα σκανδαλισμού (triggering events). Οι σύγχρονοι προσομοιωτές διαθέτουν πλήρη γραφική διεπαφή χρήστη, μαζί με εργαλεία αποσφαλμάτωσης. Τα τελευταία επιτρέπουν στον χρήστη να σταματά και να επανεκκινεί την προσομοίωση οποιαδήποτε στιγμή, να εισάγει σημεία διακοπής (breakpoints) του προσομοιωτή (ανεξάρτητα του αρχικού κώδικα) και να παρακολουθεί ή να τροποποιεί οποιοδήποτε στοιχείο στην ιεραρχία των μοντέλων της γλώσσας περιγραφής υλικού. Οι σύγχρονοι προσομοιωτές μπορούν επίσης να συνδέουν το περιβάλλον της γλώσσας με βιβλιοθήκες που έχουν μεταγλωττιστεί από τον χρήστη, μέσω μιας διεπαφής PLI/VHPI. Η σύνδεση εξαρτάται από το σύστημα που χρησιμοποιείται (Win32/Linux/SPARC), καθώς και ο προσομοιωτής και οι βιβλιοθήκες χρήστη μεταγλωττίζονται και συνδέονται εκτός του περιβάλλοντος της γλώσσας.

Η επαλήθευση της σχεδίασης είναι συχνά το πιο χρονοβόρο στάδιο της διαδικασίας της σχεδίασης, λόγω της σύνδεσης μεταξύ των λειτουργικών προδιαγραφών της συσκευής, της ερμηνείας των προδιαγραφών από τον σχεδιαστή, και της εκφραστικής δύναμης της γλώσσας περιγραφής υλικού. Το μεγαλύτερο μέρος των αρχικών σταδίων δοκιμών και αποσφαλμάτωσης (test/debug cycle) γίνεται στο περιβάλλον προσομοιωτή της γλώσσας περιγραφής υλικού, επειδή το αρχικό στάδιο της σχεδίασης υπόκειται σε συχνές και σημαντικές αλλαγές στο κύκλωμα. Μια περιγραφή υλικού μπορεί επίσης να υλοποιηθεί δοκιμαστικά σε υλικό - συχνά για αυτόν τον σκοπό χρησιμοποιούνται προγραμματιζόμενες λογικές συσκευές (programmable logic devices). Η δοκιμαστική υλοποίηση σε υλικό είναι πιο ακριβή από την προσομοίωση μέσω γλώσσας περιγραφής υλικού, αλλά προσφέρει πληροφορίες για τη συμπεριφορά της σχεδίασης σε πραγματικές συνθήκες. Η δοκιμαστική υλοποίηση είναι ο καλύτερος τρόπος να δοκιμαστούν οι διεπαφές με άλλες συσκευές υλικού. Ακόμα και όταν χρησιμοποιούνται αργά FPGA, προκύπτουν μικρότεροι χρόνοι προσομοίωσης σε σχέση με την απλή προσομοίωση σε γλώσσα περιγραφής υλικού.

Επαλήθευση σχεδίασης με γλώσσες περιγραφής υλικού
-------------------------------------------------

Κύριο λήμμα: Λειτουργική επαλήθευση
Ιστορικά, η επαλήθευση μιας σχεδίασης ήταν μια δύσκολη και επαναλαμβανόμενη διαδικασία που περιλάμβανε τη συγγραφή και την προσομοίωση περιπτώσεων ελέγχου (test cases) για τη σχεδίαση υπό δοκιμή. Καθώς οι σχεδιάσεις των τσιπ γίνονταν όλο και πιο μεγάλες και πολύπλοκες, το έργο της επαλήθευσης της σχεδίασης έγινε τέτοιο που πια κυριαρχεί στο συνολικό έργο μιας ομάδας σχεδίασης. Η βιομηχανία αυτοματοποίησης ηλεκτρονικών σχεδιάσεων (Electronic design automation, EDA), προσπαθώντας να βελτιώσει την παραγωγικότητα της σχεδίασης, ανέπτυξε τη Γλώσσα Προδιαγραφών Ιδιοτήτων (Property Specification Language).

Με όρους τυπικής επαλήθευσης, μια ιδιότητα είναι μια πρόταση σχετικά με την αναμενόμενη ή υποτιθέμενη συμπεριφορά ενός αντικειμένου. Ιδανικά, για μια περιγραφή υλικού, μια ή περισσότερες ιδιότητες μπορούν να αποδειχτούν αληθείς ή ψευδείς με τη χρήση τυπικών μαθηματικών μεθόδων. Στην πράξη πολλές ιδιότητες δε μπορούν να αποδειχτούν γιατί ανήκουν σε μη φραγμένο χώρο λύσεων. Όμως, αν δοθούν κάποιες υποθέσεις σχετικά με τη λειτουργία, ή περιορισμοί, ένας ελεγκτής ιδιοτήτων (όπως ένας ελεγκτής μοντέλων) μπορεί να αποδείξει την ορθότητα (ή το αντίστροφο) πολλών ιδιοτήτων, σε έναν περιορισμένο χώρο λύσεων.

Οι υποθέσεις αυτές δεν μοντελοποιούν τις ενέργειες του κυκλώματος αλλά καταγράφουν και τεκμηριώνουν την «πρόθεση του σχεδιαστή» όσον αφορά τον κώδικα περιγραφής υλικού. Σε ένα περιβάλλον προσομοίωσης, ο προσομοιωτής επαληθεύει όλες τις υποθέσεις που δίνονται και εντοπίζει όλα τα σημεία που τις παραβιάζουν. Σε ένα περιβάλλον σύνθεσης, η πολιτική του εργαλείου σύνθεσης συχνά είναι να σταματά όταν παραβιαστεί οποιαδήποτε ιδιότητα. Η επαλήθευση με βάση αυτές τις ιδιότητες αναπτύσσεται και χρησιμοποιείται όλο και περισσότερο σαν εργαλείο στη σχεδίαση μέσω γλωσσών περιγραφής υλικού.

Γλώσσες περιγραφής υλικού και γλώσσες προγραμματισμού
-----------------------------------------------------

Μια γλώσσα περιγραφής υλικού μοιάζει με μια γλώσσα προγραμματισμού λογισμικού, αλλά υπάρχουν κάποιες σημαντικές διαφορές. Πολλές γλώσσες προγραμματισμού είναι ακολουθιακές (εκτελώντας τον κώδικα σε ένα νήμα), με περιορισμένη συντακτική και σημασιολογική υποστήριξη για ταυτοχρονισμό (concurrency). Αντίθετα, οι γλώσσες περιγραφής υλικού μοιάζουν με τις γλώσσες ταυτόχρονου προγραμματισμού (concurrent programming) όσον αφορά τη δυνατότητά τους να μοντελοποιούν πολλές παράλληλες διεργασίες (όπως τα φλιπ-φλοπ και οι αθροιστές), οι οποίες εκτελούνται ανεξάρτητα η μία από την άλλη. Οποιαδήποτε αλλαγή στην είσοδο μιας διεργασίας ενημερώνει αυτόματα στη στοίβα των διεργασιών του προσομοιωτή. Και οι γλώσσες περιγραφής υλικού και οι γλώσσες προγραμματισμού περνούν από έναν μεταγλωττιστή (στις γλώσσες της πρώτης κατηγορίας ονομάζεται και εργαλείο σύνθεσης ή synthesizer), αλλά έχουν διαφορετικούς σκοπούς. Στις γλώσσες περιγραφής υλικού ο μεταγλωττιστής αναφέρεται στη διαδικασία της σύνθεσης που μετατρέπει τον κώδικα περιγραφής υλικού σε μια λίστα συνδέσεων πυλών που μπορεί να υλοποιηθεί στην πράξη. Η έξοδος σε λίστα συνδέσεων μπορεί να έχει πολλές μορφές: μια λίστα συνδέσεων "προσομοίωσης" με πληροφορίες καθυστέρησης πύλης (gate-delay), μια τελική λίστα συνδέσεων για το στάδιο μετά τη σύνθεση (place and route), ή την πρότυπη μορφή EDIF που ακολουθείται στη βιομηχανία (για μετατροπή σε αρχείο τύπου JEDEC στη συνέχεια).

Σε αντιδιαστολή με τη διαδικασία σύνθεσης, ένας μεταγλωττιστής λογισμικού μετατρέπει τον πηγαίο κώδικα στην είσοδό του σε αντικειμενικό κώδικα που αναλογεί σε κάποιον συγκεκριμένο μικροεπεξεργαστή, για εκτέλεση σε αυτόν. Η διαχωριστική γραμμή όμως μεταξύ γλωσσών περιγραφής υλικού και γλωσσών προγραμματισμού δεν είναι ξεκάθαρη γιατί οι δύο τύποι γλωσσών μοιράζονται ιδέες και χαρακτηριστικά. Οι καθαρές γλώσσες περιγραφής υλικού όμως δεν είναι κατάλληλες για ανάπτυξη λογισμικού γενικής χρήσης, ενώ και οι γλώσσες προγραμματισμού γενικής χρήσης δεν είναι καλή επιλογή για τη μοντελοποίηση υλικού. Καθώς όμως τα ηλεκτρονικά συστήματα γίνονται όλο και πιο πολύπλοκα και τα συστήματα που μπορούν να ρυθμιστούν πάλι (reconfigurable systems) γίνονται πιο δημοφιλή, εμφανίζεται μια τάση στη βιομηχανία να βρεθεί μια κοινή γλώσσα που να μπορεί να κάνει κάποιες εργασίες σχεδίασης υλικού και προγραμματισμού λογισμικού. Ένα παράδειγμα είναι η SystemC που μπορεί να μοντελοποιήσει ένα ενσωματωμένο υλικό συστήματος (embedded system hardware) σαν αρχιτεκτονικές μονάδες (blocks) χωρίς λεπτομέρειες, δηλαδή σαν μαύρα κουτιά με μοντελοποιημένες εισόδους και εξόδους σήματος. Η εφαρμογή γράφεται σε C/C++ και μεταγλωττίζεται σε κώδικα μηχανής για το σύστημα ανάπτυξης (αντί να στοχεύει στην ενσωματωμένη CPU, που θα απαιτούσε να προσομοιωθεί η συμπεριφορά της από το σύστημα). Το υψηλό επίπεδο αφαίρεσης των μοντέλων του SystemC είναι κατάλληλο για αρχικές εξερευνήσεις στην αρχιτεκτονική, καθώς οι αρχιτεκτονικές αλλαγές μπορούν να δοκιμαστούν χωρίς να χρειάζεται υλοποίηση στο επίπεδο του σήματος. Το μοντέλο νημάτων όμως που χρησιμοποιείται στο SystemC και το γεγονός ότι βασίζεται στην κοινή μνήμη, σημαίνουν ότι δεν μπορεί να χειριστεί καλά την παράλληλη εκτέλεση ή μοντέλα χαμηλότερου επιπέδου.

Για να μειωθεί η πολυπλοκότητα της σχεδίασης των γλωσσών περιγραφής υλικού, που έχει παρομοιαστεί με αυτή των συμβολικών γλωσσών, έχουν γίνει προσπάθειες να αυξηθεί το επίπεδο της αφαίρεσης στη σχεδίαση. Εταιρείες όπως η Cadence, η Synopsys και η Agility Design Solutions προβάλλουν την SystemC σαν έναν τρόπο να συνδυαστούν οι γλώσσες υψηλού επιπέδου με τα μοντέλα ταυτοχρονισμού, ώστε να είναι πιο γρήγοροι οι κύκλοι σχεδίασης των FPGA σε σχέση με τις παραδοσιακές γλώσσες περιγραφής υλικού. Κάποιες προσπάθειες που βασίζονται στη C ή στη C++ (με βιβλιοθήκες ή άλλες επεκτάσεις που επιτρέπουν τον παράλληλο προγραμματισμό) είναι τα εργαλεία της Catapult C της Mentor Graphics, τα εργαλεία της Impulse C της Impulse Accelerated Technologies, καθώς και τα εργαλεία ελεύθερου λογισμικού ROCCC 2.0 από την Jacquard Computing Inc. Το CoreFire Design Suite της Annapolis Micro Systems, Inc. και το LabVIEW FPGA της National Instruments παρέχουν έναν τρόπο σχεδίασης υψηλού επιπέδου σύμφωνα με τις αρχές της ροής δεδομένων (dataflow). Γλώσσες όπως η SystemVerilog, η SystemVHDL και η Handel-C προσπαθούν να πετύχουν το ίδιο, αλλά σκοπός του είναι περισσότερο να αυξήσουν την παραγωγικότητα των μηχανικών και όχι να τους επιτρέψουν να χρησιμοποιήσουν FPGA.

Γλώσσες
-------

### Σχεδίαση αναλογικών κυκλωμάτων

|  |  |  |
| --- | --- | --- |
| Συντομογραφία | Ονομασία | Χρήση |
| AHDL | Analog Hardware Descriptive Language (HDL) | ανοικτή γλώσσα περιγραφής αναλογικού υλικού |
| SpectreHDL | SpectreHDL | γλώσσα περιγραφής αναλογικού υλικού |
| Verilog-AMS | Verilog for Analog and Mixed-Signal | ανοικτό πρότυπο που επεκτείνει τη Verilog για την προσομοίωση αναλογικών και μεικτών αναλογικών/ψηφιακών συστημάτων |
| HDL-ATM | HDL-A | γλώσσα περιγραφής αναλογικού υλικού |

### Σχεδίαση ψηφιακών κυκλωμάτων

Οι δύο γλώσσες περιγραφής υλικού που χρησιμοποιούνται και υποστηρίζονται περισσότερο στη βιομηχανία σχεδίασης υλικού είναι η Verilog και η VHDL.

|  |  |  |
| --- | --- | --- |
| Συντομογραφία | Όνομα | Σημείωση |
| ABEL | Advanced Boolean Expression Language |  |
| AHDL | Altera HDL | γλώσσα περιγραφής υλικού από την Altera |
| AHPL | A Hardware Programing language |  |
| Bluespec |  | γλώσσα περιγραφής υλικού υψηλού επιπέδου που βασίζεται στη Haskell, έχει σύνταξη σαν τη SystemVerilog |
| C-to-Verilog Αρχειοθετήθηκε 2019-08-24 στο Wayback Machine. |  | μετατροπέας από C σε Verilog |
| Confluence |  | συναρτησιακή γλώσσα περιγραφής υλικού - δεν αναπτύσσεται πια |
| CoWareC |  | γλώσσα περιγραφής υλικού βασισμένη στη C από την CoWare - δεν αναπτύσσεται πια, θεωρείται ότι αντικαθίσταται από τη SystemC |
| CUPL | Universal Compiler for Programmable Logic  | γλώσσα της Logical Devices, Inc. |
| ELLA |  | δεν χρησιμοποιείται πια |
| ESys.net |  | πλαίσιο προγραμματισμού .net, γραμμένο σε C# |
| Handel-C |  | γλώσσα σχεδίασης που μοιάζει με τη C |
| HJJ | Hardware Join Java | βασίζεται στη Join Java |
| HML |  | βασίζεται στη SML |
| Hydra |  | βασίζεται στη Haskell |
| Impulse C | γλώσσα περιγραφής υλικού που μοιάζει με τη C |
| ParC | Parallel C++ | C++ με επεκτάσεις νημάτων και επικοινωνίας για παράλληλο προγραμματισμό με βάση τις εργασίες (task-parallel programming), στο στυλ γλωσσών περιγραφής υλικού |
| JHDL |  | βασίζεται στη Java |
| Lava Αρχειοθετήθηκε 2011-07-27 στο Wayback Machine. |  | βασίζεται στη Haskell |
| Lola |  | απλή γλώσσα για εκπαιδευτικούς σκοπούς |
| M |  | γλώσσα περιγραφής υλικού από την Mentor Graphics |
| MyHDL |  | βασίζεται στην Python |
| PALASM |  | για συσκευές Programmable Array Logic (PAL) |
| ROCCC 2.0 | Riverside Optimizing Compiler for Configurable Computing | Ελεύθερο εργαλείο μετατροπής από C σε HDL |
| RHDL |  | βασισμένη στη Ruby |
| Ruby (γλώσσα περιγραφής υλικού) |  |  |
| SystemC |  | πρότυπη κλάση από βιβλιοθήκες της C++ για μοντελοποίηση σε υψηλό επίπεδο της συμπεριφοράς και των συναλλαγών του ψηφιακού υλικού σε υωψηλό επίπεδο αφαίρεσης (επίπεδο συστήματος) |
| SystemVerilog |  | υπερσύνολο της Verilog, με βελτιώσεις που αντιμετωπίζουν τη σχεδίαση και την επαλήθευση σε επίπεδο συστήματος |
| SystemTCL |  | SDL που βασίζεται στην Tcl |
| Verilog |  | από τις πιο διαδεδομένες γλώσσες περιγραφής υλικού |
| VHDL | VHSIC HDL | από τις πιο διαδεδομένες γλώσσες περιγραφής υλικού |

Δείτε επίσης
------------

* Γλώσσα προδιαγραφών
* Γλώσσα μοντελοποίησης
* Γλώσσα επαλήθευσης υλικού
* SystemC
* SystemVerilog
* Property Specification Language
* OpenVera
* Bluespec

Παραπομπές
----------

1. ↑  Barbacci, M. "The ISPS Computer Description Language," Carnegie-Mellon Univ. Dept. of Computer Science, 1977
2. ↑  J. Mermet (editor): Fundamentals and Standards in Hardware Description Languages (Springer Verlag, 1993)
3. ↑  Eurich, J.P. and Roth, G. (1990): "EDIF grows up". IEEE Spectrum, Vol. 27, Issue 11, pp. 68 - 72.

Εξωτερικοί σύνδεσμοι
--------------------

* Verilog-AMS Technical Subcommittee (Αγγλικά)