It’s not to get confused with EN/RD, from conceptual point of view when co-related information bits cross clock boundaries, we need to be careful, we can use different strategies depending on complexities of design, for example if you have 3 bits, you can use gray codes so that only one bit changes, otherwise if two bits are changing at the same time, then there is danger that it may latch wrong values (different arrival time via different sync flops routes in destination). By just changing one bit and keeping other bits constant, we properly latch values in receiving domain. One can use other strategies e.g. FIFO, state machine, closed-loop etc for multi-bit crossings. You may wanna watch other lectures where I discuss other clock crossing strategies. Hope that helps!
could it be that EN/RD is just not a suitable example for this? eg. moving an increasing memory pointer from one clock domain to another one might be a better example (for greycode) to understand this?
It seems to me that due to EN/RD you are getting confused, you said that first enable EN and then RD follows, I assume that it is consistent that when EN is enabled then after one clock RD is enabled and that is used for some handshake, that many not be a good example of gray code. Lets say another example, suppose you may wanna pass an array[2:0] across clock domains, you may wanna use gray code technique. Memory pointers are another example, I discussed this in FIFO lecture, you may wanna check that.