1. 模块例化
在一个模块中引用另一个模块,对其端口继续宁相关连接,叫做模块例化。
2. 端口连接规则
2.1 输入端口
模块例化时,从模块外部来讲,input 端口可以连接 wire 或 reg 型变量。从模块内部来讲,input 端口必须是 wire 型变量。
2.2 输出端口
模块例化时,从模块外部来讲,output 端口必须连接 wire 型变量。从模块内部来讲,output 端口可以是 wire 或 reg 型变量。
2.3 输入输出端口
模块例化时,从模块外部来讲,inout 端口必须连接 wire 型变量。
2.4 悬空端口
模块例化时,如果某些信号不需要与外部信号进行连接交互,我们可以将其悬空,即端口例化处保留空白即可。
示例如下
a u_a(
A (), /// 不适用A信号,可以悬空
B (b)
);
2.5 位宽匹配
当例化端口与连接信号位宽不匹配时,端口会通过无符号数的右对齐或截断方式进行匹配。
所以,例化端口时,除特殊要求,尽量保持例化端口与连接信号位宽匹配。
3. 用 generate 进行模块例化
当例化多个相同模块时,一个一个的手动例化会比较麻烦。
用 generate 语句进行多个模块的重复例化,可大大简化程序的编写过程。
示例如下
genvar i ;
generate
for(i = 1, i<=3; i=i+1) begin: test
a u_a(
B (b[i]),
C (c[i])
);
end
endgenerate
4. 层次访问
每一个例化模块的名字,每个模块的信号变量等,都使用一个特定的标识符进行定义。
在整个层次设计中,每个标识符都具有唯一的位置与名字。
verilog 中,通过使用一连串的 .
符号对各个模块的标识符进行层次分隔连接,就可以在任何地方通过指定完整的层次名对整个设计中的标识符进行访问。
层次访问多用于仿真。
示例如下
/// a信号访问top模块下的u_m1模块下的u_n1模块下的c信号
a=top.u_m1.u_n1.c ;
/// 直到test模块下的u1模块下的a信号等于1,才开始执行
wait(test.u1.a == 1'b1) begin
...
...
...
end