When scheduling rules, the compiler picks a subset of rules that do not conflict with each other, so that they could all be executed within the same clock cycle. The order in which rules are considered for selection can affect the subset chosen. For example, suppose rules r1 and r2 conflict, and both are enabled. If r1 is considered first and selected, it may disqualify r2 from consideration, and vice versa.
Using the descending_urgency attribute the designer can specify that one rule is more urgent than another, so that it is always considered for scheduling before the other. The relationship is transitive, i.e., if rule r1 is more urgent than rule r2, and rule r2 is more urgent than rule r3, then r1 is considered more urgent than r3.
(* descending_urgency = "r1, r2, r3" *)
The argument of the attribute is a string containing a comma-separated list of rule names. The example above specifies that r1 is more urgent than r2 which, in turn, is more urgent than r3.
The descending_urgency attribute can be placed:
interface IfcCounter#(type t);
Rule resetCounter conflicts with rule updateCounter because both try to modify the counter register when it contains all its bits set to one. Without any escending_urgency attribute, the updateCounter rule will obtain more urgency, meaning that if the predicate of resetCounter is met, only the rule updateCounter will fire. By setting the descending_urgency attribute the designer can control the scheduling in the case of conflicting rules.