What does "control_set_opt_threshold" do, and how does it work?
Are there differences between 2013.2 and 2013.3?
Control sets include synchronous set/reset and clock_enable. "control_set_opt_threshold" is the number of fanouts necessary to move the control sets into the D logic of the register, and the simple rule of thumb is, the "control_set_opt_threshold" should be less than the fanout for LUT insertion not to occur, and in which case the control sets of the FFs will directly be used. If the fanout is less than "control_set_opt_threshold", then LUT insertion will occur for emulating the control sets behavior, and the control sets are passed via the LUT to the D logic of a register. However, following are some things to note:
In 2013.2 and for fanouts < 20, LUTs are inserted irrespective of whether fanouts are greater or lesser than the "control_set_opt_threshold". This behavior is not correct. There was an issue with respect to threshold in 2013.2 and this has been fixed in 2013.3.
In 2013.3 and for fanouts < 20, LUTs are inserted when "control_set_opt_threshold" is greater than the fanout, and the control sets are directly connected to FFs when the fanout is greater than the "control_set_opt_threshold".
In 2013.2 for fanouts > 20, the behavior with refernce to either instantiating LUTs for emulating the controls sets behavior and the behavior with reference to connecting the control sets directly to the FFs are seen as expected. However, in 2013.3, this is not quite the case as there is another threshold which is being considered in addition to the "control_set_opt_threshold" when making the decision calculation and this is the number of flops that are modified.
The number of flops modified by the optimization is bounded by max(20, min(0.02*num_flops_in_design, 5000)). That is, for designs containing less than 1000 flops, a maximum of 20 flops are modified. For designs containing >1000 but less than 250K flops, a maximum 2% of the flops are modified and for designs larger than 250K flops, a maximum 5K flops are modified. This expected behavior needs further introspection, and as such customers expectations when using "control_set_opt_threshold" will not always be met for fanouts greater than 20. A CR has been created to allow the customer/user to have the power they expect when using "control_set_opt_threshold".
It must also be noted that "control_set_opt_threshold" is a global setting on the design and as such can be difficult to avoid. In cases where customer do not want it to have an effect, then they can use "dont_touch" on that signal in 2013.3. Please note the "dont_touch" does not work as expected in 2013.2 and cannot be used in this scenario.
It is also worth mentioning that a CR has been created for the scenario when the fanout is 1 and the "control_set_opt_threshold = 1" and in which case a LUT is inserted on the control set signal. However, in other scenarios for "control_set_opt_threshold" greater than 1 where "control_set_opt_threshold" is equal to the fanout no LUT is inserted. The CR has been created for consistency in the tools to make sure that consistent outcome is produced when fanout equals threshold.
In 2013.4, the above mentioned issues that occurred in 2013.3 related to fanout > 20 and the non-consistent outcome produced when fanout and threshold equaled '1' have been resolved.