2013-03-14 5 views
2

Я столкнулся с дизайном приоритетного кодировщика и узнал о новом способе его использования, используя оператор case. Единственное, что вводит в заблуждение, является ли утверждение дела приоритетом для случаев? Пример:Оператор case в verilog

case(1'b1)         
    A[3]: Y<=4'b1000;    
    A[2]: Y<=4'b0100; 
    A[1]: Y<=4'b0010; 
    A[0]: Y<=4'b0001; 
    default:Y<=4'b0000; 
endcase 

Вот если я даю A, как 1111Y получает 1000 т.е. он отдает приоритет первому сазе. Почему это так?

ответ

5

Да, есть приоритет, основанный на заказе. В соответствии с Verilog-2001 спецификации, раздел 9.5:

Пункт случае выражения должны быть оценены и сопоставлены в точном порядке, в котором они даны. Во время линейного поиска, если одно из выражений элемента case соответствует выражению case, указанному в круглых скобках, тогда выполняется оператор, связанный с этим элементом.

+0

Ох. Тогда я сомневаюсь. Разве это не похоже на запись выражения if else? Тогда зачем писать заявление о делах? – aditya3524

+2

@ aditya3524 case case является чище и, как правило, предпочтительнее, чем цепочки else. – Morgan

+1

Лично я редко видел приоритетный кодировщик, написанный таким образом.Он должен быть эквивалентен набору операторов if/else. Это более компактно, но мне сложно читать, поскольку значение внутри case (...) является константой. – dwikle

9

Я бы реорганизовать это:

casez(A)         
    4'b1???: Y<=4'b1000;    
    4'b01??: Y<=4'b0100; 
    4'b001?: Y<=4'b0010; 
    4'b0001: Y<=4'b0001; 
    default: Y<=4'b0000; 
endcase 

Тогда нет необходимости беспокоиться о приоритете, каждый матч уникален.

От IEEE Std 1800-2009 (IEEE стандарт для SystemVerilog)

12.5.2 Постоянное выражение в случае заявления
Постоянное выражение может быть использовано для case_expression. Значение константного выражения сравнивается с case_item_expressions.

Следующий пример демонстрирует использование путем моделирования 3-битного приоритета кодера:

logic [2:0] encode ; 

case (1) 
    encode[2] : $display("Select Line 2") ; 
    encode[1] : $display("Select Line 1") ; 
    encode[0] : $display("Select Line 0") ; 
    default $display("Error: One of the bits expected ON"); 
endcase 

12.5.3 Уникальный случай, unique0-случай, и случай приоритетов
The case, casez и casex могут быть квалифицированы ключевыми словами приоритета, уникального или уникального0 для выполнения определенных проверок нарушения. Они в совокупности называются приоритетными, уникальными или уникальными. Приоритетный случай должен действовать только на первое совпадение. Уникальный случай и уникальный аргумент 0 утверждают, что нет перекрывающихся case_items и, следовательно, безопасно оценивать case_items параллельно.

...

priority casez(a) // values 4,5,6,7 cause a violation report 
    3’b00?: $display("0 or 1"); 
    3’b0??: $display("2 or 3"); 
endcase 

Я не уверен, насколько хорошо поддерживается заявления приоритетных тематических поддерживаются синтеза инструментов, хотя.

+0

Полный SystemVerilog Standard (2012) здесь: https://standards.ieee.org/findstds/standard/1800-2012.html –