2013-10-12 3 views
1

Я сталкивалась с этим стилем кодирования несколько раз в Verilog коде:избыточность условного оператора

input enable; 
input [1:0] mode; 
wire mode_enable; 

assign mode_enable = (enable & (mode == 2'b00)) ? 1'b1 : 1'b0; 

Какова цель условного оператора здесь? Это кажется излишним и сбивает с толку, так как я думаю, что это дает тот же результат:

assign mode_enable = (enable & (mode == 2'b00)); 

ли это каким-то образом помочь с моделированием, или направлять синтез?

+3

каковы размеры Ь и с? –

+0

Хороший вопрос. Это упрощенная версия того, что я видел, но я думаю, что b и c были двумя выражениями, которые оценивались на отдельные биты. Мне нужно найти код для просмотра. – nguthrie

+0

Поскольку многие из них указали, что это не избыточно, если мы имеем дело с многобитовыми сигналами, я скорректировал вопрос, чтобы сделать его более понятным. – nguthrie

ответ

2

Чтобы обновляемой вопрос:

Единственное различие между (enable & (mode == 2'b00)) и (enable & (mode == 2'b00)) ? 1'b1 : 1'b0 является последним выводит Мультиплексор на синтез. Синтез может даже оптимизировать мультиплексор.

Причина, по RLT дизайнер мои хочешь иметь мультиплексор:

  1. Мультиплексор может иметь более желательный драйвер нагрузки веера из.
  2. Преднамеренная задержка впрыскивания для фильтрации сглаживания и/или балансировки задержки распространения логики.
  3. Для проектирования ИС это может сделать ручной ECO проще, заменяя один вход другой сетью.

Приведенные выше причины бессмысленны в 98% случаев при использовании надлежащих инструментов. Хороший инструмент для анализа и анализа времени будет обрабатывать причины 1 и 2. Добавьте хороший инструмент ECO, и третий пункт будет рассмотрен. Остальные 2% в основном относятся к редкому случаю, который вы ожидаете от ECO, а затем принудительный мультиплексор делает конечное местоположение вывода и нагрузку более предсказуемой.


К первоначальному вопросу:

Это является излишним, только если b и c являются один бит. Если они имеют ширину нескольких битов, то уравнение не может быть упрощено. a будет равным 1, если b и c оба имеют 1 значение в одних и тех же битовых индексах.

Например, предположим, b и c имеют ширину 2 бита: (assign a = (b & c) ? 1'b1 : 1'b0)

  • b = 2 c = 3, a будет 1, потому что b & c = 2
  • b = 2 c = 1, a будет 0, поскольку b & c = 0
+0

Итак, подведем итог: это не то, что я хотел бы сделать, если бы у меня не было действительно веской причины. Я бы спросил парня, который написал код, но он больше не работает здесь. Благодарю. – nguthrie

0

Это не дает тот же результат, если размер всех a, b и c не 1:

assign a = b & c; 

Но это то же самое:

assign a = b && c; 
Смежные вопросы