I want to understand how different constructs in VHDL code are synthesized in RTL.
- Can anyone tell me the difference between If-Else construct and Case statement constructs of a process in VHDL in terms of how the code is inferenced into RTL circuit by the synthesis tool ?
- Do consider the case of multiple nested if-else and mixing case-statements with if-else construct inside a process.
- Also when to use which construct ?
PS: I have seen a related question "Multiple if statements in process in vhdl" but that doesn't answer my question in anyway.
Answer
Can anyone tell me the difference between If-Else construct and Case statement constructs of a process in VHDL in terms of how the code is inferenced into RTL circuit by the synthesis tool ?
The if-elsif-else
construct infers a priority routing network:
simulate this circuit – Schematic created using CircuitLab
This corresponds to
if bool_expr_1 then
sig <= val_expr_1;
elsif bool_expr_2 then
sig <= val_expr_2;
elsif bool_expr_3 then
sig <= val_expr_3;
else
sig <= val_expr_4;
end if;
The case
construct, on the other hand, infers a big ol' mux:
This corresponds to
case case_expr is
when c0 =>
sig <= val_expr_0;
when c1 =>
sig <= val_expr_1;
when c2 =>
sig <= val_expr_2;
...
when others =>
sig <= val_expr_N;
end case;
Obviously these are very simplified designs with only one value expression, resulting in one output.
Do consider the case of multiple nested if-else and mixing case-statements with if-else construct inside a process.
Per the above, you can see how they would nest/mix.
Also when to use which construct ?
Since if-else
infers priority, it should be used when more than one input condition could occur. Using case
, one the other hand, is appropriate when the inputs are mutually exclusive.
No comments:
Post a Comment