[an error occurred while processing this directive]
Про использование task'ов для реализации последовательностной логики.
(«Телесистемы»: Конференция «Языки описания аппаратуры (VHDL и др.))

миниатюрный аудио-видеорекордер mAVR

Отправлено dxp 29 декабря 2004 г. 17:27

С использованием task'ов в комбинационных блоках вроде все понятно - вызвали, оно отработало, пошли дальше - почти как в языках программирования.

А вот с использованием в последовательностных, т.е. синхронных - непонятка. Существует правило/стиль, согласно которому рекомендуется блокирующие присваивания использовать при описании комбинационной логики, а неблокирующие - при описании последовательностной. С этим все понятно и логично - так оно лучше и на аппаратуру ложится. Но вот тут-то и вылезает вопрос: при вызове task'а аргументы ему как передаются? блокиющим присваиванием или неблокирующим?

Провел эксперимент и обнаружил, что, по всей видимости, блокирующим. Т.е. написал код, скормил его синтезатору, а тот вопит, что, дескать, нельзя смешивать блокирующие и неблокирующие присваивания "Can't mix blocking and non-blocking assignments to a variable". Учитывая, что переменная, передаваемая как аргумент, уже используется в этом же блоке (а блок последовательностный, т.е. always @(posedge clk...)), то это переменная в этом блоке уже имеет присваивание в виде <=, и поэтому можно сделать вывод, что при вызове task'а происходит передача путем блокирующего присваивания, т.к. ругается синтезатор именно на строчку, где вызов task'а.

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

Более того, все примеры, которые удалось нарыть, приводят реализацию task'ов именно с блокирующими присваиваниями внутри вне зависимости как оно потом используется.

Более того, если написать нечто вроде:


reg [9:0] Cnt;

task Slon;
inout [9:0] Counter;
begin
Counter <= Counter + 1;
end
endtask

always @(posedge clk)
begin
if(...) Slon(Cnt);
end

То это не работает, т.е. Cnt не считает. По крайнем мере на симуляторе это не работает. Если заменить неблокирующее присваивание на блокирующее, то начинает работать.

Т.ч. вот непонятка, как же тут быть? Или это нормально, что внутри таска все присваивания блокирующие? Или это есть bad style использвать таск для постоения последовательносной логики? Но об этом нигде не сказано (не нашел), а наоборот говорится, что, дескать, таск для этого и предназначен и с успехом может использоваться и для комбинационной логики, и для регистровой.

В общем, просветите, кто знаком с вопросом?

Составить ответ  |||  Конференция  |||  Архив

Ответы


Отправка ответа

Имя (обязательно): 
Пароль: 
E-mail: 

Тема (обязательно):
Сообщение:

Ссылка на URL: 
Название ссылки: 

URL изображения: 


Перейти к списку ответов  |||  Конференция  |||  Архив  |||  Главная страница  |||  Содержание  |||  Без кадра

E-mail: info@telesys.ru