Case Statement
  
    
    
     
   
   Formal Definition
  
   The case statement is a decision instruction that chooses one 
   statement for execution. The statement chosen is one with a value 
   that matches that of the case statement. 
  
   Simplified Syntax
  
   case (expression) 
  
     expression : statement 
  
     expression {, expression} : statement 
  
     default 
   : statement 
  
   endcase 
  
   casez (expression) 
  
     expression : statement 
  
     expression {, expression} : statement 
  
     default 
   : statement 
  
   endcase 
  
   casex (expression) 
  
     expression : statement 
  
     expression {, expression} : statement 
  
     default 
   : statement 
  
   endcase 
  
   Description
  
   The case statement starts with a case 
   or casex or casez 
   keyword followed by the case expression (in parenthesis) and case 
   items or default statement. 
   It ends with the endcase 
   keyword. The default statement is optional and should be used only 
   once. A case item contains a list of one or more case item 
   expressions, separated by comma, and the case item statement. The 
   case item expression and the case item statement should be separated 
   by a colon. 
  
   During the evaluation of the case statement, all case item 
   expressions are evaluated and compared in the order in which they are 
   given. If the first case item expression matches the case expression, 
   then the statement which is associated with that expression is 
   executed and the execution of the case statement is terminated. If 
   comparison fails, then the next case item expression is evaluated and 
   compared with the case expression. If all comparisons fail and the default 
   section is given, then its statements are executed. Otherwise none of 
   the case items will be executed. 
  
   Both case expression and case item expressions should have the same 
   bit length. None of the expressions are required to be a constant expression. 
  
   The case expression comparison is effective when all compared bits 
   are identical. Therefore, special types of case statement are 
   provided, which can contain don't-care values in the case expression 
   and in the case item expression. These statements can be used in the 
   same way as the case statement, but they begin with the keywords casex 
   and casez. 
  
   The casez statement treats 
   high-impedance (z) values as don't-care values and the casex 
   statement treats high-impedance and unknown (x) values as don't care 
   values. If any of the bits in the case expression or case item 
   expression is a don't-care value then that bit position will be ignored. 
  
   The don't-care value can be also specified by the question mark (?), 
   which is equal to z value. 
  
   Examples
  
   Example 1 
  
   reg [1:0] address; 
   case (address) 
     2'b00 : statement1; 
     2'b01, 2'b10 : statement2; 
     default : statement3; 
   endcase 
  
   If the address value is 2'b00 then statement1 
   will be executed. Statement2 
   is executed when address value equals 2'b01 or 2'b10. Otherwise statement3 
   is executed. 
  
   Example 2 
  
   reg a; 
   case (a) 
     1'b0 : statement1; 
     1'b1 : statement2; 
     1'bx : statement3; 
     1'bz : statement4; 
   endcase 
  
   In Example 2, the statements will be executed depending on the value 
   of the 'a' variable (if a = 1'b0 then statement1 
   will be executed, etc). If we assign a question mark (?) to the 'a' 
   variable, then statement4 
   will be executed because the syntax concerning numbers defines the 
   question mark as equal to the z value. 
  
   Example 3 
  
   reg a; 
   casez (a) 
     1'b0 : statement1; 
     1'b1 : statement2; 
     1'bx : statement3; 
     1'bz : statement4; 
   endcase 
  
   If value of variable 'a' is 1'b0 or 1'b1 or 1'bx then statement1,
    statement2 or statement3 
   will be executed respectively. If 'a' equals 1'bz or 1'b? then statement1 
   will be executed because the casez 
   statement treats z and ? as the don't-care values. Statement4 
   will never be executed because only the first case item, which 
   matches with the case expression, is executed. 
  
   Example 4 
  
   reg a; 
   casex (a) 
     1'b0 : statement1; 
     1'b1 : statement2; 
     1'bx : statement3; 
     1'bz : statement4; 
   endcase 
  
   If variable 'a' is 1'b0 or 1'b1 then statement1 
   and statement2 will be 
   executed respectively. If 'a' equals 1'bx or 1'bz or 1'b? then statement1 
   will be executed (x, z and ? are don't care values for the casex 
   statement). Statement3 and statement4 
   will never be executed. 
  
   Example 5 
  
   reg a; 
   case (1'b1) 
     a : statement1; 
   endcase 
  
   The case expression can be a constant expression. In Example 5, statement1 
   will be executed only if 'a' is equal to 1'b1. 
  
   Important Notes
  
   - 
   
    The default statement is 
    optional and it can appear only once. 
    - 
   
    The parenthesis (?) can appear in expressions and it is equal to 
    high-impedance (z) value. 
    - 
   
    If don't care values are to be ignored, then the casex 
    or casez statements should 
    be used. 
    - 
   
    The case statement can be a group of statements in the begin 
    - end block. 
    - 
   
    Both the case expression and case item expressions should have the 
    same length. 
    - 
   
    The case statement can appear only within structured procedures. 
     
  
    
 
    |