2015-01-28 1 views
-1

Я пытаюсь реализовать вилы присоединиться Verilog код, но что-то не так:Что именно параллельная вилка соединяется параллельно?

reg [7:0] a, b; 
initial fork 
a = 0;    // initial 
b = 0;    // initial 
#1 a = 1;   
#1 b = a + 1;  // is b 1 or 2? 
join 

Приведенный выше код сбивает с толку, потому что b очень расплывчатое значение. Как я знаю, соединение вилки работает как параллельное, поэтому я считаю, что b должен быть 1. Я прав?

Мой результат моделирования состоит в том, что «b'is 2 не 1. Но, по моему мнению, это должно быть 1. Потому что a пока не 1.

Я хотел бы сделать пример кода вроде этого.

Initial 
$display("initial time = %d", $time); 

Fork 
#1000 $display("spend time = %d at #1000", $time); 
#5 $display("spend time = %d at #5", $time); 
#50 $display("spend time = %d at #50", $time); 
join 

$display("main process time = %d", $time); 
end 

, тогда я получил это как следующее. начальное время 0 провести время 5 время тратить 50 время тратить 1000 основное время процесса 1000

так из этого эксперимента, я получил его о вилке присоединиться.

Так что я пробую еще один такой.

Initial begin 
'Ifdef FK 
fork 
'endif 
$display ("initial time %d , $time); 
a<=0; 
b<=0; 

#100 a<=1; 
#100 b<=a+1; 
'Ifdef FK 
join 
'Endif 
$display ("the output a,b %d %d time %d, a,b, $time); 
End 

В результате, как этого 0, 0, 100 Кроме того, когда от FK 1, 0, 200 Но я не понимаю, выше результата. Почему у них есть 0,0 100 и 1,0 200?

+0

Что вы получаете, когда вы его имитации? – Morgan

ответ

1

При размещении кода в соединении fork все выполняется параллельно. Я не вижу в нем явного упоминания в LRM, но я понимаю, что для параллельных блоков порядок выполнения не является детерминированным. Поэтому вы не знаете, будет ли симулятор собираться сначала выполнить #1 a = 1; или #1 b = a + 1;.

Раздел 9.3.2 из SystemVerilog IEEE1800-2012 охватывает параллельные блоки.

Когда у вас есть код в initial, код выполняется последовательно симулятором, оценивающим каждую строку по очереди, это детерминированный код, выполняемый в указанном порядке.

Эквивалент вилкой присоединиться бы:

initial 
    a = 0;  

initial 
    b = 0;  

initial 
    #1 a = 1; 

initial 
    #1 b = a + 1; 
+0

Спасибо, сэр, это блестящее объяснение. – JamJI

Смежные вопросы