Verilog中顺序语句begin……end中的语句是怎么执行的?是不是一条语句执行完才会执行下一条语句呢?

2024-11-06 08:15:42
推荐回答(2个)
回答1:

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

回答2:

是的,也就是下一个clk的下降沿赋值