UDP定义
与模块处于同一层次,所以UDP定义不能出现在模块之内。用户可以定义自己设计的基本逻辑元件的功能。
语法形式:
注:1.输入端口最多有10个
2.输出端口只有一个
3.UDP所有端口变量必须是标量,也就是必须是1位 的
4.端口状态不再是0、1、x、z,而只有0、1、x
5.只有输出端才可以被定义为寄存器型变量
6.initial语句用于为时序电路内部的寄存器赋初值
在UDP中可以描述两类电路行为:组合电路和时序逻辑电路(包含边沿触发和电平触发)
组合电路UDP
不包含时钟。填写的功能列表类似真值表,即规定不同的输入值组合对应相应的输出值。没有规定的输入值组合则输出x。
语法形式:
input1 input2…… :output
例:2选1数据选择器的UDP定义方法
时序电路UDP
1.初始化状态寄存器
时序电路UDP的状态初始化可以使用一条过程赋值语句实现。
语法格式:
initial reg_name=0,1,or x;
若没有状态寄存器初始化语句,那么状态寄存器值为x
2.电平触发的时序电路UDP
比组合型多了一个寄存器,主要用于保存当前的状态,也可以作为当前的输出。当前的状态和输入确定下一个状态和输出。
“-”表示保持原来的状态,即一个锁存的功能
例:电平触发的D锁存器时序电路UDP,只要时钟(clk)为低电平,就可以从输入传递到输出,否则输出值保持不变。
3.边沿触发的时序UDP
例:
4.电平触发和边沿触发混合的UDP
时序UDP包括电平触发和边沿触发两种,Verilog HDL允许这两种行为混合存在于同一个UDP中。在这种情况下,边沿变化在电平触发之前处理,即电平触发覆盖边沿触发项。
模块调用
模块实例化语句和调用基元时使用的基元实例化语句形式上完全一致,也是使用结构级建模方法描述的。
调用底层模块的语法形式:
底层模块名 实例名(参数定义)
端口的关联方式
端口有两种关联方式,即位置关联方式和名称关联方式,这两种关联方式不能混合使用。
语法形式:
port_exper //位置关联方式
.PortName(port_expr) //名称关联方式
端口悬空的处理
在实例化语句中,悬空端口可以通过将端口表达式表示为空白来指定为悬空端口。
注:悬空端口因为类型不同而意义不同。若模块的输出端口悬空,则表示该输出端口不用。若模块输入端口悬空,则被置为
高阻态。
端口宽度不匹配问题
在端口关联时,若端口和局部端口表达式的长度不同,则端口通过无符号数的右对齐或截断方式进行匹配。
被调用模块参数值的更改
若子模块内定义了参数,当这个子模块被引用时,高层模块能够改变子模块的参数值。改变模块参数值的方式有参数定义语句(defparam)和带参数值的模块引用两种。
(1)参数定义语句
参数定义语句使用关键字deparam,语法形式:
deparam hier_path_name1=value1,heir_path_name2=value2,……,
其中hier_path_name1和heir_path_name2是子模块的参数名,value1、value2是赋予这两个参数的新值
(2)带参数值的模块引用