The MEASURE FREQ method just does cycle counting over a specified time span to estimate frequency. Thus for it to be accurate, Xyce needs to clearly be able to identify an ON and OFF part of a signal.
Since the off and on values in your example are the same "on=1.65 off=1.65" Xyce is using a tolerance value called MINVAL (see the Xyce Reference guide page 57) to separate off and on. This looks like it causing some under counting in the MEASURE FREQ method. By making on=1.7 and off 1.4 I get results closer to the 50MHz that it should be:
***** Measure Functions *****
OSCF400 = 4.875000e+07
Measure Start Time= 0.000000e+00 Measure End Time= 4.000000e-07
OSCF200 = 5.000580e+07
Measure Start Time= 0.000000e+00 Measure End Time= 2.000000e-07
OSCF100 = 5.006897e+07
Measure Start Time= 0.000000e+00 Measure End Time= 1.000000e-07
OSCPER = 9.964783e-11
Measure Start Time= 0.000000e+00 Measure End Time= 4.000000e-07
I would think that the measure over the longer time span would be the most accurate but the simulation begins and ends on a "ON" part of the pulse. So the OSCF400 measure is missing a cycle and only counting 19 out of the 20 pulses that are in the simulation. Knowing that the last cycle is missed, I can make the on/off setting for the measure to be on=1.7 off=3.1 and then I'm counting just the rise and top part of the signal. With that I get a much better OSCF400
OSCF400 = 5.000000e+07
Measure Start Time= 0.000000e+00 Measure End Time= 4.000000e-07
OSCF200 = 5.000580e+07
Measure Start Time= 0.000000e+00 Measure End Time= 2.000000e-07
OSCF100 = 5.006897e+07
Measure Start Time= 0.000000e+00 Measure End Time= 1.000000e-07
OSCPER = 9.964783e-11
Measure Start Time= 0.000000e+00 Measure End Time= 4.000000e-07
Good luck,
Rich