程序包中只能包括声明部分,不能包括实体、结构体、配置声明单元、进程、块(block)等。实体、结构体、配置声明单元直接放在设计库中,与程序包和包体并列;而进程和块只是结构体(有时也在实体声明中)的一个组成部分,不能独立。程序包和包体均为独立的编译单元。VHDL共有5种编译单元:实体、结构体、配置单元、程序包、包体。编译单元均可单独作为一个文件,也可放在一起。其中,实体声明、程序包声明、配置单元为初级单元,结构体和包体分别是实体、程序包声明的次级单元。编译的时候,要求次级单元在其相应的初级单元编译之后才可以编译。如果初级单元和相应的次级单元放在一个文件中,则要求初级单元要放在次级单元的前面。

  值得引起注意的是;程序包中不能声明变量,但可以声明信号,特别是可以声明全局信号。使用全局信号来声明诸如Clock、Reset等信号会带来极大方便,但如果不加节制地过多使用全局信号,也容易带来混乱。

  引用程序包时,在编译单元之前添加下面的语句:
    use 库名.包名.项目名;

    use 库名.包名.all;
  前面一句表示包中的指定项目可见(即可以引用);后面一句的.all表示包中的所有项目都可见。包体部分的内容是不可见的。

  将程序包的声明部分和包体部分分开,可以体现内部实现保密的目的。比如,一个集成电路设计公司提供了一些标准子程序放在程序包中,可提供其他单位的设计者使用,他们只要提供程序包声明部分和目标代码,而不提供包体部分。即提供这些子程序的使用方法,而不提供实现子程序的源程序。
  程序包可用来定义多种数据类型以及对这些数据类型的运算。在一个大的工程项目中,多半会从整个项目的角度提取一个或多个公共的数据类型及运算。例如,用于整个项目的全局信号或总线信号(以及该总线信号的决断函数)很可能在程序包中定义。
  除了这种项目级的程序包外,技术级的程序包也是有用的。例如,基于某种技术的标准逻辑电平以及对这种类型操作符的运算就可以定义在一个程序包内,以便为该工程项目的全体成员或者被该标准库的全体用户所共享。程序包中除了放数据类型及对这些数据类型的运算之外,甚至于可以放标准元件(该元件使用这些数据类型)的元件声明。
  如果程序包提供了对某数据类型的所有运算,就可看作把类型的实际定义从设计中提取了出来,也就是说使用这种数据类型的用户不必了解这种类型的对象是如何构造的,而只需了解这种数据类型支持哪些运算即可。这在语言和软件工程中被看作是数据抽象化。