2016-08-30 2 views
1

Wenn ich sowohl alwas_comb als auch always_ff in einem einzigen Modul habe, welches zuerst ausgeführt ?.Welcher Prozedurblock wurde zuerst in SystemVerilog ausgeführt?

zum Beispiel habe ich diesen Code in einem Buch gesehen, aber ich bin verwirrt über die Funktionalität. zum Beispiel, wenn WE = 0 was ist der Wert von Qout?

module SyncRAM #(parameter M = 4, N = 8)(output logic [N-1:0] Qout, 
    input logic [M-1:0] Address, input logic [N-1:0] Data, input logic clk, WE); 

logic [N-1:0] mem [0:(1<<M)-1]; 

always_comb 
    Qout = mem[Address]; 

always_ff @(posedge clk) 
    if (~WE) 
    mem[Address] <= Data; 

endmodule 

Jede Hilfe über die Wahrheitstabelle dieses Codes ist, geschätzt Grüße

Antwort

0

Die spezifische Antwort auf Ihre Frage ist, dass Qout wird nur den Wert von mem[Address] verfolgen. Mit anderen Worten, wenn an der steigenden Flanke der Uhr WE 0 ist, wird Qout mit dem in den Speicher geschriebenen Wert angesteuert. Dies liegt daran, dass der Speicher sich wie eine Bank von Flipflops verhält, während der Ausgang sich so verhält, als wäre er direkt mit dem Q-Ausgang einer Bank von Flipflops verbunden.

Die Reihenfolge der Ausführung der beiden Blöcke always ist deterministisch, da Qout angetrieben wird mit einer blockierenden Zuordnung (=), während der Speicher mit einer nicht blockierende Zuordnung geschrieben (<=). Siehe die Antwort here für viel mehr Details.

+0

danke für Ihre Antwort Wenn ich richtig verstehe, wenn WE = 0, Qout halten dann vorherigen Wert und mem [Adresse] wird aktualisiert. Dann wird im nächsten Taktzyklus der aktualisierte mem [Adresse] dem Qout für entweder WE = 0 oder WE = 1 zugewiesen. Ist das richtig? – user42037

+0

@ user42037 Tut mir leid. Ich sprach völligen Unsinn. (Es muss zu früh am Morgen gewesen sein.) Ich habe meine Antwort bearbeitet. –

Verwandte Themen