Сначала назначьте, а затем переназначьте блок if как альтернативу if- (else if) -sese в Verilog - PullRequest
0 голосов
/ 23 июня 2019

Лучше ли сначала присвоить значение переменной, а затем переназначить блок if вместо использования блоков if- (else if) -else, где назначения в блоках if и else совпадают, а назначения в else if блок - это другое назначение.

always @(*) begin
    if condition1 begin
        var = val1;
    end
    else if condition2 begin
        var = val2;
    end
    else begin
        var = val1;
    end
end

против

always @(*) begin
    var = val1;
    if condition2 begin
        var = val2;
    end
end

Учитывая, что условие 1 и условие 2 являются взаимоисключающими, я думаю, что оба эти блока должны синтезировать одну и ту же логику, и выбор одного из других является чисто эстетическим. Правильно ли я считаю, что одна реализация будет синтезироваться иначе, чем другая? Если мое мышление правильное, какой метод является предпочтительным в сообществе?

Редактировать: Добавлены взаимоисключающие критерии после комментария racraman.

Ответы [ 2 ]

0 голосов
/ 25 июня 2019

Что касается общего принципа, о котором вы спрашиваете: не имеет значения, по какому маршруту вы идете. Синтезатор будет достаточно умен, чтобы все равно с ним разобраться. Для моделирования возможно, что параметр, который сначала выполняет назначение по умолчанию, может выполняться медленнее (особенно, если это назначение неблокирующее), но я не стал бы беспокоиться об этом.

Лично я предпочитаю второе, потому что читателю причинно-следственных связей более очевидно, что вы рассмотрели свои основы с точки зрения генерации нежелательных защелок (другими словами, вы всегда назначаете var).

Сказав все это, ваш пример (в принципе) очень прост, и в данном конкретном случае очевидно, что требуется мультиплексирование, и вам, вероятно, вообще не нужен всегда блок, и вам следует просто использовать assign с троичным оператором.

Я говорю «в принципе», потому что ваша логика на самом деле не имеет смысла. Вы говорите, что ваши условия являются взаимоисключающими, но что происходит, если ни одно из условий не активно? Вам действительно нужен фиксатор для сохранения предыдущего вывода? Если нет, то почему у вас вообще два условия?

0 голосов
/ 25 июня 2019

При использовании блоков всегда @ (*) вы можете получить непреднамеренные защелки в своем дизайне. Для назначений типа, которые вы упомянули, лучше использовать троичные операторы.

assign var = (cond1)?(val1):(cond2)?(val2):(val1); 
                                 //Assuming cond1 and cond2 are mutually exclusive

Если cond1 и cond2 могут возникать одновременно, то указанное выше назначение может быть изменено как

 assign var = (cond1 && cond2)?(val1):(cond1)?(val1):(cond2)?(val2):(val1);
                                //Assuming val1 when both cond1/2 are high
...