设为首页收藏本站
网站公告 | 这是第一条公告
     

 找回密码
 立即注册
缓存时间09 现在时间09 缓存数据 我们所有的努力所有的奋斗,都是为了拥有一个美好的未来。和遇见更好的自己。请把努力当成一种习惯,而不是三分钟热度。每一个你羡慕的收获,都是努力用心拼来的。早安!

我们所有的努力所有的奋斗,都是为了拥有一个美好的未来。和遇见更好的自己。请把努力当成一种习惯,而不是三分钟热度。每一个你羡慕的收获,都是努力用心拼来的。早安!

查看: 1151|回复: 2

Verilog语言关键字模块例化实例讲解

[复制链接]

  离线 

TA的专栏

  • 打卡等级:热心大叔
  • 打卡总天数:233
  • 打卡月天数:1
  • 打卡总奖励:3378
  • 最近打卡:2025-06-26 12:03:41
等级头衔

等級:晓枫资讯-上等兵

在线时间
0 小时

积分成就
威望
0
贡献
459
主题
407
精华
0
金钱
4701
积分
930
注册时间
2023-1-6
最后登录
2025-6-26

发表于 2023-4-12 12:04:41 | 显示全部楼层 |阅读模式
关键字:例化,generate,全加器,层次访问

在一个模块中引用另一个模块,对其端口进行相关连接,叫做模块例化。模块例化建立了描述的层次。信号端口可以通过位置或名称关联,端口连接也必须遵循一些规则。

命名端口连接

这种方法将需要例化的模块端口与外部信号按照其名字进行连接,端口顺序随意,可以与引用 module 的声明端口顺序不一致,只要保证端口名字与外部信号匹配即可。
下面是例化一次 1bit 全加器的例子:
  1. full_adder1  u_adder0(
  2.     .Ai     (a[0]),
  3.     .Bi     (b[0]),
  4.     .Ci     (c==1'b1 ? 1'b0 : 1'b1),
  5.     .So     (so_bit0),
  6.     .Co     (co_temp[0]));
复制代码
如果某些输出端口并不需要在外部连接,例化时 可以悬空不连接,甚至删除。一般来说,input 端口在例化时不能删除,否则编译报错,output 端口在例化时可以删除。例如:
  1. //output 端口 Co 悬空
  2. full_adder1  u_adder0(
  3.     .Ai     (a[0]),
  4.     .Bi     (b[0]),
  5.     .Ci     (c==1'b1 ? 1'b0 : 1'b1),
  6.     .So     (so_bit0),
  7.     .Co     ());
  8.  
  9. //output 端口 Co 删除
  10. full_adder1  u_adder0(
  11.     .Ai     (a[0]),
  12.     .Bi     (b[0]),
  13.     .Ci     (c==1'b1 ? 1'b0 : 1'b1),
  14.     .So     (so_bit0));
复制代码
顺序端口连接

这种方法将需要例化的模块端口按照模块声明时端口的顺序与外部信号进行匹配连接,位置要严格保持一致。例如例化一次 1bit 全加器的代码可以改为:
  1. full_adder1  u_adder1(
  2.     a[1], b[1], co_temp[0], so_bit1, co_temp[1]);
复制代码
虽然代码从书写上可能会占用相对较少的空间,但代码可读性降低,也不易于调试。有时候在大型的设计中可能会有很多个端口,端口信号的顺序时不时的可能也会有所改动,此时再利用顺序端口连接进行模块例化,显然是不方便的。所以平时,建议采用命名端口方式对模块进行例化。

端口连接规则

输入端口
模块例化时,从模块外部来讲, input 端口可以连接 wire 或 reg 型变量。这与模块声明是不同的,从模块内部来讲,input 端口必须是 wire 型变量。
输出端口
模块例化时,从模块外部来讲,output 端口必须连接 wire 型变量。这与模块声明是不同的,从模块内部来讲,output 端口可以是 wire 或 reg 型变量。
输入输出端口
模块例化时,从模块外部来讲,inout 端口必须连接 wire 型变量。这与模块声明是相同的。
悬空端口
模块例化时,如果某些信号不需要与外部信号进行连接交互,我们可以将其悬空,即端口例化处保留空白即可,上述例子中有提及。
output 端口正常悬空时,我们甚至可以在例化时将其删除。
input 端口正常悬空时,悬空信号的逻辑功能表现为高阻状态(逻辑值为 z)。但是,例化时一般不能将悬空的 input 端口删除,否则编译会报错,例如:
  1. //下述代码编译会报Warning
  2. full_adder4  u_adder4(
  3.     .a      (a),
  4.     .b      (b),
  5.     .c      (),
  6.     .so     (so),
  7.     .co     (co));
复制代码
  1. //如果模块full_adder4有input端口c,则下述代码编译是会报Error
  2. full_adder4  u_adder4(
  3.     .a      (a),
  4.     .b      (b),
  5.     .so     (so),
  6.     .co     (co));
复制代码
一般来说,建议 input 端口不要做悬空处理,无其他外部连接时赋值其常量,例如:
  1. full_adder4  u_adder4(
  2.     .a      (a),
  3.     .b      (b),
  4.     .c      (1'b0),
  5.     .so     (so),
  6.     .co     (co));
复制代码
位宽匹配
当例化端口与连续信号位宽不匹配时,端口会通过无符号数的右对齐或截断方式进行匹配。
假如在模块 full_adder4 中,端口 a 和端口 b 的位宽都为 4bit,则下面代码的例化结果会导致:u_adder4.a = {2'bzz, a[1:0]}, u_adder4.b = b[3:0] 。
  1. full_adder4  u_adder4(
  2.     .a      (a[1:0]),      //input a[3:0]
  3.     .b      (b[5:0]),      //input b[3:0]
  4.     .c      (1'b0),
  5.     .so     (so),
  6.     .co     (co));
复制代码
端口连续信号类型
连接端口的信号类型可以是,1)标识符,2)位选择,3)部分选择,4)上述类型的合并,5)用于输入端口的表达式。
当然,信号名字可以与端口名字一样,但他们的意义是不一样的,分别代表的是 2 个模块内的信号。

用 generate 进行模块例化

当例化多个相同的模块时,一个一个的手动例化会比较繁琐。用 generate 语句进行多个模块的重复例化,可大大简化程序的编写过程。
重复例化 4 个 1bit 全加器组成一个 4bit 全加器的代码如下:
  1. module full_adder4(
  2.     input [3:0]   a ,   //adder1
  3.     input [3:0]   b ,   //adder2
  4.     input         c ,   //input carry bit

  5.     output [3:0]  so ,  //adding result
  6.     output        co    //output carry bit
  7.     );

  8.     wire [3:0]    co_temp ;
  9.     //第一个例化模块一般格式有所差异,需要单独例化
  10.     full_adder1  u_adder0(
  11.         .Ai     (a[0]),
  12.         .Bi     (b[0]),
  13.         .Ci     (c==1'b1 ? 1'b1 : 1'b0),
  14.         .So     (so[0]),
  15.         .Co     (co_temp[0]));

  16.     genvar        i ;
  17.     generate
  18.         for(i=1; i<=3; i=i+1) begin: adder_gen
  19.         full_adder1  u_adder(
  20.             .Ai     (a[i]),
  21.             .Bi     (b[i]),
  22.             .Ci     (co_temp[i-1]), //上一个全加器的溢位是下一个的进位
  23.             .So     (so[i]),
  24.             .Co     (co_temp[i]));
  25.         end
  26.     endgenerate

  27.     assign co    = co_temp[3] ;

  28. endmodule
复制代码
  1. `timescale 1ns/1ns

  2. module test ;
  3.     reg  [3:0]   a ;
  4.     reg  [3:0]   b ;
  5.     //reg          c ;
  6.     wire [3:0]   so ;
  7.     wire         co ;

  8.     //简单驱动
  9.     initial begin
  10.         a = 4'd5 ;
  11.         b = 4'd2 ;
  12.         #10 ;
  13.         a = 4'd10 ;
  14.         b = 4'd8 ;
  15.     end

  16.     full_adder4  u_adder4(
  17.                .a      (a),
  18.                .b      (b),
  19.                .c      (1'b0),   //端口可以连接常量
  20.                .so     (so),
  21.                .co     (co));

  22.     initial begin
  23.         forever begin
  24.             #100;
  25.             if ($time >= 1000)  $finish ;
  26.         end
  27.     end

  28. endmodule // test
复制代码
仿真结果如下,可知 4bit 全加器工作正常:
130457zo3papamp0potpz0.jpeg


层次访问

每一个例化模块的名字,每个模块的信号变量等,都使用一个特定的标识符进行定义。在整个层次设计中,每个标识符都具有唯一的位置与名字。
Verilog 中,通过使用一连串的 . 符号对各个模块的标识符进行层次分隔连接,就可以在任何地方通过指定完整的层次名对整个设计中的标识符进行访问。
层次访问多见于仿真中。
例如,有以下层次设计,则叶单元、子模块和顶层模块间的信号就可以相互访问。
  1. //u_n1模块中访问u_n3模块信号:
  2. a = top.u_m2.u_n3.c ;
  3. //u_n1模块中访问top模块信号
  4. if (top.p == 'b0) a = 1'b1 ;
  5. //top模块中访问u_n4模块信号
  6. assign p = top.u_m2.u_n4.d ;
复制代码
130457k78ul0undurtnniu.jpeg

以上就是Verilog语言关键字模块例化实例讲解的详细内容,更多关于Verilog语言关键字模块例化的资料请关注晓枫资讯其它相关文章!

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
晓枫资讯-科技资讯社区-免责声明
免责声明:以上内容为本网站转自其它媒体,相关信息仅为传递更多信息之目的,不代表本网观点,亦不代表本网站赞同其观点或证实其内容的真实性。
      1、注册用户在本社区发表、转载的任何作品仅代表其个人观点,不代表本社区认同其观点。
      2、管理员及版主有权在不事先通知或不经作者准许的情况下删除其在本社区所发表的文章。
      3、本社区的文章部分内容可能来源于网络,仅供大家学习与参考,如有侵权,举报反馈:点击这里给我发消息进行删除处理。
      4、本社区一切资源不代表本站立场,并不代表本站赞同其观点和对其真实性负责。
      5、以上声明内容的最终解释权归《晓枫资讯-科技资讯社区》所有。
http://bbs.yzwlo.com 晓枫资讯--游戏IT新闻资讯~~~

  离线 

TA的专栏

等级头衔

等級:晓枫资讯-列兵

在线时间
0 小时

积分成就
威望
0
贡献
0
主题
0
精华
0
金钱
20
积分
20
注册时间
2022-12-24
最后登录
2022-12-24

发表于 2024-11-18 00:37:03 | 显示全部楼层
感谢楼主分享。
http://bbs.yzwlo.com 晓枫资讯--游戏IT新闻资讯~~~

  离线 

TA的专栏

等级头衔

等級:晓枫资讯-列兵

在线时间
0 小时

积分成就
威望
0
贡献
0
主题
0
精华
0
金钱
15
积分
10
注册时间
2022-12-25
最后登录
2022-12-25

发表于 2025-4-20 16:04:42 | 显示全部楼层
顶顶更健康!!!
http://bbs.yzwlo.com 晓枫资讯--游戏IT新闻资讯~~~
严禁发布广告,淫秽、色情、赌博、暴力、凶杀、恐怖、间谍及其他违反国家法律法规的内容。!晓枫资讯-社区
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

1楼
2楼
3楼

手机版|晓枫资讯--科技资讯社区 本站已运行

CopyRight © 2022-2025 晓枫资讯--科技资讯社区 ( BBS.yzwlo.com ) . All Rights Reserved .

晓枫资讯--科技资讯社区

本站内容由用户自主分享和转载自互联网,转载目的在于传递更多信息,并不代表本网赞同其观点和对其真实性负责。

如有侵权、违反国家法律政策行为,请联系我们,我们会第一时间及时清除和处理! 举报反馈邮箱:点击这里给我发消息

Powered by Discuz! X3.5

快速回复 返回顶部 返回列表