The visitors reached 705-7 at tea on the fourth day at the Zahur Ahmed Chowdhury Stadium, easing past Bangladesh's first innings total of 513.
Taijul Islam bowled Dinesh Chandimal for 87 off the third ball after lunch before off-spinner Mehidy Hasan removed Niroshan Dickwella for 62 to slow down Sri Lanka's progress.
Debutant left-arm spinner Sunzamul Islam then got his maiden Test wicket, trapping Dilruwan Perera leg-before for 32.
Perera earlier escaped on four with the first successful review of the game after he was given out leg-before by the on-field umpire off Hasan.
More From This Section
He made 109 off 230 balls before becoming the first batsman dismissed on the day.
Silva was Sri Lanka's third centurion of the innings after Kusal Mendis and Dhananjaya de Silva, who made 196 and 173 runs respectively.
Hasan ended Silva's impressive innings when the right- hander edged a low delivery to wicketkeeper Liton Das.
Silva shared a 135-run stand with skipper Dinesh Chandimal for the fourth wicket and hit six fours and a six.
Bangladesh had the chance to dismiss Chandimal on 79 but Liton dropped a catch down the leg side off Hasan.
Dickwella made Bangladesh pay for the miss as he hit the next two balls for fours, the second one taking Sri Lanka past 600 runs.