2013-03-14 58 views
2

我遇到了优先级编码器设计,并找到了一种使用case语句的新方法。 唯一令人困惑的是,案件陈述是否优先处理案件? 例子:verilog中的case语句

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 

在这里,如果我给A1111Y得到1000即它优先考虑的第一个case语句。 这是为什么呢?

回答

5

是的,有一个优先顺序,根据订单。据了Verilog-2001规范,9.5节:

情况下项表达式应进行评估,并在其给出的确切顺序进行比较。在线性搜索期间,如果其中一个case项目表达式与括号中给出的大小写表达式匹配,则应执行与该案例项目相关联的语句。

+0

哦。那么我有疑问。这不像写一个if else语句吗?那么为什么要写一个案例陈述? – aditya3524 2013-03-14 20:24:47

+2

@ aditya3524 case语句更清晰,并且通常优先于其他链。 – Morgan 2013-03-14 20:27:52

+1

我个人很少看到用这种方式编写的优先级编码器。它应该相当于一堆if/else语句。这是更紧凑,但我发现它很难阅读,因为case(...)内的值是一个常量。 – dwikle 2013-03-14 20:29:56

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标准1800年至2009年(IEEE标准的SystemVerilog)的情况下,语句
常量表达式

12.5.2常量表达式可以用于case_expression。常量表达式的值应与case_item_expressions进行比较。

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-情况下,和优先级的情况下
的:

以下示例通过模拟的3位优先级编码器演示了使用case,casez和casex关键字可以通过优先级,唯一性或unique0关键字进行限定,以执行某些违规检查。这些统称为优先个案,独特个案或独特个案。优先案件只适用于第一场比赛。 Unique-case和unique0-case声明不存在重叠的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 

我不知道如何很好地支持优先case语句是由综合工具虽然支持。

+0

完整SystemVerilog标准(2012)在这里:https://standards.ieee.org/findstds/standard/1800-2012.html – 2017-02-25 02:17:35