对systemverilog/verilog中forever语法的理解
1、forever后面有无分号的区别
考虑下面两段代码:
其中只有一处不同,下面的代码片段中,forever @(posedge clk)后面没有分号,当每个clk时钟上升沿到来时,begin ... end语句都会执行。
initial beginforever @(posedge clk)beginwait(a==1 && b==1 && c==1);$display("a==1 && b==1 && c==1");endend
考虑下面这段代码,forever @(posedge clk);后面有分号,那么forever @(posedge clk);后面是空语句,begin ... end语句将永远不会执行。
initial beginforever @(posedge clk);beginwait(a==1 && b==1 && c==1);$display("a==1 && b==1 && c==1");endend
2、forever后面有无begin ... end 语句
考虑下面的代码,forever @(posedge clk)后面没有分号,addr<=addr+1;没有在begin ... end中,那么每当clk上升沿到来时,只会执行addr<=addr+1;begin ... end 语句将永远不会执行。
logic [9:0] addr=0;initial beginforever @(posedge clk)addr<=addr+1;beginwait(a==1 && b==1 && c==1);$display("a==1 && b==1 && c==1");endend
考虑下面的代码,forever @(posedge clk)后面没有分号,每一个时钟上升沿到来时,forever后面的begin ... end语句都会执行。
logic [9:0] addr=0;initial beginforever @(posedge clk)beginaddr<=addr+1;wait(a==1 && b==1 && c==1);$display("a==1 && b==1 && c==1");endend
综上所述,如果希望forever后面的语句执行,第一:forever语句后面不要加分号;第二:forever语句后面执行的语句,用begin ... end语句包含进来。