!!!!现在UDP用的很少,几乎不用了,但是它是作为Verilog HDL 的一个点,还是依然存在,主要是了解一下
Verilog HDL 语言提供了一种扩展基元的方法,允许用户自己定义元件(User DefinedPrimitives,UDP)。通过 UDP,可以把一块组合逻辑电路或时序逻辑电路封装在一个 UDP内,并把这个 UDP 作为一个基本门元件来使用。需要注意的是,UDP 不能综合,只能用于仿真。

UDP实际上就是查表的方式
函数和任务是一定要放在模块内部的,而UDP不是放在里面,它和模块是等同的一个概念
我们在做设计的时候经常会采用真值表的方式,对于模块来说我们用的是模块名,然后是case语句,这一点和UDP也不同
UDP的特点
(1)UDP的输出端口只能有一个,且必须位于端口列表的第一项。只有输出端口能定义为reg类型。
(2)UDP的输入端口可有多个,一般时序电路UDP的输入端口最多9个,合电路UDP的输入端口可多至10个。
(3)所有端口变量的位宽必须是1比特。
(4)在 table 表项中,只能出现0、1、x这三种状态,z将被认为是x状态。
调用
![]()
因为可综合逻辑设计可以完全替代primitive,所以用的很少了
















并行连接
在specify 块中,用符号“=>”说明并行连接,其语法格式如下
![]()
其中,
![]()
表示的是输入 a 到输出b的最小、典型和最大延分别是 8910个时间单位

在并行连接中,源域中的每一位与目标域中相应的位连接。如果源域和目标域是向量必须有相同的位数,否则会出现不匹配。因此,并行连接说g明了源域的每一位到目标域的每一位之间的延迟。

全连接
![]()
source_field是源域,destination_field是目标域,*>表示全连接


该例描述了四条全连接的路径延迟,其中定义了端口a和端口b到端口 out 的路径延迟为9个时间单位,端口c和端口d到端口out的路径延迟为 11个时间单位
!!需要注意如果是并行连接,前后两个的bit位数应该相同。如果采用全连接,表示的是一组线,这时任何信号位宽不一样都可以


setup
建立时间检查可以使用系统任务$setup。
![]()
举例:

该程序的功能是建立时间检查,clock 为参考信号,data 是被检查的信号,如果time_posedge_clock - time data<3,则报告违反约束
hold
保持时间检查可以使用系统任务Shold
![]()
举例:
