Verilog中的‘repeat‘关键字:使用方法与技巧

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

参考文章:Verilog中repeat的用法_verilog repeat-CSDN博客 

目 录 译者序 前言 第1章 简介 1 1.1 什么是Verilog HDL? 1 1.2 历史 1 1.3 主要能力 1 第2章 HDL指南 4 2.1 模块 4 2.2 时延 5 2.3 数据流描述方式 5 2.4 行为描述方式 6 2.5 结构化描述形式 8 2.6 混合设计描述方式 9 2.7 设计模拟 10 第3章 Verilog语言要素 14 3.1 标识符 14 3.2 注释 14 3.3 格式 14 3.4 系统任务和函数 15 3.5 编译指令 15 3.5.1 `define和`undef 15 3.5.2 `ifdef、`else 和`endif 16 3.5.3 `default_nettype 16 3.5.4 `include 16 3.5.5 `resetall 16 3.5.6 `timescale 16 3.5.7 `unconnected_drive和 `nounconnected_drive 18 3.5.8 `celldefine 和 `endcelldefine 18 3.6 值集合 18 3.6.1 整型数 18 3.6.2 实数 19 3.6.3 字符串 20 3.7 数据类型 20 3.7.1 线网类型 20 3.7.2 未说明的线网 23 3.7.3 向量和标量线网 23 3.7.4 寄存器类型 23 3.8 参数 26 第4章 表达式 28 4.1 操作数 28 4.1.1 常数 28 4.1.2 参数 29 4.1.3 线网 29 4.1.4 寄存器 29 4.1.5 位选择 29 4.1.6 部分选择 29 4.1.7 存储器单元 30 4.1.8 函数调用 30 4.2 操作符 30 4.2.1 算术操作符 31 4.2.2 关系操作符 33 4.2.3 相等关系操作符 33 4.2.4 逻辑操作符 34 4.2.5 按位操作符 35 4.2.6 归约操作符 36 4.2.7 移位操作符 36 4.2.8 条件操作符 37 4.2.9 连接和复制操作 37 4.3 表达式种类 38 第5章 门电平模型化 39 5.1 内置基本门 39 5.2 多输入门 39 5.3 多输出门 41 5.4 三态门 41 5.5 上拉、下拉电阻 42 5.6 MOS开关 42 5.7 双向开关 44 5.8 门时延 44 5.9 实例数组 45 5.10 隐式线网 45 5.11 简单示例 46 5.12 2-4解码器举例 46 5.13 主从触发器举例 47 5.14 奇偶电路 47 第6章 用户定义的原语 49 6.1 UDP的定义 49 6.2 组合电路UDP 49 6.3 时序电路UDP 50 6.3.1 初始化状态寄存器 50 6.3.2 电平触发的时序电路UDP 50 6.3.3 边沿触发的时序电路UDP 51 6.3.4 边沿触发和电平触发的混合行为 51 6.4 另一实例 52 6.5 表项汇总 52 第7章 数据流模型化 54 7.1 连续赋值语句 54 7.2 举例 55 7.3 线网说明赋值 55 7.4 时延 55 7.5 线网时延 57 7.6 举例 57 7.6.1 主从触发器 57 7.6.2 数值比较器 58 第8章 行为建模 59 8.1 过程结构 59 8.1.1 initial 语句 59 8.1.2 always语句 61 8.1.3 两类语句在模块使用 62 8.2 时序控制 63 8.2.1 时延控制 63 8.2.2 事件控制 64 8.3 语句块 65 8.3.1 顺序语句块 66 8.3.2 并行语句块 67 8.4 过程性赋值 68 8.4.1 语句内部时延 69 8.4.2 阻塞性过程赋值 70 8.4.3 非阻塞性过程赋值 71 8.4.4 连续赋值与过程赋值的比较 72 8.5 if 语句 73 8.6 case语句 74 8.7 循环语句 76 8.7.1 forever 循环语句 76 8.7.2 repeat 循环语句 76 8.7.3 while 循环语句 77 8.7.4 for 循环语句 77 8.8 过程性连续赋值 78 8.8.
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值