Menu
Coddy logo textTech

Opóźnienia przypisań

Część sekcji Podstawy ścieżki Verilog w Coddy. Lekcja 69 z 90.

W poprzednich lekcjach omówiliśmy opóźnienia ogólne (#10 a = b;) oraz opóźnienia bramek (and #5 (out, a, b);). Teraz omówimy opóźnienia przypisania, czyli opóźnienia występujące wewnątrz bloku proceduralnego (takiego jak initial lub always) jako część instrukcji przypisania.

Opóźnienie przypisania odczekuje określony czas, a następnie wykonuje przypisanie. Opóźnienie umieszcza się po symbolu # i przed przypisaniem.

Składnia:

variable = #delay expression;

W przeciwieństwie do ogólnego opóźnienia #10 a = b; (opóźnienie, a następnie przypisanie), opóźnienie przypisania a = #10 b; pobiera w danym momencie wartość b, czeka 10 jednostek czasu, a następnie przypisuje ją do a.

Opóźnienie przypisania a opóźnienie ogólne

 Opóźnienie ogólneOpóźnienie przypisania
Składnia#10 a = b;a = #10 b;
Kiedy odczytywana jest wartość?W chwili przypisania (po opóźnieniu)Natychmiast (przed opóźnieniem)
Jaka wartość jest przypisywana?Wartość b w danym momencieWartość b w chwili 0 (lub w chwili odczytu)
Kiedy wartość jest przypisywana?Po opóźnieniuPo opóźnieniu

Przykład: różnica

initial begin
  b = 1;
  #5 b = 0;
  
  // Ogólne opóźnienie
  #10 a1 = b;     // Czeka 10, po czym odczytuje b (b=0) → a1=0
  
  // Opóźnienie przypisania
  a2 = #10 b;     // Odczytuje teraz b (b=0), czeka 10, po czym przypisuje → a2=0
end

Oba dają tutaj ten sam wynik. Różnica pojawia się, gdy b zmienia się podczas opóźnienia.

Przykład kluczowej różnicy

To show b changing during the delay, we need two separate initial blocks that run in parallel:

initial begin
  b = 1;
  a1 = #10 b;     // Odczytuje b=1 w chwili 0, przypisuje a1=1 w chwili 10
end

initial begin
  #5 b = 0;       // Zmienia b na 0 w chwili 5 (podczas opóźnienia)
end
  • W chwili 0: a1 odczytuje b = 1
  • W chwili 5: b zmienia się na 0 (gdy a1 nadal czeka)
  • W chwili 10: do a1 przypisywana jest wartość 1 (wartość odczytana w chwili 0), a nie 0

W przypadku ogólnego opóźnienia #10 a2 = b; w osobnym bloku, b zostałoby odczytane w chwili 10 (wartość 0).

Ważne zasady

ZasadaWyjaśnienie
= występuje przed #a = #10 b;, a nie a #10 = b;
Wartość jest odczytywana natychmiastPrawa strona jest obliczana od razu
Przypisanie następuje po opóźnieniuLewa strona otrzymuje wartość później
Tylko w blokach proceduralnychUżywane w initial lub always
challenge icon

Wyzwanie

Co zrobić:

Dodaj brakujące opóźnienie przypisania, aby a otrzymało wartość b po 15 jednostkach czasu, ale odczytało b natychmiast.

Spróbuj swoich sił

module assignment_challenge;
  reg a, b;
  
  // Osobny blok do zmiany b w czasie opóźnienia
  initial begin
    b = 1;
    // TODO: Dodaj opóźnienie przypisania
    // a powinno otrzymać wartość b po 15 jednostkach czasu
    // Odczytaj b teraz, przypisz po opóźnieniu

  end
  
  initial begin
    #5 b = 0;      // Zmienia b w czasie opóźnienia
    #20 $display("Time %0t: a = %b", $time, a);
    $finish;
  end
endmodule
quiz iconSprawdź się

Ta lekcja zawiera krótki quiz. Zacznij lekcję, żeby na niego odpowiedzieć i śledzić swoje postępy.

Wszystkie lekcje w sekcji Podstawy

Poćwicz samodzielnie: Kompilator Verilog online