Managing System-on-Chip (SoC) Complexity: Strategies for Scalable Design