verilog generate 生成语句

循环生成
1.generate不放在always块中,而是always块等包含在generate中。
2.generatefor 的名字放在for的begin后面,不要忘记加:
3.task不能放在generatefor中,要想实现同样的功能,用子模块
循环生成的主要目的是简化我们的代码书写,利用循环生成语句我们可以将之前需要写很多条比较相似的语句才能实现的功能用很简短的循环生成语句来代替。基本语法如下:

genvar ;
generate
for (=0; < ; =+1)
begin: 

end
endgenerate

关于以上语法有四点注意:
1、循环生成中for语句使用的变量必须用genvar关键字定义,genvar关键字可以写在generate语句外面,也可以写在generate语句里面,只要先于for语句声明即可;
2、必须给循环段起一个名字。这是一个强制规定,并且也是利用循环生成语句生成多个实例的时候分配名字所必须的;
3、for语句的内容必须加begin-end,即使只有一条语句也不能省略。这也是一个强制规定,而且给循环起名字也离不开begin关键字;
4、可以是实例化语句也可以是连续赋值语句。
关于循环生成,举例如下:

module aa(a,b,c,d);
input [3:0] a,b;
output [3:0] c,d;

generate
genvar i;
	for (i=0; i < 4; i=i+1) 
	begin :genExample
		myAnd insAnd (.a(a[i]), .b(b[i]), .c(c[i]));
		assign d[i] = a[i];
	end
endgenerate

endmodule

module  myAnd (a,b,c);
input a,b;
output c;
assign c=a&b;
endmodule

注意,利用循环生成语句生成的实例名称不能像数组例化那样用方括号表示,否则会报错。那么,你可能会疑惑上例中实例的名字,其实,上述实例化展开来类似:

myAnd genExample(0).insAnd (.a(a[0]), .b(b[0]), .c(c[0]));
myAnd genExample(1).insAnd (.a(a[1]), .b(b[1]), .c(c[1]));
myAnd genExample(2).insAnd (.a(a[2]), .b(b[2]), .c(c[2]));
myAnd genExample(3).insAnd (.a(a[3]), .b(b[3]), .c(c[3]));

这也是为什么循环生成语句必须要有个名字。从上例我们还可以看出,当循环语句用作实例化时,所表述的功能跟数组实例化语句其实是类似的。

条件生成
条件生成的目的是为了左右编译器的行为,类似于C语言中的条件选择宏定义,根据一些初始参数来决定载入哪部分代码来进行编译。Verilog中共提供了两种条件生成语句,一种是generate-if语句,一种是generate-case语句,两者的功能几乎相同,只是书写形式不一样而已,分别介绍如下:

generate-if语句
该语句的语法如下:

generate
	if (<condition>) begin: <label_1>
		<code>;
	end else if (<condition>) begin: <label_2>
		<code>;
	end else begin: <label_3>
		<code>;
	end
endgenerate

关于该语法有三点注意:

1、必须是常量比较,例如一些参数,这样编译器才可以在编译前确定需要使用的代码;
2、if语句的内容中,begin-end只有在 < code > 有多条语句时才是必须的;
3、每一个条件分支的名称是可选的,这点不像循环生成语句那么严格。

关于generate-if语句,举例如下:

module aa(c, d0, d1, d2);
input d0,d1,d2;
output  c;
parameter sel = 1;
generate
	if (sel == 0)
		assign c = d0;
	else if (sel == 1)
		assign c = d1;
	else
		assign c = d2;
endgenerate
endmodule

该例子表示编译器会根据参数sel的值,来确定到底是让d0~d2中哪个变量和c连通。但是注意,一旦连通,那么要想更改必须修改参数后重新编译,如果需要动态选择,可以写成如下这样,这样资源上却需要一个多路复用器来实现。generate-if是没有多路器的,是直连的。
assign c = (sel == 0) ? d0 : (sel == 1) ? d1 : d2;
在这里插入图片描述
在这里插入图片描述

generate-case语句
该语句的语法如下:

generate
		case (<constant_expression>)
			<value>: begin: <label_1>
				<code>
				end
			<value>: begin: <label_2>
<code>
				end
			……
			default: begin: <label_N>
<code>
end
      		endcase
   	endgenerate

关于该语法也有三点注意,和generate-if类似:
1、<constant_expression>必须是常量比较,例如一些参数,这样编译器才可以在编译前确定需要使用的代码;
2、case语句的内容中,begin-end只有在< code >有多条语句时才是必须的;
3、每一个条件分支的名称是可选的,这点不像循环生成语句那么严格。

关于generate-case语句,举例如下:

wire c, d0, d1, d2;
parameter sel = 1;

generate
case (sel)
0 :
assign c = d0;
1:
assign c = d1;
default:
assign c = d2;
endcase
endgenerate
该例所描述的功能和generate-if小节的例子是一模一样的。
原文链接:https://blog.csdn.net/Reborn_Lee/article/details/105068239

1always块中if的条件内的量可以是wire,也可以是parameter,integer
(1)是输入wire型时,那么综合出来会有一个选择器

module  QQ(a,b,c,clk);
input a,b,clk;
parameter d=1;
output reg c;
always@(posedge clk)
if(a==1)  c=a+b;
else c=b;
endmodule

在这里插入图片描述
(2)是parameter时,会直接综合掉

module  QQ(a,b,c,clk);
input a,b,clk;
parameter d=1;
output reg c;
always@(posedge clk)
if(d==0)  c=a+b;
else c=b;
endmodule

在这里插入图片描述
2generate if内量不能是wire类型
(1)是wire时会报错

module  QQ(a,b,c,clk);
input a,b,clk;
parameter d=1;
output  c;
generate 
if(a==1) assign c=a+b;
else assign c=c;
endgenerate
endmodule 

报错
Error (10734): Verilog HDL error at QQ.v(7): a is not a constant
(2)是parameter类型时可以,当然条件选择会直接综合掉
ps:generate中赋值还得assign或者always,再加上条件选择会综合掉,所以generate的作用只是帮助设计者思维设计这么一个过程,不会在设计电路中有体现

module  QQ(a,b,c,clk);
input a,b,clk;
parameter d=1;

output  c;
generate 
if(d==1) assign c=a+b;
else assign c=c;
endgenerate
endmodule 

在这里插入图片描述

  • 7
    点赞
  • 37
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值