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

Последовательные и параллельные операции Verilog

Здравствуйте! Такой вопрос:

В каком порядке выполнится программа в блоке always?

Условия проверяются параллельно, а инкрементирование после? Или все параллельно?

always@(posedge CLK)
begin        
    if(i<24)
    begin
         //....
    end    
    if(i==25) 
    begin
         //..... 
    end
    i=i+1;
end

Спасибо

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


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

Здравствуйте! Такой вопрос:

В каком порядке выполнится программа в блоке always?

Условия проверяются параллельно, а инкрементирование после? Или все параллельно?

always@(posedge CLK)
begin        
    if(i<24)
    begin
         //....
    end    
    if(i==25) 
    begin
         //..... 
    end
    i=i+1;
end

Спасибо

Могу рассказать по скайпу...

 

 

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


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

Приветствую!

 

Всё будет выполнятся параллельно. Каждый тик клока.

Увы это не совсем так. Операторы в блоке begin end выполняются последовательно. И то что при синтезе в железе получится 3 параллельных части логики этого не меняет. Это особенно будет заметно если написать например так.

always@(posedge CLK)
begin        
    i=i+1;
    if(i<24)
    begin
         //....
    end    
    if(i==25)
    begin
         //.....
    end
end

Поэтому и рекомендуют использовать для описания синхронной логики неблокирующие присваивание <= .

 

Успехов! Rob.

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


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

И то что при синтезе в железе получится 3 параллельных части логики этого не меняет.

Поэтому и рекомендуют использовать для описания синхронной логики неблокирующие присваивание <= .

 

В котором написанное ниже имеет приоритет над написанным выше.

 

A<=3;
A<=1;

 

даст результат 1.

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


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

Приветствую!

 

В котором написанное ниже имеет приоритет над написанным выше.

A<=3;
A<=1;

даст результат 1.

Точнее сказать переменная получит значение ПОСЛЕДНЕГО присвоения.

 

Успехов! Rob.

 

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


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

always@(posedge CLK)
begin
    if(i<12)
    begin
        i=i+1;
    end
    if(i==11)
    begin

    end
end

Немного непонял

 

Все же, if(i==11) проверяется после i=i+1; или параллельно с if(i<12) ?

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


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

Лучше перепиши всю эту конструкцию чтобы не возникало ни каких сомнений.

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


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

Все же, if(i==11) проверяется после i=i+1; или параллельно с if(i<12) ?

После. Все в always-блоках выполняется строго последовательно.

Надо учитывать, что неблокирующее присваивание, это отложенное присваивание, а блокирующее - немедленное присваивание, и все они выполняются последовательно. Параллельно выполняются только разные блоки always, поэтому и запрещено присваивание одной переменной в разных always-блоках.

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


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

Что можно сказать про 2 варианта написания кода (допустимо/недопустимо/равноценно/…) , и что можно сказать про значения q1, q2 (всегда одинаковые/могут быть разными) ?

	module top(input a1,a2, output q1,q2);
	logic a, q; always_comb begin a=a1; q1=q; a=a2; q2=q; end
	… // скрыто 
	endmodule
	

	module top(input a1,a2, output q1,q2);
	logic a, q; always_comb begin a<=a1; q1<=q; a<=a2; q2<=q; end
	… // скрыто 
	endmodule
	

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


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

1 hour ago, Leka said:

Что можно сказать про 2 варианта написания кода (допустимо/недопустимо/равноценно/…) , и что можно сказать про значения q1, q2 (всегда одинаковые/могут быть разными) ?

У  вас какая-то ошибка в коде, бессмысленное двойное присвоение в a, и отсутствие присвоение в q.  Может вы имели ввиду такое ?

logic a, q; always_comb begin a=a1; q1=a; q=a2; q2=q; end
...
logic a, q; always_comb begin a<=a1; q1<=a; q<=a2; q2<=q; end

Но даже так приведенные  варианты будут  вести себя по разному.  Поведение второго варианта будет отличатся в симе и синтезе. 
Поэтому второй вариант недопустимо использовать. В always_comb нужно использовать только блокирующие присвоения. 

 

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


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

1 hour ago, RobFPGA said:

У  вас какая-то ошибка в коде, бессмысленное двойное присвоение в a, и отсутствие присвоение в q.

Присвоение в q подразумевается в скрытом коде.

Подразумевается также, что результат q зависит от a.  

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


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

1 hour ago, Leka said:

Присвоение в q подразумевается в скрытом коде.

Подразумевается также, что результат q зависит от a.

Сложно отвечать на вопрос о поведении кода догадываясь что у вас там дальше скрыто в коде.  Но в данном примере и этого достаточно чтобы понять что так нехорошо делать.   

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


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

36 minutes ago, RobFPGA said:

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

Вот-вот, именно это и хотел-бы обсудить.

Мой ответ такой (если сравнивать симуляцию и синтез, то речь идет только о синтезируемом Верилоге).

В синтезируемом Верилоге явно запрещены две вещи:

1) смешивание разных типов присваиваний одной переменной,

2) присваивание одной переменной в разных блоках.

Все остальное - не более, чем рекомендации.

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

1) Внешние (по отношению к данному процедурному блоку) переменные всегда получают результат последнего присваивания - независимо от типа процедурного блока, и независимо от типа присваиваний.

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

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

2) q1 и q2 всегда будут иметь одинаковые значения, независимо от остального (скрытого) кода.

    

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


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

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

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

Гость
Ответить в этой теме...

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

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

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

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

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

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