Может ли последовательный блок всегда запускаться коротким импульсом из комбинированного блока? - PullRequest
0 голосов
/ 29 мая 2019

Может ли последовательный блок всегда запускаться короткоживущим импульсом, исходящим из комбинированного блока?

Я попытался запустить блок всегда, присвоив значение и вернув значение 0 в попыткедля запуска последовательного блока всегда, но безрезультатно, ниже приведен псевдокод


always_comb begin
 ...some code...
pulse_trigger = 1;
load_var= driver_var // assigning some values
pulse_trigger = 0;
 ...some code...
end

always @(pulse_trigger)begin
 ...some code part 2...
end

. Я ожидаю, назначив 1 для pulse_trigger активировать блок Always @ (pulse_trigger), но в моем моделировании VCSпохоже, это не так.

Возможно, это связано с тем, что импульсный триггер назначен 1 и не назначен 1 в одном и том же комбинированном блоке, что занимает 0 времени моделирования, так что pulse_trigger может не показывать измененные значения.Или этот метод должен был вызвать «always @ (pulse_trigger)» и выполнить «... некоторый код, часть 2 ..», потому что я смотрю на неправильные значения?

Ответы [ 2 ]

3 голосов
/ 29 мая 2019

В симуляции verilog только один блок всегда может быть оценен за один раз. Таким образом, пока ваш always_comb не закончится, ни один другой блок не может быть оценен. Следовательно, pulse_trigger изменение не будет обнаружено при моделировании (потому что все изменения происходят внутри одного всегда блока.

Вы можете сделать что-то подобное, добавив задержки (при условии, что это не синтезируемый код):

always @* begin
  pulse_trigger = 1;
  load_var= driver_var // assigning some values
  #1 // << this will stop execution of the block for 1 time unit and allow others.
  pulse_trigger = 0;
end

Однако приведенный выше код не синтезируется, но может быть частью тестового стенда. Кроме того, это не разрешено в пределах always_comb.

1 голос
/ 29 мая 2019

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

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

always @* begin
  pulse_trigger = 1;
  load_var= driver_var // assigning some values
  pulse_trigger <= 0; // adds a delta cycle or <= #1 delay without blocking the process
end

Еще лучше заменить второе always @ блок с объявлением функции, затем вызывая функцию вместо запуска события.

...