generate语句允许细化时间(Elaboration-time)的选取或者某些语句的重复。这些语句可以包括模块实例引用的语句、连续赋值语句、always语句、initial语句和门级实例引用语句等。细化时间是指仿真开始前的一个阶段,此时所有的设计模块已经被链接到一起,并完成层次的引用。
可以使用在generate语句中的类型主要有:
基本结构如下:
genvar 循环变量名;
generate
// generate循环语句
// generate 条件语句
// generate 分支语句
// 嵌套的generate语句
endgenerate
generate允许对语句进行条件选择,即将条件选择加入到generate中的for循环中,只例化条件成立时对应的语句或者module。
注意:generate-if中的条件只能是静态变量,如 genvar,parameter 等,可以这样想,Verilog是要综合为固定的硬件电路的,不能因为条件不同而综合的电路结构变化,所以静态变量才能保证电路结构相同。
// 错误代码:这样电路肯定会报错 a is not a constant
generate
if(a=b)
begin:a_equals_b
adder adder_u(.add1(a),.add1(c),.sum(sum));
end
else
begin
adder adder_u(.add1(a),.add1(b),.sum(sum1));
adder adder_u(.add1(sum1),.add1(c),.sum(sum));
end
endgenerate
换一种写法
// 先加了再说,取想要的结果
adder adder_u(.add1(a),.add1('b0),.sum(sum1));
adder adder_u(.add1(sum1),.add1(c),.sum(sum2));
adder adder_u(.add1(a),.add1(b),.sum(sum3));
adder adder_u(.add1(sum3),.add1(c),.sum(sum4));
always@(posedge clk)
begin
if(a==b)
sum <= sum2;
else
sum <= sum4
end
更简单的写法
// 就两个加法器,根据操作数的不同送入不同操作数
assign temp = (a=b)?'b:sum1;
adder adder_u(.add1(a),.add1(temp),.sum(sum1));
adder adder_u(.add1(sum1),.add1(c),.sum(sum));
generate-case分支语句与generate-条件语句类似,只不过将原来的分支语句换做了case语句。
genvar与generate是Verilog 2001才有的,功能非常强大,可以配合条件语句、分支语句等做一些有规律的例化或者赋值等操作,对于提高简洁代码很有帮助,同时也减少了人为的影响。
参考链接:https://blog.csdn.net/shnhwdj1984/article/details/80849828
// generate-for 循环
reg [3:0] temp;
genvar i;
generate
for (i = 0; i < 3 ; i = i + 1) begin:
always @(posedge sysclk) begin
temp[i] <= 1'b0;
end
end
endgenerate
// for 循环
reg [3:0] temp;
genvar i;
always @(posedge sysclk) begin
for (i = 0; i < 3 ; i = i + 1) begin:
temp[i] <= 1'b0;
end
end
1、循环体
2、须使用 generate-for 的情况
// 循环中进行模块实例化
module A();
..
endmodule;
module B();
parameter NUM_OF_A_MODULES = 2; // should be overriden from higher hierarchy
genvar i;
generate
for (i=0 i
常规 for 循环不能产生 NUM_OF_A_MODULES个实例
3、物理结构
if (param_use_pos == 1) begin : use_pos
always @(posedge sysclk) begin
...
end
end
else begin : use_neg
always @(negedge sysclk) begin
...
end
end
/ faster :: 1 always block, simulator can optimize the for loop
always @(posedge sysclk) begin
for (i = 0; i < 3 ; i = i + 1) begin
temp[i] <= 1'b0;
end
end
// slower :: creates 4 always blocks, harder for the simulator to optimize
genvar i;
generate // optional if > *-2001
for (i = 0; i < 3 ; i = i + 1) begin
always @(posedge sysclk) begin
temp[i] <= 1'b0;
end
end
endgenerate // match generate
关于generate-for 和 for 循环对always、assign语句的作用对比,可参考文章 Verilog:generate-for-always 语句用法对比与说明