verilog中关于always语句嵌套task执⾏顺序和
@(posedgeclk)执⾏⽅式的问题
⾸先明确⼀个事实
always@(posedge clk)中的任务没有执⾏完的情况下是不会在下⼀个时钟上升沿到来的时候再次重复执⾏的
再明确另⼀个事实 在前⾯不带always的情况下,@(posedge)仅会按顺序执⾏⼀次。
task shift_in;
ariyaoutput [7:0] shift;
begin
@ (posedge scl) shift[7] = sda;
@ (posedge scl) shift[6] = sda;
@ (posedge scl) shift[5] = sda;土拨鼠自行车顶级大牌
@ (posedge scl) shift[4] = sda;
新日电动车质量@ (posedge scl) shift[3] = sda;
@ (posedge scl) shift[2] = sda;
@ (posedge scl) shift[1] = sda;
杭州限行时间@ (posedge scl) shift[0] = sda;
大众老总车祸@ (negedge scl)
begin
#`timeslice ;
out_flag = 1; //应答信号输出
sda_buf = 0;
end
超豪华房车@(negedge scl)
#`timeslice out_flag = 0;
end
endtask
上段代码中每⼀次时钟上升沿到来仅会按顺序执⾏⼀⾏。
如果在⼀个always语句中嵌套如上task的时候,必须等待task执⾏完,always语句才会执⾏完,才能敏感下⼀次时钟信号再次执⾏always。
⽽always语句中的task任务会依次等待8次上升沿和⼀次下降沿后才会执⾏完。⽽此期间的时钟变化不会重复执⾏always语句。