Verilog 中如何无误使用 generate for?

举报
李锐博恩 发表于 2021/07/15 03:35:41 2021/07/15
【摘要】 用一个例子开题: Given an 8-bit input vector [7:0], reverse its bit ordering. 即完成输入输出位的反转。 当然我们可以直接进行8条assign out[1] = in[7];....; 但是如果是更多条如此的重复性赋值呢?我们自然知道要使用for语句,但是如何标准的使用呢? 下面介绍generate来完成这...

用一个例子开题:

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语句。

先给出标准写法:


  
  1. module top_module(
  2. input [7:0] in,
  3. output [7:0] out
  4. );
  5. genvar i;
  6. generate
  7. for(i = 0; i < 8; i = i + 1) begin : bit_reverse
  8. assign out[i] = in[7 - i];
  9. end
  10. endgenerate
  11. endmodule

效果:

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

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

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

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

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


  
  1. module top_module(
  2. input [7:0] in,
  3. output [7:0] out
  4. );
  5. reg out;
  6. genvar i;
  7. generate
  8. for(i = 0; i < 8; i = i + 1) begin : bit_reverse
  9. always@(*) begin
  10. out[i] = in[7 - i];
  11. end
  12. end
  13. endgenerate
  14. endmodule

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


  
  1. module ex(
  2. );
  3. always@() begin: block_name
  4. integer i;
  5. if() begin
  6. for(i = 0; i < N; i = i + 1) begin
  7. ......;
  8. end
  9. end
  10. else begin
  11. ......;
  12. end
  13. end
  14. endmodule

 

 

 

 

 

文章来源: reborn.blog.csdn.net,作者:李锐博恩,版权归原作者所有,如需转载,请联系作者。

原文链接:reborn.blog.csdn.net/article/details/99567453

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。