书上是说有三种生成语句,for,if-else,case。verilog里面本身就有for,if-else,case.这三种语句,这是否重复了呢?
《我有一个自己的理解,生成块的三种语句可以用于生成门电路或者是一个接口函数,而非生成块的那三种普通语句只能用于给变量线网等赋值的?》
优质解答
generate相关的有generate for, generate if, generate case, generate block,genvar;
generate可以理解为静态展开行为。一般用的比较多的是它的generate for和generate if。这个和普通的for和if不一样的地方在于,它描述的是设计单元,而非单纯的组合逻辑电路。而对他的要求在于一定要能在编译时期展开,把行为预先确定下来。而for和if可以理解为运行期行为。
举例而言
parameter ODD_CHKSUM = 1'b1;
generate
if (ODD_CHKSUM == 1'b1)
begin
odd_checksum i_checksum(data, o_chksum);
end
else
begin
eva_checksum i_checksum(data, o_chksum);
end
endgenerate
上述两个instance只能实例化一个。在simulation的信号列表里面只会看到一个。而普通的if就不是这样了,两个分支你都看的到。
所以在generate block里面可以有:instance 实例化,assign 语句,always 模块。注意:这些都是模块级别的语句。
=================================================================================
generate的用法还是很宽泛的,它和module可以说是一个等级的。
1.在generate中的要求和在module中很类似,因为generate就是生成一个电路,电路结构就是你在generate中表述的内容。
2.可以独立存在于generate块或者module的应当是变量声明,常量定义,assign赋值,门级语句,块声明,实例调用方法(I/O匹配表)可能有些遗漏,不过也差不多了,像if-else,while,for,case这类的语句都是高级语句,是不能独立出现的,必须放在initial或always块中。
说白了,就是化繁为简用的,是用来简化代码(不是简化电路),具体实现是用于产生多个模块,相当于复制电路。
举个例子,我已经有一个模块A,可以产生1位的伪随机码,但我现在需要32位的伪随机码,我就可以用generate-for产生32个模块从而输出32位伪随机码。当然你也可以实例化32次A模块产生32位伪随机码,作用是一样的,但代码简洁很多。
=================================================================================
首先要明白,我们写的逻辑代码,会被生成电路,如果用if else,就会生成一个判断选择的电路,而用generate,则只会生成你想要的电路,同样的资源,哪个消耗更少呢?
generate的判断值,按照很多公司的代码规范,一定要是常量或者是参数! 别问为什么,等用熟了verilog,自然就会明白其利弊。
我们可以把generate想象成C语言的编译前预处理语句,比如if def .......endif这种,只有define了,这段话才会被编译。
再有,当不把 generate和for、if、case等联合起来时,generate就是个独立的生成语句。
比如:
generate
assign a = b ? c : d;
endgenerate
综合出来会是一个mux多选器。但是,你可以根据各种条件来选择生成电路,比如我想通过某参数来确定要生成某种电路。
parameter MOD = "ADD";
generate
if(MOD == "ADD")
assign a = b + c;
else
assign a = b - c ;
endgenerate
这条generate语句就根据参数MOD的值来选择是生成加法器还是减法器,完成b和c的运算,再赋给a。我想case在里面的用法就也清楚了。
根据参数MOD的值来选择是生成加法器或减法器和没用generate 直接用if 语句有什么区别?
我们需要先理解“综合”前后程序的变化。综合前,程序是一段纸面上的逻辑语言。但是综合后,程序被构建为一张逻辑电路图,称为网表。
当写下if等判断逻辑代码时,意思是希望这些“if”逻辑最后会变成电路。而generate if是告诉综合器:除非满足某条件才将以下代码综合为电路。换句话说,如果generate if的条件不满足,那么这段纸面代码会被综合器直接忽略。两者有本质不同。