repeat 语句也是一种循环语句,repeat 循环语句执行指定循环数,如果循环计数表达式的值不确定,即为 x 或z 时,那么循环次数按 0 处理。repeat循环用在顺序过程,函数(function)或任务(task)等循环语句中,也是一种可综合的语句,其语法格式如下:
|
1 2 3 4 5 6 7 8 9 |
<span style="color: #800080;">repeat</span>(表达式) <span style="color: #800080;">begin</span> 执行语句0; 执行语句1; ... 执行语句n; <span style="color: #800080;">end</span> |
如果只有一条语句,关键字begin,end也可以省略。表达式可以是数值,变量或由运算符组成的表达式,但表达式最终的结果应该为常数。
例1:利用repeat 循环语句实现参数化乘法器
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
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 测试程序
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 |
`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)
|
1 2 3 4 5 6 |
else begin if(a == 2**WIDTH-1) b = b + 1; a = a + 1; end |
(2)
|
1 2 3 4 5 6 |
else begin a = a + 1; if(a == 2**WIDTH-1) b = b + 1; end |
(3)
|
1 2 3 4 5 6 |
else begin a <= a + 1; if(a == 2**WIDTH-1) b <= b + 1; end |
2. 用repeat语句编写迭代次数为常数的累加器。
对应视频: