Klausuraufgabe 2 WiSe 2019/20

  • Hi,

    es ist zwar recht spät, und ich hoffe, dass du mittlerweile schon selbst weiter gekommen bist, aber falls nicht:


    Im Modul "test" (der Testbench):

    ist zunächst die Zeile

    Code
    1. m dut(c,b,a,r,out );

    von Bedeutung. Hier wird ein Modul von der Sorte m, wie es weiter oben im Code beschrieben wurde, in der Testbench eingebaut und dut genannt (man versteht Verilog wirklich am Besten, wenn man sich dabei immer die Hardware vorstellt, die es beschreibt). Das "m-Modul" sieht in dem Code so aus:

    Der "Trick" an der Aufgabe, wenn man von einem solchen sprechen kann, ist, dass nach den Signalen des Moduls "dut" gefragt wird. Beachte die Reihenfolge der Eingänge. Die Testbench hat die vier Anschlüsse a, b, c und r, die man in die Eingänge des zu testenden Moduls stecken kann. Das werden sie aber nicht in dieser Reihenfolge, sondern in der Reihenfolge c, b, a, r, wie man in der Zeile ganz oben sehen kann. Der Anschluss a der Testbench wird also mit dem Eingang c des Moduls dut verbunden und der Anschluss c mit dem Eingang a! (b wird aber, wie man es erwarten würde, mit b verbunden, und r mit r) Zeichnen soll man die Signale innerhalb von dut. Du musst also gucken, welchen Verlauf die Signale in der Testbench haben, und diesen aufzeichnen - aber a und c vertauschen.


    Beim Herleiten der Zwischensignale und Ausgänge von dut sieht es etwas anders aus. In dut sind zwei Module von der Sorte n namens n1 und n2 verbaut:

    Code
    1. module n(a,b,y);
    2.     input a;
    3.     input b;
    4.     output reg y;
    5.     always @(a,b) begin
    6.         if (a>b) y = #2 1;
    7.         else y = #2 0;
    8.     end
    9. endmodule

    Diese haben für sich auch wieder zwei Eingänge namens a und b. Welche Signale von dut an diese angeschlossen werden, sieht man an der Implementierung: Es sind einmal b und c und einmal i und x. Aber! Wir wollen die Signalverläufe von dut, und deshalb interessiert uns für unsere Zeichnung, wie sich die Ausgänge von n1 und n2 verhalten. Denn daran sind wiederum die internen Leitungen i und j von unserem m-Modul dut angeschlossen, und deren Signalverläufe brauchen wir, sowohl zum Zeichnen, als auch um den Verlauf von x bestimmen zu können. Wir nehmen uns dann also den Code eines n-Moduls vor, und ersetzen die Namen der Signale mit denen der Signale von dut. Einmal für b, c und i und einmal für i, x und j. Immer die Reihenfolge beachten, denn diese bestimmt dann, welche der Signale Ein- und welche Ausgänge sind. Konkret würde dann aus dem relevanten Teil von n1:

    Code
    1.     always @(b,c) begin
    2.         if (b>c) i = #2 1;
    3.         else i = #2 0;
    4.    end

    Für unser Modul dut bedeutet das also, bei jeder Änderung von b oder c zu prüfen, ob b größer als c ist, und, wenn ja, i mit einer Verzögerung von zwei Zeiteinheiten auf 1 zu setzen, anderenfalls auf 0. Für n2 verfahren wir analog. Zusätzlich enthält das Modul dut natürlich auch noch einen eigenen sequentiellen Prozess, der nicht in einem separaten internen Modul läuft.

    Schließlich noch der zweite "Trick" dieser Aufgabe: In besagtem Prozess soll x ggf. auf den Wert von j gesetzt werden. Jetzt mag man sich fragen, wie das funktionieren soll, wenn j doch in dem internen Modul n2 bei jeder Änderung von x ebenfalls verändert werden soll. Aber da kommt die erwähnte Verzögerung im n-Modul zugute, die dafür sorgt, dass j sich immer erst etwas später ändert, und deswegen noch problemlos von dem sequentiellen Prozess ausgewertet werden kann.


    Das war jetzt sehr ausführlich, und ich habe bestimmt einiges erklärt, was du schon weißt, aber vielleicht wird ja in einem anderen Semester jemand anderes auch Fragen zu dieser Aufgabe haben (die Probeklausur ist ja immer die gleiche). Falls noch welche offen sind, ich gucke morgen vormittag hier noch mal rein.

  • Hier noch mal eine Skizze fürs Verständnis. Zu sehen ist der innere Aufbau des Moduls dut, das an die Testbench (deutsch: Prüfstand) angeschlossen ist. SL steht für den Abschnitt sequentieller Logik im Modul. Wie gesagt - ich zitiere hier auch die Autoren des Buches, an dem sich die Vorlesung orientiert - macht nicht den Fehler, an Verilog (oder auch VHDL) wie an eine Programmiersprache ranzugehen! Das ist Hardware, die hier beschrieben wird! Stellt euch die einzelnen Teile mit ihren Anschlüssen und den Leitungen dazwischen vor, dann versteht ihr auch diesen Code...


    Jetzt wünsche ich aber erst mal allen viel Erfolg morgen Nachmittag!