Seite 1 von 1

ACS/Verilog Frage

Verfasst: 29. Jan 2007 13:26
von Herrzattacke
Nehmen wir mal an, dass ich folgendes auf der RCU in meinem ACS berechnen will.

X = A + B;
und
X = A - B;

Dann würde ich das folgendermaßen machen:

Code: Alles auswählen

module user ...

reg[31:0] A,B; // bin mir nicht sicher ob das geht, aber semantisch sollte klar sein was gemeint ist.
reg[31:0] result;

assign DATAOUT = result;

always @(DATAIN) begin
    if ( ADDRESS == 32'b0) begin
        A <= DATAIN;
    end else if ( ADDRESS == 32'b1 ) begin
        B <= DATAIN;
    end
end

always @(posedge CLK or posedge RESET) begin
    if ( RESET ) begin
        result <= 32'hF000AFFE;
    end else if ( ADRESSED & ~WRITE ) begin
        if ( ADDRESS == 32'b0 ) begin
            result <= A + B;
        end else begin
            result <= A - B;
        end
    end
end

endmodule
Kann man das so machen oder gibt es da nochwas besseres?

Die Fälle, das A und B nicht initialisiert sind kann ich ignorieren, wenn ich die RCU aus dem C Programm immer richtig benutze? Oder muss ich beim Reset A und B z.B. auf Null setzen?

Die Zuweisung von "result" wurde in den Folien immer beim schreiben der Variablen gemacht. Kann ich das so wie hier auch beim lesen machen? Oder lese ich dann das alte Datum?

Verfasst: 29. Jan 2007 14:58
von A380

Code: Alles auswählen

always @(DATAIN) begin
    if ( ADDRESS == 32'b0) begin
        A <= DATAIN;
        B<=B;
    end else if ( ADDRESS == 32'b1 ) begin
        B <= DATAIN;
        A<=A;
    end
end
Ich würde ihm sicherheitshalber noch deutlich sagen das er den jeweils anderen Wert halten soll (kann sein das es überflüssig ist)

Wahrscheinlich wäre es auch besser die Daten an einer Taktflanke zu lesen?

Das Problem bei deinem Code dürfte sein: Dauert die Berechnung sehr lange, liest du evtl. einen falschen Wert. (von der Softwareseite)
Andererseits hat man mit der Methode im Skript eigentlich das gleiche Problem, nur dort früher, beim Übernehmen der Daten.
Bei kleinen Berechnungen macht das sicherlich nichts aus, vor allem nicht beim Bits umdrehen ;)

Re: ACS/Verilog Frage

Verfasst: 30. Jan 2007 12:45
von NedFlanders84
Ist vlt. etwas spät, aber hier meine Ideen dazu:
Herrzattacke hat geschrieben:
Die Zuweisung von "result" wurde in den Folien immer beim schreiben der Variablen gemacht. Kann ich das so wie hier auch beim lesen machen? Oder lese ich dann das alte Datum?
Ich denke, dass es auch so geht, da du die Daten ja immer bei Änderungen am DataIn schon mal zwischen speicherst. Allerdings wenn du es erst beim Lesen zuweist, muss man vlt. noch ein wenig Wartezeit einrechnen, bis die Registerwerte von Reserved auf Result zugewiesen wurden.
Wenn man das beim WRITE macht geht man ja davon aus, dass die Daten irgendwann mal wieder gelesen werden sollen. Und sind daher schon im Result vorgespeichert.

Gruß

Alex

Verfasst: 30. Jan 2007 13:28
von Herrzattacke
Das war ja gerade meine Vermutung.

Ich hab jetzt nochmal drüber nachgedacht und mir überlegt, dass man die Berechnungsverzögerung verschieben kann, wenn man bei jedem Schreibvorgang x=a+b und y=a-b speichert.
Dann kann man beim Lesevorgang direkt die Daten aus den internen Registern auf den Output legen, sprich in "result" speichern.

Verfasst: 30. Jan 2007 16:17
von koch
Dann kann man beim Lesevorgang direkt die Daten aus den internen Registern auf den Output legen, sprich in "result" speichern.
Das ist bei diesen sehr einfachen die RCUs die beste Vorgehensweise. Bei komplizierteren klappt das allerdings in der Tat nicht mehr (weil die Verzögerungen zu lang werden). Aber deutlich kompliziertere Fälle als der in der Vorlesung gezeigte werden auch in der Klausur nicht vorkommen :wink: