Si te entendí bien en ambos casos terminas haciendo lo mismo, pero yo lo veo conceptualmente más bien como tu primer caso.
Es decir, tengo una cache de Z Kb con N vías. Supongamos que cada línea tiene B bytes (suponemos que la línea está dividida de a bytes)
Entonces tenes L=Z/B líneas en total. Luego como hay N vías tenes L/N conjuntos. Para cada conjunto en la caché hay disponibles N líneas para cachear N bloques de memoria asociados al número de conjunto.
Sea entonces c=log2(L/N) y b=log2(B)
Ahora una dirección se decodifica
|Tag | conjunto | byte |
Donde el campo byte tiene b bits, conjunto tiene c bits y el resto es para el tag.
Cuando decodificas una dirección obtenés un número de conjunto. Luego se compara en paralelo el tag de la dirección contra los N tags asociados al conjunto en la caché para determinar si hay un hit.
Saludos,
Gustavo