You get Fly in Cianwood. You recieve it after you defeat Chuck and get the badge. Then, once you exit the gym, someone shall give it to you.
I answered the same question here
Although it says HeartGold and you are asking about SoulSilver, they are exactly the same
After you beat Gym Leader Chuck (in Cianwood City), his wife outside of his gym will give you Fly
The woman in front of the gym gives it to you after you defeat chuck and exit the gym at cianwood city