В чем разница между использованием начального блока и инициализацией переменной reg в systemverilog?

verilog simulation system-verilog

11878 просмотра

5 ответа

129 Репутация автора

В чем разница между следующими двумя примерами в отношении симуляции?

A)

reg a;
initial a = 1'b0;

а также

B)

reg a = 1'b0;

Это отличается от логических переменных?

Автор: supernun Источник Размещён: 18.07.2016 08:12

Ответы (5)


3 плюса

1054 Репутация автора

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

Автор: AndresM Размещён: 18.07.2016 08:34

8 плюса

23670 Репутация автора

Решение

Разница заключается в инициализации как части объявления переменных, выполняемых перед любым процессом, запущенным любым initialили alwaysконструкциями. Если вы написали:

bit clk;
initial clk = 1;
always #5 clk++;
always @(posedge clk) ...;

Существует условие гонки относительно того, @(posedge clk)сработает ли время в 0 или 10. Однако с:

bit clk = 1;
always #5 clk++;
always @(posedge clk) ...;

Там нет расы с вышесказанным. Первая постановка наступит через 10 часов.

Автор: dave_59 Размещён: 18.07.2016 09:23

-1 плюса

738 Репутация автора

На аналогичной ноте:

int val = 0 ; 
int val1 = val + 10 ; 

будет производить согласованный результат, так как результат фиксируется во время компиляции, где как

initial val = 0 ; 
initial val1 = val + 10; 

будет давать противоречивый результат [так как порядок присваивания происходит во время выполнения и зависит от симулятора]

Автор: Rahul Menon Размещён: 19.07.2016 12:37

1 плюс

9723 Репутация автора

Существует важное различие: вы отметили свой вопрос «verilog» и «system-verilog». Что ты имеешь в виду? Ответ зависит от того, что вы имеете в виду, потому что поведение отличается в обоих.

В Verilog:

Обе

reg a;
initial a = 1'b0;

а также

reg a = 1'b0;

будет вести себя так же. В обоих случаях aбудет инициализироваться в момент времени 0, т.е. во время выполнения . Это может привести к симуляции гонок и недетерминированному поведению. Например:

reg a;
initial a = 1'b1;
initial $display(a);

может отображаться 0или отображаться 1- между начальными блоками есть гонка. И точно то же самое будет происходить с этим кодом:

reg a = 1'b1;
initial $display(a);

В системе Verilog:

reg a;
initial a = 1'b0;

а также

reg a = 1'b0;

будет вести себя по-другому. В первом случае aбудет инициализироваться в момент времени 0, то есть во время выполнения, что снова может привести к гонкам симуляции и недетерминированному поведению. Тем не менее, нет такой проблемы с этим кодом:

reg a = 1'b1;
initial $display(a);

В этом случае aон будет инициализирован во время компиляции и, следовательно, не будет гонки и, следовательно 1, всегда будет отображаться.

Автор: Matthew Taylor Размещён: 20.07.2016 03:44

2 плюса

1352 Репутация автора

Инициализация переменной выполняется перед выполнением любого другого процедурного блока.

По системе Verilog LRM 1800-2012, Тема 6.8

Переменная может быть объявлена ​​с помощью инициализатора, например:

int i = 0;

Установка начального значения статической переменной как части объявления переменной (включая статические члены класса) должна происходить до того, как начнутся какие-либо начальные или всегда процедуры (также см. 6.21 и 10.5 об инициализации переменной со статическим и автоматическим временем жизни).

Автор: Karan Shah Размещён: 22.07.2016 06:00
Вопросы из категории :
32x32