реклама на сайте
подробности

 
 
> Как защититься от латчей?
-=Vitaly=-
сообщение Apr 27 2007, 09:26
Сообщение #1


Местный
***

Группа: Свой
Сообщений: 468
Регистрация: 31-08-06
Из: Киев
Пользователь №: 19 991



Здравствуйте!!

Предположим меется много конструкций типа if -else if-else в блоке always(*) естественно внутри сигналы типа reg, и если не перебираются все варианты if -else if-else, то получится защелка.

Можно ли подобные конструкции (if -else if-else) или что-то похожее применять для переменных типа wire, чтобы быть застрахованным от появления латчей??

В качестве примера:

Код
always@(*)

        if(MAX_DATA>HiTreshold)  
            begin
                FR_EN_UPD<=1'b1;
                if(LDAC!=X_REG && LDAC<LDAC+SUPR )
                    LDAC_UPD<=LDAC+SUPR;
                else
                    LDAC_UPD<=X_REG;
                if(LDAC==X_REG && PRBS_REG!=2'b11)      
                    PRBS_INC_UPD<=1'b1;      
            end      
        //--------------------------------------------------------------------------------------    
        else if    (MAX_DATA<HiTreshold && MAX_DATA>LoTreshold5 && FR_EN_OLD!=1'b1)
            begin
            FR_EN_UPD<=1'b0;
            LDAC_UPD<=LDAC;    
            PRBS_INC_UPD<=1'b0;
            PRBS_DECR_UPD<=1'b0;
            end


СПС blush.gif
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
SM
сообщение Apr 28 2007, 12:49
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 7 946
Регистрация: 25-02-05
Из: Moscow, Russia
Пользователь №: 2 881



Если синтез Synopsys DC, то установите hdlin_check_no_latch в true, и по варнингам отловите их всех поголовно. А квартус и так варнингов понарасскажет. Ну а дальше ручками. Проще всего в самом начале блока поставить "out_var <= x" для всех переменных, а затем хоть тонну if'ов и case. Ну или не "x", а нужные дефолтные значения, если они важны. Для примера:

Код
  always @*
     begin
        out <= 1'bx;
        if (expr_1) out <= in1;
        else if (expr2) out <= in2;
        else if (expr3) out <= in3;
     end


В результате латча не будет гарантировано, но и в случае невыполнения ни одного из условий выход будет в неопределенном (точнее в каком-то определенном на усмотрение синтезатора) состоянии. Вместо 1'bx можно вписать конкретное значение, которое примет выходной сигнал в случае неисполнения ни одного из условий.
Go to the top of the page
 
+Quote Post
urri
сообщение Apr 28 2007, 13:47
Сообщение #3





Группа: Validating
Сообщений: 11
Регистрация: 23-11-05
Пользователь №: 11 293



Цитата(SM @ Apr 28 2007, 13:49) *
Проще всего в самом начале блока поставить "out_var <= x" для всех переменных, а затем хоть тонну if'ов и case. Ну или не "x", а нужные дефолтные значения, если они важны.


Только присваивание нужно делать блокирующее : "out_var = x" и далее везде
Go to the top of the page
 
+Quote Post



Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 29th July 2025 - 10:22
Рейтинг@Mail.ru


Страница сгенерированна за 0.01866 секунд с 7
ELECTRONIX ©2004-2016