home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Frozen Fish 1: Amiga
/
FrozenFish-Apr94.iso
/
bbs
/
alib
/
d2xx
/
d229
/
sim.lha
/
Sim
/
german.docs
/
xdc.Doc
< prev
next >
Wrap
Text File
|
1989-07-20
|
13KB
|
538 lines
XDC - External Device Compiler - und
DDL - Device Definition Language
Inhaltsverzeichnis:
1 Einführung
2 Externe Bausteine
2.1 Schaltnetze
2.2 ungetaktete Schaltwerke
2.3 getaktete Schaltwerke
3 Beschreibung des XDC und der DDL
3.1 Aufruf des XDC
3.2 Syntax der DDL
3.2.1 Schlüsselworte
3.2.2 Syntaxdiagramme
4 Fehlermeldungen
5 Danksagung
1 Einführung
Der XDC und die DDL erlauben es für den Register-Transfer-Netz-
Simulator Sim (ab V4.0) externe Bausteine zu definieren. Damit läßt
der Umfang der simulierbaren Hardwarebauteile nahezu beliebig stei-
gern. Außerdem kann mit externen Bausteinen die Simulationsgeschwin-
digkeit erhöht werden, wenn Teile eines Register-Transfer-Netzes zu
komplexeren Komponenten zusammengefaßt werden. Die DDL ermöglicht
die Simulation von Schaltnetzen, getakteten sowie ungetakteten Schalt-
werken.
2 Externe Bausteine
Grundsätzlich ist die Definition jedes beliebigen Baustein möglich.
Bei getakteten Schaltwerken muß jedoch die Tatsache beachtet werden,
daß die Bausteine sequentiell bearbeitet werden (siehe 2.3).
2.1 Schaltnetze
Beispiel für einen AND-Baustein mit vier Eingängen:
device x_and;
input in1,in2,in3,in4;
output out;
{
out = in1 & in2 & in3 & in4;
}
2.2 Ungetaktete Schaltwerke
Beispiel für einen ungetakteten Automaten:
Automatengraph:
___ ___
+--- / \ 1/0 / \ ---+
0/0 | | 0 | --------------> | 1 | | 1/0
+--> \___/ \___/ <--+
A |
| |
0/0 | | 0/0
| |
| V
___ ___
+--- / \ 1/1 / \ ---+
1/1 | | 3 | <-------------- | 2 | | 0/0
+--> \___/ \___/ <--+
Definition:
device auto;
input in;
output out;
state s;
{
switch (s) {
case 0:
if (in & 1)
s = 1;
break;
case 1:
if (~in & 1)
s = 2;
break;
case 2:
if (in & 1) {
s = 3;
out = 1;
}
break;
case 3:
if (~in & 1) {
s = 0;
out = 0;
}
break;
}
}
2.3 Getaktete Schaltwerke
Bei getakteten Schaltwerken müssen die Werte auf den Eingangsleitun-
gen gepuffert werden. Aufgrund der Zwangssequentialisierung der Bau-
steine darf der Eingang nicht direkt dem Ausgang zugewiesen werden,
da sonst ein zweites Register, das am Ausgangs des ersten angeschlos-
sen ist, schon den neuen, aber falschen Wert lesen würde.
Beispiel für ein vorderflankengetaktetes D-Register:
device x_reg;
input c,d;
output q;
state s;
{
if (c & 1)
q = s;
else
s = d;
}
3 Beschreibung des XDC und der DDL
Der XDC erzeugt aus der Bausteindefinition C-Quellcode, der dann
compiliert werden kann. Getestet wurde bisher nur der AZTEC-Compiler
V3.6a getestet. Allgemein gesagt, muß Code erzeugt werden, der 16-Bit-
Integer mit LARGE DATA (+D) verwendet. Für den LATTICE-Compiler müßte
die Datei xcomp entsprechend angepaßt werden.
3.1 Aufruf des XDC
Zur Verwendung des XDC muß ein AZTEC Compiler und Linker vorhanden
sein. Im gleichen Verzeichnis, in dem der XDC liegt, müssen folgende
Dateien verfügbar sein: xcomp, sim.h, sim_msg.h
Der XDC wird folgendermaßen gestartet:
Execute xcomp <device>
Die Datei, die die Bausteindefinition enthält, muß den Namen
<device>.x haben. .x darf aber beim Aufruf nicht mit angegeben wer-
den.
Durch xcomp wird eine Datei <device> erzeugt. Diese stellt den neuen
externen Baustein dar, d.h. es kann ein neuer Baustein <device> in
einer Verschaltungsliste verwendet werden. Die Ein- und Ausgangslei-
tungsnamen müssen dann in der Reihenfolge ihrer Definition angegeben
werden. Die Datei <device> muß dazu evtl. in das Verzeichnis kopiert
werden, das den Simulator enthält.
3.2 Syntax der DDL
3.2.1 Schlüsselworte
In der DDL existieren folgende Schlüsselworte:
BREAK CASE DEFAULT DEVICE ELSE
IF INPUT OUTPUT STATE SWITCH
Die Schlüsselworte können groß oder klein (auch gemischt) geschrie-
ben werden.
3.2.2 Syntaxdiagramme
file:
--> device_definition -->
device_definition:
--> DEVICE --> identifier --> ';' --> declaration_list --+
|
+------------------------<---------------------------+
|
+--> '{' --> statement_list --> '}' -->
comment:
--> '/*' ---+----------------+--> '*/' -->
A |
+-- character <--+
declaration_list:
--> input_declaration_list --> output_declaration_list --+
|
+-------------------------<--------------------------+
|
+--> state_declaration_list --+-->
| A
+--------------->-------------+
input_declaration_list:
--+--> input_declaration --+-->
A |
+------------<-----------+
input_declaration:
--> INPUT --> identifier_list --> ';' -->
output_declaration_list:
--+--> output_declaration --+-->
A |
+-------------<-----------+
output_declaration:
--> OUTPUT --> identifier_list --> ';' -->
state_declaration_list:
--+--> state_declaration --+-->
A |
+------------<-----------+
state_declaration:
--> STATE --> identifier_list --> ';' -->
identifier_list:
--+--> identifier --+-->
A |
+------ ',' <-----+
identifier:
--> letter --+------->------+-->
A |
+<-- letter <--+
| |
+---- digit <--+
letter:
--+--> 'A' ---+-->
| . A
| . |
| |
+--> 'Z' -->+
| |
+--> 'a' -->+
| . |
| . |
| |
+--> 'z' -->+
| |
+--> '_' ---+
digit:
--+--> '0' --+-->
| . A
| . |
| |
+--> '9' --+
statement_list:
--+--> statement --+-->
A |
+--------<-------+
statement:
--+--> switch_statement ------>+-->
| A
+--> if_statement ---------->+
| |
+--> assignment_statement -->+
| |
+----------> ';' ------------+
assignment_statement:
--> identifier --> '=' --> expression --> ';' -->
expression:
--+--> expression -------------------------------+-->
| A
+--> '~' --> expression ---------------------->+
| |
+--> constant -------------------------------->+
| |
+--> identifier ------------------------------>+
| |
+--> '(' --> expression --> ')' -------------->+
| |
+--> expression --> operator --> expression ---+
operator:
--+--> '>' --->+-->
| A
+--> '<' --->+
| |
+--> '>=' -->+
| |
+--> '<=' -->+
| |
+--> '==' -->+
| |
+--> '!=' -->+
| |
+--> '&' --->+
| |
+--> '|' --->+
| |
+--> '^' --->+
| |
+--> '+' --->+
| |
+--> '-' --->+
| |
+--> '>>' -->+
| |
+--> '<<' ---+
if_statement:
--> IF --> '(' --> expression --> ')' --> if_else_statement_list--+
|
+-----------------------------<-------------------------------+
|
+--> ELSE --> if_else_statement --+-->
| A
+----------------->---------------+
if_else_statement_list:
--+--> statement -----------------------+-->
| A
+--> '{' --> statement_list --> '}' --+
switch_statement:
--> SWITCH --> '(' --> expression --> ')' --> switch_statement_list -->
switch_statement_list:
--> '{' --+--> case_statment --+---+--> default_statement --+--> '}' -->
A | | A
+----------<---------+ +------------>-----------+
case_statement:
--> CASE --> constant --> ':' --+--> statement_list --+--+
| A |
+---------->----------+ |
|
+--------------------------<-------------------------+
|
+--> BREAK --> ';' --+-->
| A
+--------------------+
default_statement:
--> DEFAULT --> ':' --+--> statement_list --+---+--> BREAK --+-->
| A | A
+---------->----------+ +------>-----+
constant:
--+--> hexadecimal_constant --+-->
| A
+--> decimal_constant-------+
hexadecimal_constant:
+----------<---------+
V |
--+--> '0x' --+---+---+--> digit --+---+-->
| A | A
+--> '0X' --+ +--> 'A' --->+
| . |
| . |
| |
+--> 'F' --->+
| |
+--> 'a' --->+
| . |
| . |
| |
+--> 'f' ----+
decimal_constant:
--+--> '0' -----------------------------+-->
| A
+--> positive_digit --+--> digit --+--+
A |
+------<-----+
positive_digit:
--+--> '1' --+-->
| . A
| . |
| |
+--> '9' --+
4 Fehlermeldungen
Es gibt drei Fehlerklassen:
a) parse error ohne nähere Beschreibung
b) parse error mit näherer Beschreibung
'=' expected
'(' expected
')' expected
'{' expected
'}' expected
';' expected
':' expected
constant expected
lead name expected
c) semantische Fehler
BREAK outside of SWITCH
CASE outside of SWITCH
DEFAULT outside of SWITCH
no CASE behind DEFAULT
missing CASE
duplicate CASE
duplicate DEFAULT
already defined lead name
undefined lead
device name differs from file name
no memory
Fehler sollten immer vom Anfang zum Ende hin korrigiert werden, da
dann viele Folgefehler mit beseitigt werden. Folgefehler treten über-
wiegend auf bei den Klassen a) und b), sehr selten dagegen bei c).
5 Danksagung
Mein Dank gebührt Klaus-Dieter Renner, dessen Idee und Erstellung
eines Register-Transfer-Netz-Simulators und einer Baustein-Defini-
tions-Sprache die Anregung zu meinen Programmen gab und Michael Koch
für die ausführlichen Tests und seine Verbesserungs- und Erweiterungs-
vorschläge.