模块的实例化
目录
完成一个模块声明相当于创建了一个模板,只是说明模块如何工作及其内部结构、外部接口;模块的使用必须通过模块的实例化完成。每个实例都是模块的一个完全的拷贝,都代表了实际电路中的某个功能结构单元,相互独立、并行。
4.1、显式实例化和隐式实例化
显式实例化:模块实例的端口采用名字映射的方式,实例化时不考虑端口声明的变量顺序,而是将模块实例外部的信号直接对应于模块端口的变量名。如:
add add_inst1 (.sum(sum1),.cout(cout1),.a(a1),.b(b1),.cin(cin1));
隐式实例化:模块实例的端口采用位置映射的方式,即实例化模块时外部信号需要与该模块端口声明的顺序一致。如:
fulladder add_inst1 ( a1, b1, cin1, sum1, cout1)
如果实例化时端口长度不匹配,则采取右对齐方式。
4.2、模块实例化时的参数载入
如果一个模块内部定义了参数变量,当它在另一个模块中被实例化时,其内部定义的参数值是可改变的。
(1)defparam语句
使用defparam改写被调用模块的参数值时,将使用参数的层次名。一个模块中可以使用多个defparam语句,重新定义参数值。(但现在defparam语句结构被认为是一种不好的编码风格)
(2)参数传递法
使用“#”符号隐式重新定义参数,允许按任意顺序改写参数值,而可以不考虑参数定义的顺序。(Verilog-2001)