Your code could consist of a fsm which may contain a
>> when x =>
This particular section of the code may never execute. With line coverage/fsm coverage or whatever... you're looking at the code that is exercised during the simulation. If you provide a sequence of events that may or may not exercise the above example.
Whereas functional coverage is often associated with achieving a task. Does my calculator calculate x + y? answer yes/no. The fact that there may be thousands of lines that do not get executed is irrelevant.
If you want to thoroughly test your code you may be interested in tools like Mentors questasim qverify. This verification tool provides an application called autochecker, which will simulate all aspects of the code to see if errors exist. Even cases where you have a fsm where certain states will never get implemented. It will flag up instances where you may have no transition to a state, because you don't have an assignment. etc. These are the certain parts of your code that you'll never get with your functional test, because you can pass your functional test without ever needing to transition to sate x.