According to the description of grant_queued_locks function in UVM 1.1d, it should grant any non-blocked locks that are at the top of the arbitration queue. However, what it appears to be doing is granting the first non-blocked lock in the queue, wherever it is. The function simply traverses the arbitration queue from the top and once it finds a non-blocked lock, it removes it to the queue and adds it to the lock list.
As far as I can see, that's not the desired behaviour -- locks should be arbitrated in-order with other requests, and should not have a higher priority than others.
I have a scenario where I have 3 sequences arbitrating for one sequencer. Two of them are making <lock><txn><txn><unlock> requests, while the third is just issuing normal transactions. That third sequence is starved, as one of the other two always has a pending lock that wins over it.
Looking at the UVM 1.2 code, I can see that this function has been re-written and will properly jump out if the first request in the queue is not a lock. Is this a (known) bug in UVM 1.1? I can't find any mention of it in Mantis...