События изменения уровня сигнала
Изменения значений переменных или проводов могут использоваться в качестве события синхронизации для запуска выполнения других процедурных инструкций. Событие также может быть основано на изменении уровня сигнала, например, переходе в 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