How do I make this Coroutine loop run accordingly in Update()?

The line ~

> transform.position = Vector3.MoveTowards(position[piecePos],
> position[piecePos++], speed *
> Time.deltaTime);

…is being executed too many times till the end position until Out Of the Bounds, irrespective of loop. But I want to run the loop only as conditioned.

IEnumerator PieceMove()
    {
            for(int i = 0; i < dice.num; i++)
            {
                transform.position = Vector3.MoveTowards(position[piecePos], position[piecePos++], speed * Time.deltaTime);
                yield return new WaitForSeconds(0.5f);
                dice.rolled = false;
            }
    }

    void Update()
    {
        if(dice.rolled)
        {
        StartCoroutine(PieceMove());
        }
    }

dice.num is the number came on the die. I want to make my piece go one by one to the blocks. FOr example - 5 blocks forward if 5 came on the die.
piecePos is the position of the piece.
dice.rolled is the boolean to check if the die rolled.