命名的结束语句
1、命名的模块结尾
SystemVerilog允许关键字endmoule后指定模块的名字
endmoule:<module_name>
endmodule后指定的名称必须与匹配的模块名称一致
2、命名的代码块结尾
SystemVerilog还允许对其他命名的代码块指定结尾名称。这包括以下关键字:interface…endinterface、task…endtask、function…endfunciton和begin…end以及其他主要用于测试平台的命名代码。
3、嵌套(局部)模块的声明
模块的名称时全局性的
对模块名称的访问不受限制
全局名称有可能导致冲突发生
在模块捏声明模块
SystemVerilog提供了一种简便和精准的方法,可以限制在哪里实例化模块,而且这种方法能避免与其他具有相同名称的模块发生潜在的冲突。这个方法既是允许一个模块的定义嵌套在另一个模块的定义之中。嵌套的模块在声明的层次域之外是不可见的。
module chip(input wire clock);//顶层设计dreg i1(clock);ip_core i2(clock);
endmoudle:chipmodule dreg(input wire clock);//全局模块定义
...
endmodule:dregmodule ip_core(input wire clock);//全局模块定义sub1 u1(...);sub2 u2(...);module sub1(...);//嵌套模块定义...endmodule:sub1module sub2(...);//嵌套模块定义...endmodule:sub2
endmodule:ip_core
嵌套模块定义可以位于几个独立文件中
通常的风格是把每个模块放到一个单独的文件中
使用`include避免因多个模块放在同一源文件中而引起混淆
使用嵌套模块定义会使用顶层模块的源代码文件包含多个模块定义。另外,如果嵌套模块的源代码被掩藏在顶层模块下,那么它会难于维护,并且很难在其他设计中重用。
3.1嵌套模块名称的可见性
嵌套模块的名称不是全局的
嵌套模块的名称并不像其他模块名称一样放在全局模块定义命名域内。嵌套模块的名称只在其父模块的命名域内。也就是说嵌套模块可以使用和在设计的任何地方定义过的模块一样的名称,而不会引起全局模块定义命名域内的任何冲突。
嵌套模块的层次化路径
与模块实例一样,嵌套模块也有层次化域名。嵌套模块中的变量、线网和嵌套模块中的其他声明都可以在验证层次haul引用,就好像在设计中的其他模块里声明一样。
嵌套模块可以例化其他模块
嵌套模块可以实例化其他模块
嵌套模块可以实例化其他模块。这些模块的定义可以位于三个命名域中:全局模块定义命名域、嵌套模块的父模块或嵌套模块内的模块(作为另一个嵌套模块定义)。
3.2实例化嵌套模块
嵌套模块和普通模块的实例化方法一样
实例化嵌套模块的方法和普通模块一样。嵌套模块可以被其父模块任意次数地显式实例化,也可以在父模块下面层次数的任何地方实例化。嵌套模块实例和普通模块实例化,而普通模块可以在设计层次中的任何地方实例化。
module ip_core(input clpck);sub1 u1(...);//嵌套模块sub1实例化module sub1(...);//嵌套模块定义sub2 u2();...endmodule:sub1module sub2;//嵌套模块定义//sub2没有端口,但可以看到其父模块源码中的标识符...sub3 u3(...);endmodule:sub2module sub3(...);//嵌套模块定义...endmodule:sub3
endmodule:ip_core
3.3嵌套模块的名称搜索规则
嵌套模块有局部作用域
和普通模块一样,嵌套模块也有自己的命名域。嵌套模块的定义中可以包含也可以不包含端口。嵌套模块的端口名称是该模块内的局部名称。嵌套模块内的所有网线、变量、任务。函数和其他声明都是fail模块的局部量。
嵌套模块可以引用父模块中的名称
嵌套模块的名称搜索规则与普通的模块不同。从语义上讲,嵌套模块类似于Verilog的任务,嵌套模块可以看到父模块中的信号。和任务一样,如果引用的名称既不在嵌套模块的局部作用域内,就会到其父模块内,就会在编译单元域内查找。这样,嵌套模块就可以引用那些外部定义的,编译单元内的变量、常量、任务、函数和用户自定义类型。
非嵌套模块沿实例化树向上搜索
需要着重注意的是,嵌套模块的向上搜索与非嵌套模块的向上搜索规则不同。非嵌套模块位于全局模块定义域内,没有父源代码。当非嵌套模块引用一份没有在模块内声明的标识符时(如变量名或函数名),名称的搜索路径使用实例化层次树,包括编译单元域。
嵌套模块在源代码中向上搜索
而嵌套模块的定义是有父源代码。当嵌套模块引用没有在嵌套模块内定义的标识符时,搜索路径是在定义这个嵌套模块的父模块中查找,而不是在实例化该模块中查找。
4、简化的模块实例网表
网表将模块实例连接起来
网表是用网将端口连接在一起的模块实例的列表。在设计的许多层次–从高抽象级设计中主要功能块的连接,到具体实现层次中进行ASIC或门级等分立部件的连接都要用到网表。网表通常由综合编译器等软件工具自动生成;但是在连接主要设计模块时,通常需要人工定义网表。在顶层模块中,即使是在功能块层次上,网表的规模也经常非常大,有可能存在很多潜在的难于调试的连接错误。
4.1、隐式的.name端口连接
.name是端口名称连接的简化方式
SystemVerilog提供了能大大简化网表的三种方法:.name端口连接,.*端口连接和接口。
.name简化了连接模块实例的过程
.name端口连接语法结合了自成文档代码中使用的按端口次序连接方式的简洁性和端口名称连接方式的次序独立性这两方面优点,同时消除了这两种Verilog风格的缺点。
.name推断出同名线网和端口连接
.name可以和端口名称连接方式结合