当前位置:   article > 正文

Verilog 顺序块、并行块,阻塞过程赋值、非阻塞过程赋值的区别_顺序块和并行块的区别

顺序块和并行块的区别

顺序块:顺序块中的语句执行都是从上到下顺序执行,和C语言执行过程一样,关键词是begin、end。

  1. initial begin//顺序块关键字
  2. tb_sel = 1'b0;
  3. #5 tb_in1 = 1'b1;//时刻5执行
  4. #10 tb_in2 = 1'b1;//时刻15执行
  5. #20 tb_sel = 1'b1;//时刻35执行
  6. end

 

 上图为顺序块仿真时序图,可以看到,信号tb_in1在5ns时发生跳变,tb_in2的赋值在上一语句tb_in1执行完后延迟10ns后才发生跳变。同样的,信号tb_sel在延迟35ns后跳变。

并行块:并行块中的语句执行是同时进行,执行时间仅取决于当前语句的延迟,关键词是fork、join。

  1. initial fork//并行块关键字
  2. tb_sel = 1'b0;
  3. #5 tb_in1 = 1'b1;//时刻5执行
  4. #10 tb_in2 = 1'b1;//时刻10执行
  5. #20 tb_sel = 1'b1;//时刻15执行
  6. join

 可以看到并行块中的语句在仿真开始时同时执行,每条语句的赋值时间仅取决于当前语句的延迟。

阻塞过程赋值:下调语句执行前,当前语句必须执行完成,赋值符号“=”。

  1. initial begin//顺序块关键字
  2. tb_sel = 1'b0;
  3. #5 tb_in1 = 1'b1;//时刻5执行
  4. #10 tb_in2 = 1'b1;//时刻15执行
  5. #20 tb_sel = 1'b1;//时刻35执行
  6. end

非阻塞过程赋值:非阻塞语句在执行时,计算右侧的值,然后在预定时间将右侧的值赋值给左值,它在计算出右值后不会阻塞下一条语句的执行,赋值符号“<=”。

  1. initial begin//顺序块关键字
  2. tb_sel <= #5 1'b0;
  3. tb_in1 <= #5 1'b1;
  4. tb_in2 = #10 1'b1;
  5. tb_sel <= #20 1'b1;
  6. end

上图的程序执行过程为:仿真开始时,仿真器读取第一条语句的右值并保存,然后继续往下执行读取第二条语句的右值,保存后继续向下执行第三条语句,与上两条语句不同的是,第三条语句读取后不会向下继续执行,而是要延迟10ns将右值赋值给左值后才继续执行第四条语句,要注意的是,第一和第二条语句的右值会在第5ns时将右值赋值给左值,第四条语句先读取右值,延迟20ns后赋值给左值,此时仿真器运行到第30ns。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Cpp五条/article/detail/614359
推荐阅读
相关标签
  

闽ICP备14008679号