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

Στη μηχανική υπολογιστών, μια γλώσσα περιγραφής υλικού (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/O κυκλοφόρησε τη γλώσσα περιγραφή υλικού 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), οι γλώσσες περιγραφής υλικού μπορεί να έχουν σημαντικό ρόλο στη ροή αυτού του σταδίου ή όχι. Γενικά, καθώς η ροή της σχεδίασης προχωρά προς τη φυσική μορφή που θα υλοποιηθεί, η βάση δεδομένων της σχεδίασης γεμίζει με πληροφορίες που έχουν να κάνουν με την τεχνολογία που χρησιμοποιείται, οι οποίες δε μπορούν να εκφραστούν σε μια γενική γλώσσα περιγραφής υλικού. Τελικά, κατασκευάζεται ή προγραμματίζεται ένα ολοκληρωμένο κύκλωμα, έτοιμο για χρήση.

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

Μια γλώσσα περιγραφής υλικού μοιάζει με μια γλώσσα προγραμματισμού λογισμικού, αλλά υπάρχουν κάποιες σημαντικές διαφορές. Πολλές γλώσσες προγραμματισμού είναι ακολουθιακές (εκτελώντας τον κώδικα σε ένα νήμα), με περιορισμένη συντακτική και σημασιολογική υποστήριξη για ταυτοχρονισμό (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.