[an error occurred while processing this directive]
|
С использованием 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
endtaskalways @(posedge clk)
begin
if(...) Slon(Cnt);
end
То это не работает, т.е. Cnt не считает. По крайнем мере на симуляторе это не работает. Если заменить неблокирующее присваивание на блокирующее, то начинает работать.
Т.ч. вот непонятка, как же тут быть? Или это нормально, что внутри таска все присваивания блокирующие? Или это есть bad style использвать таск для постоения последовательносной логики? Но об этом нигде не сказано (не нашел), а наоборот говорится, что, дескать, таск для этого и предназначен и с успехом может использоваться и для комбинационной логики, и для регистровой.
В общем, просветите, кто знаком с вопросом?
E-mail: info@telesys.ru