IC学习笔记15——For和Generate使用

一、For的使用

for循环的一般形式

  integer  i; 
  for(  i=0 变量的初始值; i<16 循环的继续条件; i=i+1 循环的步进操作)
  begin
     每次循环的操作……
  end

其中变量i要定义为integer型,不能定义为reg类型。

此外,for是可以综合的,但是变量的初始值、循环的继续条件和循环的步进操作必须都是已知的值,不能是变量,否则是无法综合的。

下面展示一个简单的for使用场景

        module for_add(
			 input            [4:0]     a,
			 output     reg   [8:0]   sum
			);
			
			parameter n = 3'd3;
			
			integer  i ;
			always @ (*)
			begin
					 sum = 1 ;
					 for( i=0; i<n; i=i+1 )
					 sum= sum+a ; 
			end
			endmodule

电路图如下所示
在这里插入图片描述
所以由电路图可知

           always @ (*)
			begin
					 sum = 1 ;
					 for( i=0; i<n; i=i+1 )
					 sum= sum+a ; 
			end

等效于

        always @ (*)
			begin
					 sum = 1 ;
					 sum1= sum+a ; 
					 sum2= sum1+a ; 
					 sum3= sum2+a ; 
			end

二、Generate的使用

generate的主要⽤法就是两种,第⼀是构造循环结构,例如多次实例化某个模块,或者是进⾏连线;第⼆种是通过if-generate或者case-generate来在多个代码块之间最多选择一个作为综合的rtl代码

2.1构造循环结构

首先设计一个半加器

	module half_adder(
			            input   A,B,
			            output  s,cout
			          );
			            assign  cout=A&B;
			            assign    S =A⊕B;
    endmodule

下面对这个半加器例化N次

    module N_half_adder
                 #( parameter N=2)
                 (
                   input [N-1:0] A,B,
                   output [N-1:0] s,cout
                 );
        genvar i;
        generate
            for(i=0;i<N;i=i+1)
            begin:inst_rtl
             half_adder u0(.A(A[i]),.B(B[i]),.s(s[i]),.cout(cout[i]));
             end
        endgenerate
        endmodule

仿真器会通过generate for begin后⾯的名字标识来⽣成结构

电路图如下所示
在这里插入图片描述

2.2 代码块选择

2.2.1 generate if

首先设计一个半加器

	module half_adder(
			            input   A,B,
			            output  s,cout
			          );
			            assign  cout=A&B;
			            assign    S =A⊕B;
    endmodule

在设计一个全加器

     module full_adder(         
                        input   A,B,cin,
                        output   s,cout  
                                  );
                         assign  cout=(A^B)&cin+A&B;
		                 assign   s =A^B^cin;
               endmodule

使用generate if ()进行代码块选择,其中generate if中的条件必须是参数

 module select_design(         
                    input   A,B,cin,
                    output   s,cout  
                              );
 parameter   USE_CASE = 0;
 generate
  	if (USE_CASE)
            half_adder u0(.A(A),.B(B),.s(s),.cout(cout));
    else
            full_adder u0(.A(A),.B(B),.cin(cin),.s(s),.cout(cout));
  endgenerate	
endmodule

当USE_CASE = 0时电路图如下:
在这里插入图片描述当USE_CASE = 1时电路图如下:
在这里插入图片描述

2.2.2 generate case

generate case语句和generate if语句用法无异,和普通的if与case一致,if具有优先级,case没有优先级。

  generate
	  	case(USE_CASE)
	        0:half_adder u0(.A(A),.B(B),.s(s),.cout(cout));
	        1:full_adder u0(.A(A),.B(B),.cin(cin),.s(s),.cout(cout));
	    endcase
 endgenerate	

三、参考文献

【Verilog】generate和for循环的一些使用总结(1)
Verilog初级教程(12)Verilog中的generate块
verilog中for循环

  • 5
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值