IC测试啊? 2024-07-27 14:22 采纳率: 66.7%
浏览 16
已结题

verilog语言串行与并行

" fork join " 和 “ begin end ”的区别?

fork
  regb = rega;
  regc = regb;
join
begin
  regb <= rega;
  regc <= regb;
end
  • 写回答

2条回答 默认 最新

  • 日晨难再 优质创作者: 嵌入式与硬件开发技术领域 2024-07-27 15:44
    关注

    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赋值。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

问题事件

  • 系统已结题 8月4日
  • 已采纳回答 7月27日
  • 创建了问题 7月27日