Homonyms, when talking about virtual caches, are when one virtual address corresponds to several physical addresses.
One known solution for dealing with the problem of homonyms in virtual cache, is to use physical tags for the cache; that is: index the cache with part of the virtual address, but make the tag part of the physical address. I don't understand how this works.
In my understanding, the processor is sending a virtual address to the cache. How does the processor know which physical tag to check for if it is not sending any physical tag to the cache? For example, with a normal physical cache, if you're looking to see if 00001111 exists in the cache, where the 0000 are the tag bits and 1111 are the index bits, you'll index the cache by 1111, and if you get a hit, see if the tag for index 1111 is 0000.
However, if your virtual address is 00001111, which corresponds to a physical address of, let's say, 10101010, the processor will send 00001111 to the virtual cache. How will the cache know which physical tag bits to check (1010) if those tag aren't present in the virtual address sent by the processor? Where does the physical address come from?
In simple terms, let's say VA 1 maps to 3 physical addresses: 2, 3, and 4. If my processor queries the cache with virtual address 1, how does the cache even know if it's supposed to be looking for 2, 3, and 4? Isn't it ambiguous which physical address I'm trying to find?