The counter should perfectly work. But how you are reading the result?
If you read it from an unrelated clock domain, you should expect accidentally inconsistent data due to timing violations in the domain crossing data transfer. There are several ways to overcome the problem. In case of a counter, transferring gray encoded data is the most simple one. According to the low count rate of > 70 ns, you could also synchronize the pulse event to the system clock domain and count it therein. It's always easier to transfer a single a bit correctly between clock domains than a data word.