В чем разница между $ display vs $ strobe vs $ monitor в Verilog? Когда в очереди событий применяется каждый из них и как операторы взаимодействуют между собой? Может ли одно высказывание препятствовать другому?
$ display vs $ strobe vs $ monitor в Verilog?
Ответы (2)
Я буду любезен и резюмирую LRM (Справочное руководство по языку) , но вы должны это прочитать. Все в IEEE Std 1800-2012 21.2 Система отображения задачи (Технически SystemVerilog, но эти функции идентичны.)
$display
: print the immediate values- § 21.2.1 The display and write tasks
$strobe
: print the values at the end of the current timestep- § 21.2.2 Strobed monitoring
$monitor
: print the values at the end of the current timestep if any values changed.$monitor
can only be called once; sequential call will override the previous.- § 21.2.3 Continuous monitoring
$write
: same as$display
but doesn't terminate with a newline (\n
)- § 21.2.1 The display and write tasks
Пример:
reg [3:0] a,b;
integer i;
initial begin
$monitor("monitor a:%h b:%h @ %0t", a, b, $time);
for(i=0; i<4; i=i+1) begin
$strobe("strobe a:%h b:%h @ %0t", a, b, $time);
$display("display a:%h b:%h @ %0t", a, b, $time);
case(i)
0 : a = 4;
1 : b = 1;
2 : begin end // do nothing
3 : {a,b} = 9;
endcase
$display("display a:%h b:%h @ %0t", a, b, $time);
#1;
end
end
Выходы: (обратите внимание на порядок печати, и этот монитор не отображается во время 2)
отобразить a: xb: x @ 0
отобразить a: 4 b: x @ 0
монитор a: 4 b: x @ 0
стробоскоп a: 4 b: x @ 0
отобразить a: 4 b: x @ 1
дисплей a: 4 b: 1 @ 1
монитор a: 4 b: 1 @ 1
стробоскоп a: 4 b: 1 @ 1
дисплей a: 4 b : 1 @ 2
отображать a: 4 b: 1 @ 2
стробоскоп a: 4 b: 1 @ 2
отображать a: 4 b: 1 @ 3
отображать a: 0 b: 9 @ 3
монитор a: 0 b: 9 @ 3
стробоскоп a: 0 b: 9 @ 3
Verilog / SystemVerilog содержит хорошо организованную очередь событий. Все операторы в каждой метке времени выполняются в соответствии с этой очередью.
- $ display выполняется в АКТИВНОЙ области, поэтому, если есть какое-либо неблокирующее назначение (которое выполняется в НЕАКТИВНОЙ области), оно не будет отображаться $ display.
- $ write также выполняется в АКТИВНОЙ области, но для вставки другой строки требуется явный вызов символа новой строки (\ n). Эта системная задача обычно используется, когда вы хотите отобразить многомерный массив с помощью цикла for.
- $ strobe выполняется в регионе MONITOR / POSTPONE, то есть в конце отметки времени. Следовательно, обновленное значение отображается как $ strobe.
- $ monitor отображается каждый раз, когда изменяется один из его параметров отображения. Должен использоваться только один монитор $ за симуляцию.
Взгляните на это изображение: VERILOG EVENT REGIONS
Пример кода доступен по адресу: Display / Strobe / Monitor
Надеюсь, этот код проясняет это.