Yep, I rewrote the code using a "single process style" because I like that better as well, and it went away. Thanks
Cool, but I still want to emphasize the issue, because it's much more general than just applied to FSMs. And whereas I personally prefer the one-process style for FSMs, I do not like silver bullets. I do this because I find it easier to read and easier to maintain, not to avoid potential inferred latches. I guess you were mostly looking for a fix for your problem, but this raised an issue that, I think, is interesting and worthwhile to understand.
It's much more general than with just FSMs. Non-clocked processes have their uses, and the potential issue is still the same.
Actually, it can happen OUTSIDE of processes as well. Any conditional concurrent statement can lead to inferred latches if not all cases are covered, and this happens more often that one may think, especially when the number of conditions goes over 2 or 3.
Example (concurrent statement outside of a process):
Q <= A when EnA = '1' else B when EnB = '1';
You get an inferred latch, because Q must hold its value if neither EnA or EnB is '1'.
Another worthy note (IMO) is that, it may be unintentional - which means you just forgot to cover a case - but it may also be intentional. You may actually WANT Q to retain its state if neither EnA or EnB is '1'. Problem is, if you do this outside of a clocked process, you'll get a latch, as this can't be implemented any other way. And latches can cause nasty issues, especially again on FPGAs.
You may think the "fix" would just be to do this in a clocked process. Sure, but the behavior would NOT be the same. Assuming all signals *are* in the same clock domain, by putting this in a clocked process, you get a 1-cycle delay. Definitely not the same. And If all signals are NOT in the same clock domain, you'd get metastability issues. Crap. So if you were in the former case and didn't want a 1-cycle delay, you'd have to take another approach for implementing this reliably. Or master the tricky art of latches, which uh... is tricky.
A final note: sometimes you can hear of "synchronous" vs "asynchronous" processes when I prefer to say "clocked" and "non-clocked". My rationale is that the former isn't quite right IMHO. A non-clocked process can actually be fully synchronous if all signals in it are synchronous AND there is no inferred latch (latches are, per nature, not synchronous). Likewise, a clocked process using some signals that are in a different clock domain is NOT fully synchronous, and you should usually avoid doing this, except strictly for resynchronizing signals. Yet another topic. Hence why I prefer "clocked" and "non-clocked".
And to illustrate this, back to the original topic, as long as all cases are covered and there is not inferred latch, in the two-process approach for FSMs, the non-clocked process is not per se "asynchronous". At least this is how I see it.