当前位置: 代码迷 >> 综合 >> Verilog 中如何无误使用 generate for?
  详细解决方案

Verilog 中如何无误使用 generate for?

热度:32   发布时间:2023-12-12 20:35:09.0

用一个例子开题:

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;generatefor(i = 0; i < 8; i = i + 1) begin : bit_reverseassign out[i] = in[7 - i];endendgenerateendmodule

效果:

好了,大概怎么写应该知道了吧,那么需要注意什么呢?

(1) 必须有genvar关键字定义for语句的变量。

(2)for语句的内容必须加begin和end(即使就一句)。

(3)for语句必须有个名字。

上面的代码可以用下面的代码代替:

module top_module( input [7:0] in,output [7:0] out
);reg out;genvar i;generatefor(i = 0; i < 8; i = i + 1) begin : bit_reversealways@(*) beginout[i] = in[7 - i]; endendendgenerateendmodule

最后指出一种,虽然没有使用generate,但是还可以为重复性的赋值提供便利:

module ex();always@() begin: block_nameinteger i;if() beginfor(i = 0; i < N; i = i + 1) begin......;endendelse begin......;endendendmodule

 

 

 

 

 

  相关解决方案