Перейти к содержанию
    

SV always block

 

подскажите, пожалуйста, как сделать так, чтобы вычислялось выражение cur_buf_length=base+tail? (questa зависает в этом месте)

 

base = констатнта,

tail - в процессе работы изменяется (для примера в данном случае пусть будет = 0)

 

module tb;
                   
const int base = 5;                   
int       cur_buf_length;
int       tail=0;

always
  cur_buf_length = base + tail;

/*  
initial  $display("cur_buf_length = %0d",cur_buf_length);
*/     
endmodule

 

судя по всему проблема в блоке always.

исходя из описания

every always starts executing automatically at the start of simulation, and continues executing throughout simulation as specified by any timing controls
, как я понял, все что внутри блока, исполняется в течение всего времени симуляции, но у меня квеста зависает в начальный момент.

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

судя по всему проблема в блоке always.

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

вы вот по-англицки читаете, значит знаете, что означает "always". так что ничего у вас не зависает, а что ни на есть исполняется... всегда, т.е. бесконечно. ну а то что у вас модельное время не двигается, то это ваш недочёт - сами же чёрную дыру создали - удивляться не приходится.

собственно об этом напрямую даже в стандарте сказано на 152-ой странице (1800-2009)

The general purpose always procedure, because of its looping nature, is only useful when used in conjunction
with some form of timing control. If an always procedure has no control for simulation time to
advance, it will create a simulation deadlock condition.
The following code, for example, creates a zero-delay infinite loop:
always areg = ~areg;

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

The general purpose always procedure, because of its looping nature, is only useful when used in conjunction
with some form of timing control. If an always procedure has no control for simulation time to
advance, it will create a simulation deadlock condition.
The following code, for example, creates a zero-delay infinite loop:
always areg = ~areg;

понял. в след раз буду знать. спасибо.

проблему решил always_comb'ом

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Для прояснения -

always нужно задать список чувствительности, т.е. по какому событию будут выполняться операторы в блоке. Например, always @(posedge clk) срабатывает по фронту тактовой частоты.

В блоке always_comb эта чувствительность подразумевается ко всем входящим в блок сигналам.

Можно было написать always @*. От always_comb есть отличия, в стандарте описаны.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

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

Гость
К сожалению, ваш контент содержит запрещённые слова. Пожалуйста, отредактируйте контент, чтобы удалить выделенные ниже слова.
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...