当前位置:   article > 正文

verilog中关于always语句嵌套task执行顺序和@(posedge clk)执行方式的问题_verilog task内部语句执行顺序

verilog task内部语句执行顺序

首先明确一个事实

always@(posedge clk)中的任务没有执行完的情况下是不会在下一个时钟上升沿到来的时候再次重复执行的

再明确另一个事实 在前面不带always的情况下,@(posedge)仅会按顺序执行一次。

  1. task shift_in;
  2. output [7:0] shift;
  3. begin
  4. @ (posedge scl) shift[7] = sda;
  5. @ (posedge scl) shift[6] = sda;
  6. @ (posedge scl) shift[5] = sda;
  7. @ (posedge scl) shift[4] = sda;
  8. @ (posedge scl) shift[3] = sda;
  9. @ (posedge scl) shift[2] = sda;
  10. @ (posedge scl) shift[1] = sda;
  11. @ (posedge scl) shift[0] = sda;
  12. @ (negedge scl)
  13. begin
  14. #`timeslice ;
  15. out_flag = 1; //应答信号输出
  16. sda_buf = 0;
  17. end
  18. @(negedge scl)
  19. #`timeslice out_flag = 0;
  20. end
  21. endtask

上段代码中每一次时钟上升沿到来仅会按顺序执行一行。

如果在一个always语句中嵌套如上task的时候,必须等待task执行完,always语句才会执行完,才能敏感下一次时钟信号再次执行always。

而always语句中的task任务会依次等待8次上升沿和一次下降沿后才会执行完。而此期间的时钟变化不会重复执行always语句。

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

闽ICP备14008679号