События изменения уровня сигнала

Изменения значений переменных или проводов могут использоваться в качестве события синхронизации для запуска выполнения других процедурных инструкций. Событие также может быть основано на изменении уровня сигнала, например, переходе в 0.

Для обозначения перехода сигнала в 0 или 1 используются следующие ключевые слова:

negedge

переход от 1 к X, Z или 0 и от X или Z к 0

posedge

переход от 0 к X, Z или 1 и от X или Z к 1

edge

эквивалентно posedge <сигнал> or negedge <сигнал>

Пример

module edge_tb;
  reg a, b, c, q;

  initial begin
    $monitor("Time [%0t]: a=%0b b=%0b c=%0b q=%0b", $time, a, b, c, q);
    a <= 0; b <= 0; c <= 0; q <= 0;
    #5 a = 1; c = 1;
    q = #5 a & b | c;
    #1 q = 0;
    #10;
  end

  always @(posedge a) $display("Time [%0t]: a=%0b [posedge]", $time, a);
  always @(negedge b) $display("Time [%0t]: b=%0b [negedge]", $time, b);
  always #2 begin
    c = @(posedge q) (a & b);
    $display("Time [%0t]: c=%0b [posedge =]", $time, c);
  end
  always #1 begin
    c = @(negedge q) (a | 1);
    $display("Time [%0t]: c=%0b [negedge =]", $time, c);
  end
  always @(edge a) begin
    $display("Time [%0t]: a=%0b [edge]", $time, a);
  end
  always @(posedge a or negedge a) begin
    $display("Time [%0t]: a=%0b [manual edge]", $time, a);
  end  
endmodule

Результат исполнения

[0] a=0 [edge]
[0] a=0 [manual edge]
[0] b=0 [negedge]
[0] a=0 b=0 c=0 q=0
[5] a=1 [posedge]
[5] a=1 [edge]
[5] a=1 [manual edge]
[5] a=1 b=0 c=1 q=0
[10] c=0 [posedge =]
[10] a=1 b=0 c=0 q=1
[11] c=1 [negedge =]
[11] a=1 b=0 c=1 q=0

Last updated