Provisos

mProg
BASIC-Programmierer
BASIC-Programmierer
Beiträge: 147
Registriert: 25. Apr 2015 00:10

Provisos

Beitrag von mProg » 19. Feb 2017 13:56

Etwas verstehe ich an Privosis nicht. Wir haben den folgenden Code:

Code: Alles auswählen

module mkPlainReg( Reg#(tx) ) provisos(Bits#(tx,szTX));
Reg#(tx) val <- mkRegU;
return val;
endmodule
Gleichzeitig wird im Bluespec by Reference gesagt:
provisos (Bits#(macAddress, 48))
can be read literally as saying that the types macAddress and 48 are in the Bits type class, or
can be read more generally as saying that values of type macAddress can be converted to and from
values of the type bit[47:0] using the pack and unpack overloaded functions of type class Bits.
Daraus folgt (falls ich es richtig verstanden habe), dass tx von oder in bit[szTx:0] umgewandelt werden. Jedoch ist in dem Beispiel (Bluespec by reference) szTX gar nicht definiert.
Was bedeutet dann szTX hier?

Fabian Czappa
Mausschubser
Mausschubser
Beiträge: 44
Registriert: 10. Mai 2015 11:45

Re: Provisos

Beitrag von Fabian Czappa » 19. Feb 2017 14:03

Hay,

szTX ist die Abkürzung für sizeTX, was nur ein unter-spezifizierter Wert ist.
Ähnlich dem Add#(a, some_useless_val, b). Das muss gefüllt werden & eigentlich ist ja klar, wie viele Bits tx braucht (mehr oder weniger).

Kleiner Schönheitsfehler: tx kann in bit[szTX-1 : 0] repräsentiert werden, da ja hier die 0 inklusive ist, szTX aber die 0 als solche nicht mit zählt.

Viele Grüße
Fabian

mProg
BASIC-Programmierer
BASIC-Programmierer
Beiträge: 147
Registriert: 25. Apr 2015 00:10

Re: Provisos

Beitrag von mProg » 19. Feb 2017 14:15

Fabian, ich weiß nicht, ob ich deine Antwort richtig verstanden habe:
Du sagst szTx ist eine Abkürzung für sizeTX. Aber sizeTX ist ja auch nicht definiert. In dem ganzen Code (Bluespec by Example A.8.2) ist keines von beiden definiert. Ich hatte bis jetzt so verstanden, dass Provisos soetwas wie Constraints für die Typen sind, die wir in unsere Module und Funktionen verwenden wollen.
Hier ist die Bedingung zum Beispiel dass tx eine Instanz der TypKlasse Bits sein muss. Jedoch würde ja dazu noch eingegeben, dass es eine Größe von szTx( also tx[0:szTx-1]) haben muss. Aber wie kann es eine Größe von szTx haben, wenn szTx gar nicht definiert ist?
Was verstehe ich hier falsch?

bekir
Mausschubser
Mausschubser
Beiträge: 61
Registriert: 16. Okt 2014 20:35

Re: Provisos

Beitrag von bekir » 19. Feb 2017 14:22

mProg hat geschrieben:Fabian, ich weiß nicht, ob ich deine Antwort richtig verstanden habe:
Du sagst szTx ist eine Abkürzung für sizeTX. Aber sizeTX ist ja auch nicht definiert. In dem ganzen Code (Bluespec by Example A.8.2) ist keines von beiden definiert. Ich hatte bis jetzt so verstanden, dass Provisos soetwas wie Constraints für die Typen sind, die wir in unsere Module und Funktionen verwenden wollen.
Hier ist die Bedingung zum Beispiel dass tx eine Instanz der TypKlasse Bits sein muss. Jedoch würde ja dazu noch eingegeben, dass es eine Größe von szTx( also tx[0:szTx-1]) haben muss. Aber wie kann es eine Größe von szTx haben, wenn szTx gar nicht definiert ist?
Was verstehe ich hier falsch?
Ich glaube in dem Beispiel ist das egal. szTx könnte jede Anzahl von Bits sein. Es ist quasi nur eine Variable, damit du auf die Anzahl der Bits deines Typs zugreifen kannst, um bspw. in einer anderen Proviso darauf Einschränkungen zu definieren: z.B. Add#(szTx, unused, 64) -> szTx <= 64

JHofmann
Endlosschleifenbastler
Endlosschleifenbastler
Beiträge: 182
Registriert: 23. Apr 2015 10:43

Re: Provisos

Beitrag von JHofmann » 19. Feb 2017 14:25

Hallo,

genau, Provisos geben Constraints auf die Typen an. Allerdings kann der Compiler auch bestimmte Dinge errechnen. In diesem Fall kann er für Bits#(someType, sizeOfSomeType), 'sizeOfSomeType' selber bestimmen. Das ist dann nichts anderes als die Größe in Bits des Types 'someType'.

Der Type 'sizeOfSomeType' wird also durch den Compiler definiert. Wenn er dies nicht aus den gegebenen Informationen könnte würde es eine Fehlermeldung geben.

Viele Grüße,

Fabian Czappa
Mausschubser
Mausschubser
Beiträge: 44
Registriert: 10. Mai 2015 11:45

Re: Provisos

Beitrag von Fabian Czappa » 19. Feb 2017 14:27

Hay,

du verstehst das insofern 'falsch', als dass szTX nicht definiert sein muss. Dass sz für size steht, war nur ein Kommentar meinerseits, damit du verstehst, was das überhaupt darstellen soll. Und ja, provisos kannst du als Constraints interpretieren, die zu Compilefehlern führen, wenn sie nicht erfüllt sind.
Vgl. hierzu Hörsaalübung 5 bzw. in der Beispielaufgabe 4a. Dort wird aus dem numerischem Wert maxValue die Operandenbitbreite und die Ergebnisbitbreite berechnet, dazu soll sichergestellt werden, dass die Ergebnisbitbreite nicht größer als 64 ist. Das wird mit

Code: Alles auswählen

Add#(resultBits, someValue, 64)
gemacht. Dieses someValue ist hier nicht weiter, es existiert nur. Mathematisch betrachtet:
\(\exists x \geq 0: resultBits + x = 64\)

szTX, also die Größe (bitberechnet) von TX, ist hier nicht weiter angegeben, sie "existiert nur". Der Compiler rechnet das dann selbst aus, wenn ers kann. Gleichzeitig muss er aber wegen der Syntax enthalten sein.

Viele Grüße
Fabian

Fabian Czappa
Mausschubser
Mausschubser
Beiträge: 44
Registriert: 10. Mai 2015 11:45

Re: Provisos

Beitrag von Fabian Czappa » 19. Feb 2017 14:31

bekir hat geschrieben:[...] Ich glaube in dem Beispiel ist das egal. szTx könnte jede Anzahl von Bits sein. [...]
Hier nur zur Vollständigkeit (die Aussage ist ein wenig doppeldeutig):
szTX könnte jede Anzahl von Bits abhängig von tx sein. An sich muss bei gleichem tx ein gleicher Wert dort hinein, der Compiler kümmert sich nur darum.

mProg
BASIC-Programmierer
BASIC-Programmierer
Beiträge: 147
Registriert: 25. Apr 2015 00:10

Re: Provisos

Beitrag von mProg » 19. Feb 2017 14:31

Danke für die Antworten. Jetzt ist es vollkommen klar gewortden

Antworten

Zurück zu „Archiv“