" fork join " 和 “ begin end ”的区别?
fork
regb = rega;
regc = regb;
join
begin
regb <= rega;
regc <= regb;
end
" fork join " 和 “ begin end ”的区别?
fork
regb = rega;
regc = regb;
join
begin
regb <= rega;
regc <= regb;
end
关注fork块语句和begin块语句,都是将多个语句组织起来。它们的不同在于,对于fork块,仿真器可以使用任何顺序调度其中的语句,因此执行顺序是不确定的。而对于begin块,仿真器保证了语句是从上到下一条一条执行的。
用你的例1来说
fork
regb = rega;
regc = regb;
join
其中哪条语句先执行是不确定的,因此如果regb = rega;先执行,regc = regb;后执行,则regc和regb得到的都是rega;如果regc = regb;先执行,regb = rega;后执行,则regc首先得到regb的值,随后regb得到rega的值。
对于例2
begin
regb <= rega;
regc <= regb;
end
首先要知道,非阻塞赋值分为两步,首先是<=右表达式的求值,当这一步完成后(当作已执行),继续执行下一条语句(在你的例2中,begin块的下一条语句就是下一行的语句),等到当前仿真时间的所有语句都执行了,再按照顺序,执行<=的赋值。所以,执行顺序为,rega求值,regb求值,regb赋值,regc赋值。