Семантика планирования Verilog
Дизайн и тестовый стенд Verilog обычно содержат много строк кода, состоящих из always
. или initial
блоки, непрерывные присваивания и другие процедурные операторы, которые становятся активными в разное время в ходе моделирования.
Каждое изменение значения сигнала в модели Verilog считается событием обновления. . И такие процессы, как always
и assign
блоки, чувствительные к этим событиям обновления, оцениваются в произвольном порядке и называются событием оценки. . Поскольку эти события могут происходить в разное время, ими лучше управлять и обеспечивать правильный порядок их выполнения, планируя их в очереди событий. которые упорядочены по времени моделирования.
module tb;
reg a, b, c;
wire d;
// 'always' is a process that gets evaluated when either 'a' or 'b' is updated.
// When 'a' or 'b' changes in value it is called an 'update event'. When 'always'
// block is triggered because of a change in 'a' or 'b' it is called an evaluation
// event
always @ (a or b) begin
c = a & b;
end
// Here 'assign' is a process which is evaluated when either 'a' or 'b' or 'c'
// gets updated
assign d = a | b ^ c;
endmodule
Очередь событий
Шаг моделирования можно разделить на четыре различных области. Активная очередь событий — это просто набор процессов, которые необходимо выполнить в текущий момент времени, что может привести к тому, что больше процессов будет запланировано в активных или других очередях событий. События можно добавлять в любой из регионов, но всегда удалять из активных регион.
- Активный события происходят в текущее время моделирования и могут обрабатываться в любом порядке.
- Неактивно события происходят в текущее время моделирования, но обрабатываются после обработки всех активных событий
- Неблокирующее назначение события, которые были оценены ранее, будут назначены после обработки всех активных и неактивных событий.
- Монитор события обрабатываются после выполнения всех активных, неактивных и неблокирующих назначений.
Когда все события в активной очереди для текущего временного шага была выполнена, симулятор переводит время на следующий временной шаг и выполняет свою активную очередь.
module tb;
reg x, y, z
initial begin
#1 x = 1;
y = 1;
#1 z = 0;
end
endmodule
Моделирование начинается в момент времени 0, и выполнение первого оператора запланировано, когда время моделирования достигает 1 единицы времени, при которой оно присваивает x и y значение 1. Это активная очередь для текущего времени, которая составляет 1 единицу времени. Затем симулятор планирует следующий оператор еще через 1 единицу времени, в которой z присваивается 0.
Что делает моделирование недетерминированным?
Во время моделирования могут возникать условия гонки, которые в конечном итоге дают разные результаты для одной и той же конструкции и тестового стенда. Одна из причин недетерминированного поведения заключается в том, что активен события можно удалять из очереди и обрабатывать в любом порядке.
Verilog