--- Quote Start ---
So can I conclude there is no such thing as sequential signal assignment in VHDL?
In most books and online tutorials, e.g. in RTL Hardware Design by Prof Chu, it is written "The syntax of a sequential signal assignment is identical to that of the simple concurrent signal assignment of Chapter 4 except that the former is inside a process"- Page 100. In book, he discussed about assignment to same signal multiple times in a process which results in only last assignment take effect. I can understand that. But what is missing in that book and in all of the online tutorials I have seen so far is example/discussion of sequential signal assignment to multiple signals. It seems there is no difference between sequential signal assignment and concurrent signal assignment in that case, but then why we have sequential signal assignment in the first place and if it is (I mean sequential assignment) executed same as concurrent assignment then why name it different?
--- Quote End ---
I think you need to understand - all VHDL is sequential code. All code inside a process is sequential - this is how variables work. But multiple assignments to the same signal sequentially in the same delta will cause the signal assignment to get overridden. I think where you might be getting confused is the fact that all code you've posted is for synthesis. Now lets take a behavioural (non synthesisable example).
process
begin
ip <= '1';
op <= ip;
wait for 0 ns; -- wait for a single delta
ip <= '0';
op < =ip;
wait;
end process;
Now, if you did not do the second signal assignment, op would be stuck at 'U'.
because of the way signals work, and all communication between processes is done with signals - you can guarantee the order in which things will occur. But you can do things in VHDL where cannot guarantee what order they work - it will come down to how the code was compiled that you have little to no control over:
shared variable sv : std_logic := '1'; --'93 shared variable
process(clk)
begin
if rising_edge(clk);
sv := not sv;
end if;
end process;
process(clk)
begin
if rising_edge(clk) then
op <= sv;
end if;
end process;
Now, you do not know whether op will take the current inverted value, or the value pre inversion in the current delta. It will depend how the compiler compiled the code.