begin 。。。end之间是顺序执行的 但是你这里又是非阻塞赋值 又是for语句 就比较复杂了 不过还是可以分析出来 首先非阻塞赋值是在这个模块结束的时候一起完成赋值的 并不是下一个下降沿才执行 这个模块最后一条语句就是赋值语句 所以基本上是立即执行了 (阻塞赋值是立即执行的,如果有多个赋值,就会阻碍下一条赋值语句) 其次for语句在这里 其实是一个时钟只执行一次 就是说第一个下降沿 q[2]<=q[1],第二个下降沿q[3]<=q[2], 这样理解下来 其实begin。。。end之间只有一条语句 也就没有什么顺序不顺序 先后次序的事情了
说了这么多 看一下运行结果就清楚了 把你的代码小小的修改了一下 如下:
module eeee (clk,a,q);
input clk;
input a;
output[6:0]q;
reg [6:0]q;
reg [2:0]p;
always @(negedge clk) begin
q[1] <= a;
for(p=1;p<6;p=p+1)
q[p+1]<=q[p];
end
endmodule
是的,也就是下一个clk的下降沿赋值