Section 11.4.7 of the SystemVerilog LRM states ``` The && and || operators shall use short circuit evaluation as follows: - The first operand expression shall always be evaluated. - For &&, if the first operand value is logically false then the second operand shall not be evaluated. - For ||, if the first operand value is logically true then the second operand shall not be evaluated. ``` vvp currently evaluates both operands of a logical operator. This works fine as long as the right-hand side does not have a side effect. But if it has the result might be incorrect. E.g. for `a && b++` `b` must not be incremented if `a` evaluates to false. The Verilog LRM mentions that it is allowed to short circuit any expression "if the final result of an expression can be determined early". But there is no requirement to do so. So the new and the old behavior are both correct implementations in Verilog. Use the new behavior in both Verilog and SystemVerilog mode to make sure the behavior is consistent when an expression has side effects. Signed-off-by: Lars-Peter Clausen <lars@metafoo.de> |
||
|---|---|---|
| .. | ||
| COPYING.lesser | ||
| Makefile.in | ||
| README.txt | ||
| cppcheck.sup | ||
| draw_class.c | ||
| draw_delay.c | ||
| draw_enum.c | ||
| draw_mux.c | ||
| draw_net_input.c | ||
| draw_substitute.c | ||
| draw_switch.c | ||
| draw_ufunc.c | ||
| draw_vpi.c | ||
| eval_bool.c | ||
| eval_condit.c | ||
| eval_expr.c | ||
| eval_object.c | ||
| eval_real.c | ||
| eval_string.c | ||
| eval_vec4.c | ||
| modpath.c | ||
| stmt_assign.c | ||
| vvp-s.conf.in | ||
| vvp.c | ||
| vvp.conf.in | ||
| vvp_config.h.in | ||
| vvp_priv.h | ||
| vvp_process.c | ||
| vvp_scope.c | ||
README.txt
THE VVP TARGET SYMBOL NAME CONVENTIONS There are some naming conventions that the vvp target uses for generating symbol names. * wires and regs Nets and variables are named V_<full-name> where <full-name> is the full hierarchical name of the signal. * Logic devices Logic devices (and, or, buf, bufz, etc.) are named L_<full_name>. In this case the symbol is attached to a functor that is the output of the logic device. GENERAL FUNCTOR WEB STRUCTURE The net of gates, signals and resolvers is formed from the input design. The basic structure is wrapped around the nexus, which is represented by the ivl_nexus_t. Each nexus represents a resolved value. The input of the nexus is fed by a single driver. If the nexus in the design has multiple drivers, the drivers are first fed into a resolver (or a tree of resolvers) to form a single output that is the nexus. The nexus, then, feeds its output to the inputs of other gates, or to the .net objects in the design.