verilog中的case语句

时间:2013-03-14 19:37:11

标签: verilog asic

我遇到了优先级编码器设计,并找到了一种使用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

如果我将A作为1111 Y获取1000,则优先考虑第一个案例陈述。 为什么会这样?

2 个答案:

答案 0 :(得分:11)

我会将此重构为:

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 STANDARD FOR 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 unique-case,unique0-case和priority-case
  case,casez和casex关键字可以通过priority,unique或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

我不确定综合工具是否支持优先案例陈述有多好。

答案 1 :(得分:7)

是的,根据订单有优先权。根据Verilog-2001规范,第9.5节:

  

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