Отвечая на ваш вопрос 1: между initial
блоками абсолютно гарантированный порядок выполнения.Verilog симуляция запускает их в произвольном непредсказуемом порядке.Единственный способ синхронизации - это #delays и другие операторы wait и delay.
Verilog гарантирует, что выполнение любого процедурного блока (который включает в себя начальные и всегда блоки) остановится в состоянии ожидания, пока не будет удовлетворено.
Verilog также гарантирует, что все начальные блоки начинаются до любого всегда блока.
Любой сигнал, указанный в блоке всегдасписок чувствительности играет роль оператора 'delay', заставляя блок Always ждать, пока не изменится какое-либо значение сигнала.Это продолжит выполнение блока позже.
Итак, отвечая на ваш второй вопрос, always@(x_in)
будет ожидать изменения значения сигнала.
так, в вашем случае:
initial begin << will start execution at time '0' before any always block
clk=1'b0; << change value of clk from 'x' -> '1'
x_in=32'd0; << change value of x_in 'x' -> '0'
#0 << makes absolutely no sense here. It is a special statement
#10000 << pauses execution for 10000 time units
$stop; << stopps execution
end
, в то время как вышеуказанный начальный блок дает, остальные блоки начинают выполнение.
initial begin << starts execution at time 0, befor or after the block above
#1 temp=x_in; << pauses for 1 time unit, then assigns temp
end
Вышеприведенное присваивание происходит, когда первый начальный блок ожидает # 10000.
, если вы используете блок Always
always @(x_in)
temp = x_in;
, он будет выполнять assignemt при изменении x_inи первый начальный блок начинает ждать.Этот блок всегда будет выполняться в том же цикле «0», когда сигнал будет изменен.Это отличается от # 1, который вы использовали.В ваших случаях изменение произойдет в цикле «1».