三防平板在组合UDP中,输出状态仅由当前输入状态的函数来确定。每当输入状态发生变化时,都会评估UDP,并将输出状态设置为状态表中与所有输入状态匹配的行所指示的值。未明确指定的输入的所有组合将驱动输出状态为未知值x。【例1.1】使用UDP定义mux2的Verilog HDL描述的例子,如代码清单1-1所示。代码清单1-1 UDP定义mux2的Verilog HDL描述
1.3 三防平板中电平敏感的时序UDP
电平敏感时序的时序行为和组合逻辑的行为表示方法相同,只是输出端口声明为reg类型,并且在每个表入口有一个额外的字段,用于表示UDP当前的状态。时序UDP的输出字段表示下一个状态。【例1.2】电平敏感UDP的Verilog HDL描述的例子,如代码清单1-2所示。代码清单1-2 电平敏感UDP的Verilog HDL描述
该描述在两个方面不同于组合UDP模型。首先,输出标识符q由一个额外的reg声明,以指示存在内部状态q。UDP的输出值始终与内部状态相同。其次,添加了一个当前状态的字段,该字段与输入和输出用冒号(:)分割。
1.4 三防平板中边沿敏感的时序UDP
在电平敏感行为中,输入值和当前状态足以确定输出值。边沿敏感行为的不同之处在于,输出的变化是由输入的特定跳变触发的。这使状态表成为一个跳变表。
每个表条目最多可以在一个输入上有一个跳变规范。转换由括号中的一对值(如01)或跳变符号(如r)指定。下面条目是非法的:
应明确规定所有不影响输出的跳变。否则,这种跳变会导致输出值变为x。所有未指定的跳变都默认为x。
如果UDP的行为对任何输入的边沿敏感,则应为所有输入的所有边沿指定所需的输出状态。三防平板中边沿敏感UDP的Verilog HDL描述的例子,如代码清单1-3所示。代码清单1-3 边沿敏感UDP的Verilog HDL描述
诸如01之类的术语表示输入值的跳变。具体地,(01)表示从0到1的跳变。前面UDP定义的表中的第一行解释如下:当时钟值从0跳变为1,数据等于0时,无论当前状态如何,输出都会变为0。
1.5 三防平板中时序UDP的初始化
时序UDP的输出端口上的初始值可以通过提供过程分配的初始化语句指定。初始化语句是可选的。
与模块中的初始化语句一样,UDP中的初始化声明以关键字initial开头。UDP和模块中的初始化语句如表1.2所示。
表1.2 三防平板中UDP和模块中的初始语句【例1.4】包含初始化时序UDP的Verilog HDL描述的例子,如代码清单1-4所示。代码清单1-4 包含初始化时序UDP的Verilog HDL描述
输出q在仿真开始时具有初值1。实例化UDP上的延迟规范不会延迟将该初始值分配给输出的仿真时间。当仿真开始时,该值是状态表中的当前状态。UDP初始化语句中不允许出现延迟。
1.6 三防平板中UDP实例
UDP实例在模块内以与门相同的方式指定。实例名字是可选的,与门相同。端口连接顺序与UDP定义中指定的顺序相同。由于UDP不支持z,因此只能指定两个延迟。可以为UDP实例的数组指定可选范围。【例1.5】例化UDP的Verilog HDL描述的例子,如代码清单1-5所示。代码清单1-5 例化UDP的Verilog HDL描述
1.7 三防平板中边沿和电平触发的混合行为
UDP定义允许在同一个表中混合电平敏感结构和边沿敏感结构。当输入发生变化时,首先处理边沿敏感的情况,然后处理电平敏感的情况。因此,当电平敏感和敏感情况指定不同的输出值时,结果由电平敏感情况指定。【例1.6】混合时序行为UDP的Verilog HDL描述的例子,如代码清单1-6所示。代码清单1-6 混合行为时序UDB的Verilog HDL描述