一、模块
![](https://i-blog.csdnimg.cn/blog_migrate/986b9a66833527dba5b90e74301a8c65.jpeg)
模块定义以关键字module开始,模块名、端口列表、端口声明和可选的参数声明必须出现在其他部分的前面,endmodule语句必须为模块的最后一条语句。模块内部的5个组成部分是:
变量声明、数据流语句、低层模块实例、行为语句块以及任何和函数。在模块的组成部分中,只有module、模块名、endmodule必须出现,其他部分都是可选的,用户可以根据设计的需要随意选用。
![](https://i-blog.csdnimg.cn/blog_migrate/fc1f054cad25cc44f1104430fa7e54eb.jpeg)
二、端口
1.端口列表
如果模块和外部环境没有交换任何信号,则可以没有端口列表。
![](https://i-blog.csdnimg.cn/blog_migrate/6102b69a3a570a1da85e588a99a2dc05.jpeg)
模块Top是一个顶层模块,作为仿真中的顶层模块,调用设计模块,无需和周围环境交换信息,因此没有端口列表。
而被调用的fulladd4模块,则由a, b, c_in端口读入数据,将结果从sum和c_cout端口送出。
2.端口声明
在verilog中端口具有以下三种类型:
![](https://i-blog.csdnimg.cn/blog_migrate/e0128f0265efb6dc4f39b42091ca7310.jpeg)
在verilog中,所有的端口隐含地声明wire类型;如果输出类型的端口需要保存数值,则必须将其显式地声明为reg数据类型。
不能将input和inout类型的端口声明为reg数据类型,因为reg类型的变量是用于保存数值的,而输入端口只反映与其相连的外部信号的变化。
在verilog中,有两种端口声明风格:
![](https://i-blog.csdnimg.cn/blog_migrate/2c9815df40590aabde83213fb71f38e4.jpeg)
3.端口连接规则
![](https://i-blog.csdnimg.cn/blog_migrate/8018414670092c33d94604765517e261.jpeg)
![](https://i-blog.csdnimg.cn/blog_migrate/c8fdd5d8ed7f1e5da38070ac8385b0ec.jpeg)
位宽匹配
在对模块进行调用的时候,verilog允许端口的内、外两个部分具有不同的位宽。在一般的情况下,verilog仿真器会对此给予警告。
4.端口与外部信号的连接
在对模块调用的时候,也已使用两种方法将模块定义的端口与外部环境连接起来。
顺序端口连接
按照顺序进行端口连接:
![](https://i-blog.csdnimg.cn/blog_migrate/6566e3e56fb0f24d45146d82c47d1e3c.jpeg)
命名端口连接
fulladd4 fa_byname(.c_out(C_OUT), .sum(SUM), .b(B), .c_in(C_IN), .a(A));