Verilog HDL入门(4)
Verilog 基础语言4
4.第三章内容
1 | 结构建模 |
generate(产生,引起) 语句
允许细化时间(Elaboration - time)的选取或者某些语句的重复。这些语句可以包括模块实例引用语句、连续赋值语句、always语句、initial 语句 、门级实例引用语句等。
细化时间是指仿真开始前的一个阶段,此时所有的设计模块已经被链接到一起,并已完成层次引用。
generate 语句用关键字 generate … endgenerate 来定界
在 generate 语句中可以出现以下 3 种语句。
(1) generate - loop 循环语句
(2) generate - case 分支语句
(3) generate - conditional 条件语句
generate 格式
generate
//generate 循环语句
//generate 条件语句
//generate 分支语句
//嵌套的 generate 语句
endgenerate
generate 循环语句
(generate 循环语句 主要功能是帮助设计者编写由多次重复所构造的复杂语句。这可借助于基于结构单元的 generatefor 循环语句,在Verilog编译细化阶段,自动地生成由结构单元实例构成的复杂代码.)
generate 循环语句被用于(Verilog 编译)细化阶段的语句复制,基本上允许对结构元素编写一个for循环。 例 普通N位的异或门
module nbit_xor
(#(parameter SIZE = 16))
(
input [SIZE-1:0] a,b,
output [SIZE-1:0] y;
);
genvar gv_i;
generate
for(gv_i = 0;gv_i<SIZE;gv_i = gv_i +1)
begin: sblka
xor uxor(y[gv_i],a[gv_i],b[gv_i]);
end
endgenerate
endmodule
在细化期间,generate 循环语句将被扩展。对于循环变量的每一个值,for循环语句的实体会被重复一次。 例子喜欢后变成
xor sblka[0].uxor(y[0],a[0],b[0]);
xor sblka[1].uxor(y[1],a[1],b[1]);
...
通常, generate 循环语句的格式如下:
for(intitial_expression;final_expression;assignment)
begin: label
statements
end
在for循环语句内,循环变量需要被初始化并且在每一次循环时都需要被修改。使用的这种循环变量被称为genvar变量。这种变量必须用genvar 声明语句来声明,并且只能够在generate 循环语句种使用。genvar 变量用于初始化语句和genvar 赋值语句中。
在模块 nbit_xor中,genvar 变量是gv_i 。
初始化时,将其赋值为0,然后每一次循环后加1。
generate 块需要标签, 这个标签用来表示 generate循环的实例名称 。在模块 nbit_xor 中,generate 块的标签是 sblka 。
实例uxor的层次路径是:
nbit_xor.sblka[0].uxor
nbit_xor.sblka[1].uxor
...
在 generate 语句中还可以有局部声明。例,如果我们在块 sblka 中包括了如下声明:
wire phy2;
那么将会出现线网变量phy2的16个实例 ,它们的层次引用名称为:
sblka[0].phy2
sblka[1].phy2
...
在细化期间,for 循环语句被扩展,即对于每一次循环,重复一次 for 语句的实体。
如果在 generate 语句内有多个语句,所有的语句都将被重复。尽管上例中的 generate 语句中只有一个门级实例引用语句,但是 generate 语句还可以包含过程性语句。
下面是一个波纹计数器的示例。
module ripple_counter
#(parameter BITS = 8)
(
input count_clk,nreset,
output[BITS-1:0]q
);
genvar gv_a;
jk_ff u0jk_ff(
.J(1'b1),.K(1'b1),.NRESET(nreset),
.CK(cond_out),.Q(q[0]),.NQ());
generate
for(gv_a = 1; gv_a < BITS; gv_a = gv_a +1'b1)
begin : gblk_a
jk_ff u1jk_ff(
.J(1'b1),.K(1'b1),.NRESET(nreset),
.CK(q[gv_a -1]),.Q(q[gv_a]),.NQ());
end
endgenerate
endmodule
genvar 变量是 gv_a 。在 generate 语句外部实例引用了一个名为 u0jk_ff 的模块实例。 在 generate 语句内部声明了另外的 BITS-1 个实例。
generate - conditional 条件语句
generate 条件语句允许在细化期间对语句进行条件选择。generate 条件语句的常见格式如下:
if(condition)
statements
[else
statements]
1 | condition 必须是一个静态的条件,既在喜欢期间计算得出(这样一个条件表达式只能有常数和参数组成)。 statements可以是任何能够在模块出现的语句、 例如,always语句、模块实例引用语句和门级实例引用语句。 |