Holders Juventus booked their ticket to the Italian Cup final for the fourth year in a row to set up a meeting with AC Milan after a 1-0 win over Atalanta in a semi-final second leg tie played in the snow in Turin on Wednesday.
The first leg ended 1-0 in Bergamo thanks to an early Gonzalo Higuain goal, and Juventus also won the second when Miralem Pjanic slotted in a 75th-minute penalty awarded after Blaise Matuidi was fouled in the box.
The three-time holders will play AC Milan who battled past Lazio 5-4 on penalties in the Stadio Olympico after their semi-final remained goalless after extra time.
Nikola Kalinic almost scored the winner after 117 minutes of deadlock but sent the ball over the bar when alone in front of goal, sending the game to penalties.
AC Milan could thank the saves of teenage goalkeeper Gianluigi Donnarumma for their ticket to the final in Rome on May 9 with centre-back Alessio Romagnoli slotting in the winning penalty.
The win extends coach Gennaro Gattuso's unbeaten streak with AC Milan to 13 games, with six straight wins.
Five-time winners Milan last won the Cup in 2003, with their last final in 2016.
Juventus and Atalanta were meant to play on Sunday in Serie A action, but that fixture was snowed off, and it was still snowing lightly in the Allianz Stadium.
"Compliments to the lads for what they did tonight and are doing this season," said coach Massimiliano Allegri.
It will be a record 18th final for Juventus with Allegri's side bidding for a 13th Cup in total.
"We will play in a historical stadium, but it must not become an obsession," continued the Juventus coach of their bid for a record fourth Cup crown.
"In the first half, we had difficulty closing them down, after the break Douglas Costa started playing in a centre-forward role and that broke the game open."
Higuain missed out as he recovers from a sprained ankle with fellow Argentine Paulo Dybala coming off the bench after 11 minutes.
Atalanta had come out firing with Alejandro Gomez sending the ball over the bar with Gianluigi Buffon tested as he latched on to Josip Ilicic's deflected cross pushing over the top.
Costa was at the centre of the action with the hosts' first chance coming after a quarter of an hour but Matuidi failed to get to finish off a Pjanic free kick.
Gomez thought he had scored the equaliser for Atalanta after the break with Buffon off the line, lobbing the Juventus captain, only for the ball bounced off the outside off the post.
The breakthrough came when Juventus were awarded a penalty when Matuidi went down under pressure from defender Gianluca Mancini, with Pjanic slotting in to the fury of Atalanta coach Gian Piero Gasperini.
"That penalty was non-existent," blasted Gasperini as his side missed out on their bid for just a second Cup title after 1963.
"We mustn't get downhearted. We came a little closer to the Bianconeri," he added, with their rescheduled Serie A fixture against Juventus in Turin on March 14.
AC Milan and Lazio battled for 220 minutes in total between the San Siro and the Stadio Olympico in a tie between two ambitious sides who have rediscovered their form in Serie A and the Europa League.
Lazio threatened early with AC Milan staying in the game thanks to Donnarumma who tipped over a Ciro Immobile shot within the first five minutes and then denied Sergej Milinkovic-Savic with his legs.
Lazio goalkeeper Thomas Strakosha also did well to clear a Suso shot after a quarter of an hour, but almost created an own goal by badly clearing Hakan Calhanoglu freekick.
Both sides had their chances in the second half with Davide Calabria forcing a Strakosha save with Calhanoglu taking his chances as Suso waited for the cross.
Milinkovic-Savic also missed a chance in the final minute with a Felipe Anderson counter-attack too late as the whistle blew for extra time.
After their gruelling match, both sides face tough weekends in Serie A with Lazio hosting Juventus and AC Milan playing their derby against city rivals Inter Milan.