repeat 语句也是一种循环语句,repeat 循环语句执行指定循环数,如果循环计数表达式的值不确定,即为 x 或z 时,那么循环次数按 0 处理。repeat循环用在顺序过程,函数(function)或任务(task)等循环语句中,也是一种可综合的语句,其语法格式如下:
repeat(表达式) begin 执行语句0; 执行语句1; ... 执行语句n; end
如果只有一条语句,关键字begin,end也可以省略。表达式可以是数值,变量或由运算符组成的表达式,但表达式最终的结果应该为常数。
例1:利用repeat 循环语句实现参数化乘法器
module para_mult
#(parameter WIDTH = 4)
(
input [WIDTH-1:0] a, b,
output reg [2*WIDTH-1:0] p
);
reg [WIDTH*2-1:0] a_r; //注意a_r的宽度一定要是a的宽度的两倍,否则在 //左移时会丢失数据。
reg [WIDTH-1:0] b_r;
always@(a,b)
begin
p = 0;
a_r = a;
b_r = b;
repeat (WIDTH)
begin
if(b_r[0])
p = p + a_r;
a_r = a_r << 1; //左移一位
b_r = b_r >> 1; //b_r右移1位,判断b_r[0]是否累加
end
end
endmodule
Testbench 测试程序
`timescale 1 ns / 1 ps
module tb_test ();
parameter Period = 20;
parameter WIDTH = 8;
reg clk;
initial
begin
clk = 0;
forever
#(Period/2) clk = ~clk;
end
reg rst;
reg [WIDTH-1:0] a, b;
wire [2*WIDTH-1:0] p;
initial
begin
rst = 1'b1;
#20
rst = 0;
end
always@(posedge clk or posedge rst)
if(rst)
begin
a = 0;
b = 0;
end
else
begin
if(a == 2**WIDTH-1)
b = b + 1;
a = a + 1;
end
para_mult #(.WIDTH(WIDTH))
para_mult_inst
(
.a (a),
.b (b),
.p (p)
);
endmodule
Modelsim仿真波形如图1:

图1:
从仿真波形可以看出,利用repeat 配合移位与累加实现乘法运算。
for,forever,while和repeat的异同点:
| 可综合 | 可仿真 | 表达式数量 | 循环变量调整 | |
| for | 是 | 是 | 3 | 一般包含在表达式中 |
| forever | 否 | 是 | 0 | 没有循环变量 |
| while | 是 | 是 | 1 | 执行代码中调整 |
| repeat | 是 | 是 | 1 | 固定次数 |
作业:
- 比较下面三段程序有何不同:
(1)
else
begin
if(a == 2**WIDTH-1)
b = b + 1;
a = a + 1;
end
(2)
else
begin
a = a + 1;
if(a == 2**WIDTH-1)
b = b + 1;
end
(3)
else
begin
a <= a + 1;
if(a == 2**WIDTH-1)
b <= b + 1;
end
2. 用repeat语句编写迭代次数为常数的累加器。
对应视频:
老师好,请问testbench测试程序最后部分中的 para_mult #(.WIDTH(WIDTH))中的 #(.WIDTH(WIDTH)) 是什么意思?用法是怎样的?