《(1.8)--8Verilog模块与模块调用.pdf》由会员分享,可在线阅读,更多相关《(1.8)--8Verilog模块与模块调用.pdf(5页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、 1 文档简介 Verilog HDL 是一种用于数字系统设计的语言,用 Verilog HDL 描述的电路设计就是该电路的 Verilog HDL 模型,也称为模块。本文将介绍 Verilog HDL 中模块的基本概念,以及在一个模块中调用另一个模块的方法。2 模块 模块是 Verilog 中基本单元的定义形式,是与外界交互的接口。模块格式定义如下:module module_name#(parameter_list)(port_list);Declarations_and_Statements;endmodule 模块定义必须以关键字 module 开始,以关键字 endmodule 结束
2、。模块名、端口列表、端口声明和可选的参数声明等,出现在设计使用的 Verilog 语句之前。模块内部有可选的五部分组成,分别是变量声明、数据流语句、行为级语句、结构化语句(低层模块调用,也称为例化)及任务和函数,如下页图表示。这五部分出现顺序、出现位置都是任意的。但是,各种变量都应在使用之前声明。变量具体声明的位置不要求,但必须保证在使用之前的位置。module 模块名参数声明 (可选)端口列表,端口声明parameter,regwire等变量声明数据流描述(assign)结构化描述(模块调用)行为描述(always,initial)任务和函数endmodule 模块结束语句 3 端口 端口是
3、模块与外界交互的接口。对于外部环境来说,模块内部是不可见的,对模块的调用只能通过端口连接进行。1、端口列表 模块的定义中包含一个可选的端口列表,一般将不带类型、不带位宽的信号变量罗列在模块声明里。下面是一个 PAD 模型的端口列表:一个模块如果和外部环境没有交互,则可以不用声明端口列表。例如之前仿真时测试文件中的 test 模块都没有声明具体端口。2、端口声明 端口信号在端口列表中罗列出来以后,就可以在模块实体中进行声明了。根据端口数据流的方向,端口类型有三种:输入(input),输出(output)和双向端口(inout)。input、inout 类型不能声明为 reg 数据类型,因为 re
4、g 类型是用于保存数值的,而输入端口只能反映与其相连的外部信号的变化,不能保存这些信号的值;output 可以根据变量的赋值方式声明为 wire 或 reg 数据类型。上述例子中 pad 模块的端口声明,在 module 实体中就可以表示如下:注意:在 Verilog HDL 中,端口隐式的声明为 wire 型变量,即当端口具有 wire 属性时,不用再次声明端口类型为 wire 型。但是,当端口有 reg 属性时,则 reg声明不可省略。上述例子中的端口声明,则可以简化为:当然,信号 DOUT 的声明完全可以合并成一句:还有一种更简洁且常用的方法来声明端口,即在 module 声明时就陈列出
5、端口及其类型,如下所示:4 模块调用(例化)在一个模块中调用另一个模块,对其端口进行相关连接,叫做模块例化。模块例化建立了描述的层次。信号端口可以通过位置或名称关联,端口连接也必须遵循一些规则。1、端口名称相关联 这种方法将需要例化的模块端口与外部信号按照其名字进行连接,端口顺序随意,可以与被调用 module 的声明端口顺序不一致,只要保证端口名字与外部信号匹配即可。下面是调用一次 pad 模块的例子:如果某些输出端口并不需要在外部连接,例化时可以悬空不连接,甚至删除。一般来说,input 端口在例化时不能删除,否则编译报错,output 端口在例化时可以删除。例如:2、端口顺序相关联 这种
6、方法将需要被调用的模块端口按照模块声明时端口的顺序与外部信号进行匹配连接,位置要严格保持一致。例如例化一次 pad 模块的代码可以改为:这种方式虽然代码从书写上可能会占用相对较少的空间,但代码可读性降低,也不易于调试。有时候在大型的设计中可能会有很多个端口,端口信号的顺序时不时的可能也会有所改动,此时再利用顺序端口连接进行模块例化,显然是不方便的。所以平时,建议采用端口名称相关联的方式对模块进行例化。3、端口连接规则 模块例化时,从模块外部来讲,input 端口可以连接 wire 或 reg 型变量,这与模块声明是不同的,从模块内部来讲,input 端口必须是 wire 型变量;同样的,out
7、put 端口必须连接 wire 型变量,这也与模块声明是不同的,从模块内部来讲,output 端口可以是 wire 或 reg 型变量;inout 端口必须连接 wire 型变量,这与模块声明是相同的。模块例化时,如果某些信号不需要与外部信号进行连接交互,我们可以将其悬空,即端口例化处保留空白即可,上述例子中有提及。output 端口正常悬空时,我们甚至可以在例化时将其删除;input 端口正常悬空时,悬空信号的逻辑功能表现为高阻状态 z,但是例化时一般不能将悬空的 input 端口删除,否则编译会报错。当例化端口与连续信号位宽不匹配时,端口会通过无符号数的右对齐或截断方式进行匹配。假如在模块 pad 中,端口 PULL 的位宽为 2,则下面两种情况下代码的例化结果会导致 UUT.PULL=1bz,b0 和 UUT.PULL=b1:0。