1.基本语法
在Verilog中,repeat
语句用于重复执行一段代码指定的次数。需要注意的是,repeat
语句只能在initial
块或always
块中使用,不能在其他块中使用。同时,repeat
语句中的循环计数表达式n
必须是常数或常量表达式,其值在编译时必须能够确定。如果循环计数表达式的值不确定(即为 x 或z 时),那么循环次数将按0处理。
repeat (n) begin
// 待执行的语句块
end
其中,n
表示需要重复执行的次数,// 待执行的语句块
表示要重复执行的代码块。
在可综合设计中, “循环次数表达式”必须在程序编译过程中保持不变。
2.一般用法举例
2.1 Example1:
repeat (3) @(posedge clk)
adder1<=adder1+1;
Example1中,每当到来一个时钟上升沿时,都会执行一次adder1<=adder1+1;
2.2 Example2:
repeat (3) @(posedge clk);
adder1<=adder1+1;
Example2中,repeat (3) @(posedge clk);语句后有一个分号,也就是空语句,什么都不执行,当遇到3次时钟上升沿后,才会执行adder1<=adder1+1语句。
3.其它用法举例
3.1 语句块包含task语句
repeat(循环次数表达式)
begin
语句块;
end
语句块可以包含task、function、for等语句,如下所示,是包含task的示例,将task任务执行10次:
`timescale 1ns / 1ps
module tb;
reg clk,rst,in;
wire out;
initial
begin
clk=0;
rst=0;
in =0;
#100 rst=1;
repeat (10)
begin
sim();
end
end
always #5 clk=~clk;
task sim;
begin
repeat(10) @(posedge clk);
in=0;
repeat(10) @(posedge clk);
in=1;
repeat(10) @(posedge clk);
in=0;
repeat(10) @(posedge clk);
in=1;
repeat(10) @(posedge clk);
in=0;
repeat(10) @(posedge clk);
in=1;
end
endtask
Top inst(.clk(clk),.rst(rst),.in(in),.out(out)
);
endmodule
3.2 语句块包含for语句
`timescale 1ns / 1ps
module tb;
reg clk,rst,in;
wire out;
integer i;
initial
begin
clk=0;
rst=0;
in =0;
#100 rst=1;
repeat (10)
begin
//sim();
for (i=0;i<100;i=i+1)
begin
@(posedge clk)
in<=~in;
$display("the simulation time is %d\n",$time);
end
end
end
always #5 clk=~clk;
task sim;
begin
repeat(10) @(posedge clk);
in=0;
repeat(10) @(posedge clk);
in=1;
repeat(10) @(posedge clk);
in=0;
repeat(10) @(posedge clk);
in=1;
repeat(10) @(posedge clk);
in=0;
repeat(10) @(posedge clk);
in=1;
end
endtask
Top inst(.clk(clk),.rst(rst),.in(in),.out(out)
);
endmodule