Verilog 模块与端口

关键词:模块,端口,双向端口,PAD

结构建模方式有 3 类描述语句: Gate(门级)例化语句,UDP (用户定义原语)例化语句和 module (模块) 例化语句。本次主要讲述使用最多的模块级例化语句。

模块

模块是 Verilog 中基本单元的定义形式,是与外界交互的接口。
模块格式定义如下:

module module_name
#(parameter_list)
(port_list) ;Declarations_and_Statements ;
endmodule

模块定义必须以关键字 module 开始,以关键字 endmodule 结束。
模块名,端口信号,端口声明和可选的参数声明等,出现在设计使用的 Verilog 语句(图中 Declarations_and_Statements)之前。
模块内部有可选的 5 部分组成,分别是变量声明,数据流语句,行为级语句,低层模块例化及任务和函数,如下图表示。这 5 部分出现顺序、出现位置都是任意的。但是,各种变量都应在使用之前声明。变量具体声明的位置不要求,但必须保证在使用之前的位置。

端口

端口是模块与外界交互的接口。对于外部环境来说,模块内部是不可见的,对模块的调用只能通过端口连接进行。

  • 端口列表
    模块的定义中包含一个可选的端口列表,一般将不带类型、不带位宽的信号变量罗列在模块声明里。下面是一个 PAD 模型。
module pad(//DIN, pad driver when pad configured as output//OEN, pad direction(1-input, o-output)input        DIN, OEN ,//pull function (00,01-dispull, 10-pullup, 11-pulldown)input [1:0]  PULL ,inout        PAD ,//pad load when pad configured as inputoutput reg   DOUT);//input:(not effect pad external input logic), output: DIN->PADassign       PAD = OEN? 'bz : DIN ;//input:(PAD->DOUT)always @(*) beginif (OEN == 1) begin //inputDOUT   = PAD ;endelse beginDOUT   = 'bz ;endend//use tristate gate in Verilog to realize pull up/down functionbufif1  puller(PAD, PULL[0], PULL[1]);endmodule

Verilog 模块例化

关键字:例化,generate,全加器,层次访问

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

命名端口连接

这种方法将需要例化的模块端口与外部信号按照其名字进行连接,端口顺序随意,可以与引用 module 的声明端口顺序不一致,只要保证端口名字与外部信号匹配即可。
下面是例化一次 1bit 全加器的例子:

full_adder1  u_adder0(.Ai     (a[0]),.Bi     (b[0]),.Ci     (c==1'b1 ? 1'b0 : 1'b1),.So     (so_bit0),.Co     (co_temp[0]));

如果某些输出端口并不需要在外部连接,例化时 可以悬空不连接,甚至删除。一般来说,input 端口在例化时不能删除,否则编译报错,output 端口在例化时可以删除。

端口连接规则

  • 输入端口
    模块例化时,从模块外部来讲, input 端口可以连接 wire 或 reg 型变量。这与模块声明是不同的,从模块内部来讲,input 端口必须是 wire 型变量。

  • 输出端口
    模块例化时,从模块外部来讲,output 端口必须连接 wire 型变量。这与模块声明是不同的,从模块内部来讲,output 端口可以是 wire 或 reg 型变量。

  • 输入输出端口
    模块例化时,从模块外部来讲,inout 端口必须连接 wire 型变量。这与模块声明是相同的。

  • 悬空端口
    模块例化时,如果某些信号不需要与外部信号进行连接交互,我们可以将其悬空,即端口例化处保留空白即可。
    output 端口正常悬空时,我们甚至可以在例化时将其删除。
    input 端口正常悬空时,悬空信号的逻辑功能表现为高阻状态(逻辑值为 z)。但是,例化时一般不能将悬空的 input 端口删除,否则编译会报错。

  • 位宽匹配
    当例化端口与连续信号位宽不匹配时,端口会通过无符号数的右对齐或截断方式进行匹配。

  • 端口连续信号类型
    连接端口的信号类型可以是,1)标识符,2)位选择,3)部分选择,4)上述类型的合并,5)用于输入端口的表达式。
    当然,信号名字可以与端口名字一样,但他们的意义是不一样的,分别代表的是 2 个模块内的信号。

用 generate 进行模块例化

当例化多个相同的模块时,一个一个的手动例化会比较繁琐。用 generate 语句进行多个模块的重复例化,可大大简化程序的编写过程。
重复例化 4 个 1bit 全加器组成一个 4bit 全加器的代码如下:

module full_adder4(input [3:0]   a ,   //adder1input [3:0]   b ,   //adder2input         c ,   //input carry bitoutput [3:0]  so ,  //adding resultoutput        co    //output carry bit);wire [3:0]    co_temp ;//第一个例化模块一般格式有所差异,需要单独例化full_adder1  u_adder0(.Ai     (a[0]),.Bi     (b[0]),.Ci     (c==1'b1 ? 1'b1 : 1'b0),.So     (so[0]),.Co     (co_temp[0]));genvar        i ;generatefor(i=1; i<=3; i=i+1) begin: adder_genfull_adder1  u_adder(.Ai     (a[i]),.Bi     (b[i]),.Ci     (co_temp[i-1]), //上一个全加器的溢位是下一个的进位.So     (so[i]),.Co     (co_temp[i]));endendgenerateassign co    = co_temp[3] ;endmodule

层次访问
每一个例化模块的名字,每个模块的信号变量等,都使用一个特定的标识符进行定义。在整个层次设计中,每个标识符都具有唯一的位置与名字。
Verilog 中,通过使用一连串的 . 符号对各个模块的标识符进行层次分隔连接,就可以在任何地方通过指定完整的层次名对整个设计中的标识符进行访问。
层次访问多见于仿真中。

//u_n1模块中访问u_n3模块信号:
a = top.u_m2.u_n3.c ;//u_n1模块中访问top模块信号
if (top.p == 'b0) a = 1'b1 ;//top模块中访问u_n4模块信号
assign p = top.u_m2.u_n4.d ;

Verilog 带参数例化

关键词: defparam,参数,例化,ram
当一个模块被另一个模块引用例化时,高层模块可以对低层模块的参数值进行改写。这样就允许在编译时将不同的参数传递给多个相同名字的模块,而不用单独为只有参数不同的多个模块再新建文件。
参数覆盖有 2 种方式:1)使用关键字 defparam,2)带参数值模块例化。

defparam 语句
可以用关键字 defparam 通过模块层次调用的方法,来改写低层次模块的参数值。
例如对一个单口地址线和数据线都是 4bit 宽度的 ram 模块的 MASK 参数进行改写:

//instantiation
defparam     u_ram_4x4.MASK = 7 ;
ram_4x4    u_ram_4x4(.CLK    (clk),.A      (a[4-1:0]),.D      (d),.EN     (en),.WR     (wr),    //1 for write and 0 for read.Q      (q)    );

带参数模块例化
第二种方法就是例化模块时,将新的参数值写入模块例化语句,以此来改写原有 module 的参数值。
例如对一个地址和数据位宽都可变的 ram 模块进行带参数的模块例化:

//instantiation
ram #(.AW(4), .DW(4))u_ram(.CLK    (clk),.A      (a[AW-1:0]),.D      (d),.EN     (en),.WR     (wr),    //1 for write and 0 for read.Q      (q));

区别与建议

在编译器看来,如果有模块在端口声明时的参数,那么实体中的参数将视为 localparam 类型,使用 defparam 将不能改写模块实体中声明的参数
也可能和编译器有关系,大家也可以在其他编译器上实验。
对已有模块进行例化并将其相关参数进行改写时,不要采用 defparam 的方法。除了上述缺点外,defparam 一般也不可综合。
模块在编写时,如果预知将被例化且有需要改写的参数,都将这些参数写入到模块端口声明之前的地方(用关键字井号 # 表示)。这样的代码格式不仅有很好的可读性,而且方便调试。

能改写模块实体中声明的参数**。
也可能和编译器有关系,大家也可以在其他编译器上实验。
对已有模块进行例化并将其相关参数进行改写时,不要采用 defparam 的方法。除了上述缺点外,defparam 一般也不可综合。
模块在编写时,如果预知将被例化且有需要改写的参数,都将这些参数写入到模块端口声明之前的地方(用关键字井号 # 表示)。这样的代码格式不仅有很好的可读性,而且方便调试。

Verilog第五章相关推荐

  1. 异步fifo_正点原子开拓者FPGA开发板资料连载第十五章 IP核之FIFO实验

    1)实验平台:正点原子开拓者FPGA 开发板 2)摘自<开拓者FPGA开发指南>关注官方微信号公众号,获取更多资料:正点原子 3)全套实验源码+手册+视频下载地址:http://www.o ...

  2. 【正点原子FPGA连载】第十五章 IP核之FIFO实验 -摘自【正点原子】领航者ZYNQ之FPGA开发指南_V2.0

    1)实验平台:正点原子领航者ZYNQ开发板 2)平台购买地址:https://item.taobao.com/item.htm?&id=606160108761 3)全套实验源码+手册+视频下 ...

  3. 王道考研 计算机网络笔记 第五章:传输层

    本文基于2019 王道考研 计算机网络: 2019 王道考研 计算机网络 个人笔记总结 第一章:王道考研 计算机网络笔记 第一章:概述&计算机网络体系结构 第二章:王道考研 计算机网络笔记 第 ...

  4. 数字图像处理——第五章 图像复原与重建

    数字图像处理--第五章 图像复原与重建 文章目录 数字图像处理--第五章 图像复原与重建 写在前面 1 图像退化/复原过程的模型 2 噪声模型 2.1 高斯噪声 2.2 椒盐噪声 3 仅有噪声的复原- ...

  5. c语言逐步搜索法求有根区间,[C语言第五章.ppt

    [C语言第五章 算法举例 基本思想是,根据提出的问题,列举所有可能的情况,并 用问题中给定的条件检验哪些是需要的,哪些是不需要的. 教学进程 列举与试探 列举法常用于解决"是否存在" ...

  6. 2018-4-8蚁群算法---包子阳《智能优化算法以及Matlab实现》第五章

    资料来源: <智能优化算法以及matlab实现>包子阳  余继周 编著 第五章-----蚁群算法 是一种元启发式优化算法(自己理解:就是作为群体的单位个体也就是元,在里面充当着随机的选择搜 ...

  7. Linux内核分析——第五章 系统调用

    第五章 系统调用 5.1 与内核通信 1.系统调用在用户空间进程和硬件设备之间添加了一个中间层,该层主要作用有三个: (1)为用户空间提供了一种硬件的抽象接口 (2)系统调用保证了系统的稳定和安全 ( ...

  8. 2021 线性代数 第五章 习题课

    第5章 实对称矩阵与二次型 5.1 实对称矩阵的对角化(基础部分) 5.1 实对称矩阵的对角化(提高部分) 5.2 二次型及标准形(基础部分) 5.2 二次型及标准形(提高部分) 5.3 正定二次型与 ...

  9. java十五章_java:第十五章

    第十五章 字符串1.字符串(String)的定义 String str="内容"; String str=new String(); //内容为null String str=ne ...

最新文章

  1. Tesorflow源代码安装方式以及错误的解决方法
  2. 【深度学习】基于深度神经网络进行权重剪枝的算法(一)
  3. CV之Image Caption:Image Caption算法的相关论文、设计思路、关键步骤相关配图之详细攻略
  4. yaml 数组_接口测试:A01_HttpRunner基础_05_YAML格式测试用例
  5. 此计算机必须为委派而被信任_如何增强 ClassLoader 双亲委派模式 ?
  6. AD20学习笔记2---原理图绘制及编译检查
  7. python编写简单赌博游戏赏析及注意事项
  8. 笔记:J2EE核心模式(待补充)
  9. python3语音控制电脑_python语音控制电脑_uusee全屏
  10. 有史以来最强的 5G 入门科普!
  11. Windows下mysql的基础操作
  12. 【持续更新】java 指令释疑
  13. IEEE论文格式要求(翻译)
  14. 50本财富书籍进行收藏
  15. linux服务器硬盘检测,在Linux服务器中检查硬盘坏道的命令
  16. [ 漏洞复现篇 ] Apache Shiro 身份认证绕过漏洞 (CVE-2022-32532)
  17. 腾讯视频过滤广告简略办法
  18. cmd打开计算机窗口,如何打开命令行窗口,教您电脑怎么打开cmd命令行窗口
  19. 世界五百强背景,为啥到了保险行业就成了「小公司」?
  20. Linux服务篇-sshd服务

热门文章

  1. 【分析】通过Ceph RBD实现iSCSI
  2. 多重中断的处理及其中断源屏蔽字
  3. 复数的 加减乘除 运算。
  4. flickr搜索_从提示框:DIY笔,将旧光盘回收到游戏中以及在Flickr中搜索Kindle屏幕保护程序...
  5. Primitive roots
  6. 关于签名时加密失败错误的解决
  7. HRMS(人力资源管理系统)-从单机应用到SaaS应用-架构分析(功能性、非功能性、关键约束)-下篇...
  8. WIKIOI 3163 抄书问题2 题解与分析
  9. 20172305 2018-2019-1 蓝墨云班课实验--哈夫曼树的编码
  10. linux zynq usb0,Ubuntu下ZedBoard USB-Jtag驱动安装及双核调试