用一个例子开题:
Given an 8-bit input vector [7:0], reverse its bit ordering.
即完成输入输出位的反转。
当然我们可以直接进行8条assign out[1] = in[7];....;
但是如果是更多条如此的重复性赋值呢?我们自然知道要使用for语句,但是如何标准的使用呢?
下面介绍generate来完成这个工作。
生成语句可以动态的生成verilog代码,当对矢量中的多个位进行重复操作时,或者当进行多个模块的实例引用的重复操作时,或者根据参数的定义来确定程序中是否应该包含某段Verilog代码的时候,使用生成语句能大大简化程序的编写过程。
生成语句生成的实例范围,关键字generate-endgenerate用来指定该范围。生成实例可以是以下的一个或多个类型:
(1)模块;(2)用户定义原语;(3)门级语句;(4)连续赋值语句;(5)initial和always块。
generate语句有generate-for,generate-if,generate-case三种语句。
这里重点介绍generate for语句。
先给出标准写法:
module top_module(
input [7:0] in,
output [7:0] out
);
genvar i;
generate
for(i = 0; i < 8; i = i + 1) begin : bit_rever