How is the Constraint : x == y == z; evaluated?

Can someone please tell me how is the below constraint evaluated. In particular why did l, m and n not get equal values.
Please note that I understand that if i use: {l==m; m== n;} I will get same values for the three variables. But I want to know why the result(see below) is the way it is.
Thanks


class A;
  rand int l,m,n;
  
  constraint c1{
    l == m == n;
  }
      
  function void printAll; 
    $display("[%0t] l: %x m: %x n: %x \n", $time, l, m ,n);
  endfunction
  
endclass

module top;
  initial begin
    A u_A;
    u_A = new;
    u_A.randomize();
    u_A.printAll();
  end
endmodule

Result:

KERNEL: [0] l: 9bb91bf1 m: 16647035 n: 00000000

KERNEL:

KERNEL: Simulation has finished. There are no more test vectors to simulate.

exit

I remember something about this particular syntax, but I cannot find it in any of my documentation. If I had to guess, I would say since == is a binary operator, and it is evaluated left to right that the first two values are compared, and because the result is “not equal” (or false), then the following compare would be False == n, which, since N is 0000 is true and thus the end result is a “pass” on the constraint.
If you know where this example is in some documentation, then a reference would be appreciated.

In reply to DavidEllis:

Correct. the expression is evaluated like ( l == m ) == n. There result of l == m can either be 1’b0 or 1’b1. I don’t have time to do the math, but the probability on 1’b1 = n is very small, so it would appear that n is always 0.

In reply to dave_59:

Thanks. Your answer makes sense.