Conditional Operator
Formal Definition
The conditional operator selects an expression for evaluation
depending on the value of condition.
Simplified Syntax
condition ? expression1 : expression2;
Description
If the condition is evaluated as false (or zero value) then expression2
is evaluated and used as a result of an entire expression. If condition
is evaluated as true (or non-zero value) then expression1
is evaluated. In case condition
is evaluated as x or z value, then both expresion1
and expression2 are
evaluated, and the result is calculated bit by bit on the basis of
the following table:
|
0 |
1 |
x |
z |
0 |
0 |
x |
x |
x |
1 |
x |
1 |
x |
x |
x |
x |
x |
x |
x |
z |
x |
x |
x |
x |
Table 5 Results of bit by bit calculation.
If one of the expressions is of real type then the result of the
whole expression should be 0 (zero). If expressions have different
lengths, then length of an entire expression will be extended to the
length of the longer expression. Trailing 0s will be added to the
shorter expression.
The conditional operator can be nested (Example 3) and its behavior
is identical with the case statement behavior.
Examples
Example 1
(a) ? 4'b110x : 4'b1000;
If 'a' has a non-zero value then the result of this expression is
4'b110x. If 'a' is 0, then the result of this expression is 4'b1000.
If 'a' is x value then the result is 4'b1x0x (this is due to the fact
that the result must be calculated bit by bit on the basis of the
Table 1).
Example 2
assign data_out = (enable) ?
data_reg : 8'bz;
The above example shows modeling tri-state buffers.
Example 3
reg [4:0] mux;
reg [1:0] addr;
mux = (addr == 2'b00) ? i0 :
((addr == 2'b01) ? i1 :
((addr == 2'b10) ? i2 :
((addr == 2'b11) ? i3 :
4'bz)));
case (addr)
2'b00: mux = i0;
2'b01: mux = i1;
2'b10: mux = i2;
2'b11: mux = i3;
default: mux = 4'bz;
endcase
Two different methods of modeling a multiplexer.
Important Notes
|