![](https://csdnimg.cn/release/download_crawler_static/4344589/bg1.jpg)
学习总结系列之五――Verilog HDL/Testbench 篇
Verilog HDL 及其 Testbench 总结
(欢迎批评指正:jackhuan@tom.com)
1 Verilog HDL 的基本观点
1) 观点 1:module 内每个基本模块之间是并行运行的。
2) 观点 2:每个模块相当于一个连续赋值的过程。
3) 观点 3:方程和任务是共享代码的最基本方式。
4) 观点 4:同语言可用于生成模拟激励和指定测试的验证约束条件。
5) 观点 5:库的概念相当于 Visual C++中的 DLL 概念。
6) 观点 6:文件与文件之间的关系可以使用 C++中的*.h 和*.cpp 之关系理解。
2 设计建模的三种方式
1) 行为描述方式。过程化结构,每个结构之间是并行的。
2) 数据流方式。连续赋值语句方式,每个赋值语句之间是并行的,且赋值语
句和结构之间是并行的。
3) 结构化方式。门和模块实例化语句。
3 两者数据类型
1) 线网数据类型 wire:表示构件间的物理连线;
2) 寄存器数据类型 reg:表示抽象的数据存储元件。
4 几个概念
1) 模块(module)。模块是 Verilog HDL 的基本描述耽误,用于描述某个设计
的功能或结构及其与其它模块通信的外部端口。一个设计的结构可以使用
开关级原语、门级原语和用户定义的原语方式描述;数据流行为使用使用
连续赋值语句进行描述;时序行为使用过程结构描述。模块的声明部分和
语句可以散布在模块中的任何地方,但变量、寄存器、线网和参数说明必
须在使用前出现。
2) 只有寄存器类型数据(reg/integer)能够在 initial 和 always 语句中被赋值。
3) 阻塞性和非阻塞性赋值。理解这两个概念在学习 verilog HDL 中非常重要。
决定了时序的正确与否。阻塞性赋值的概念是在该条赋值语句执行完成后
再执行后面的语句,也就是说在执行该语句时,后面的语句是挂起的。而
非阻塞性赋值的结果在何时执行是不知道的,但是可以预见在某个时间步
内该语句一定能够执行完成,从这个意义上来看,非阻塞性赋值的语句类
似于并行语句,稍有处理不当,会引发多驱动源问题。关于多驱动源问题,
在我的 VHDL 总结中有所表述,此处不在费墨。
4) 用户定义原语(UDP)。UDP 的定义不依赖于模块定义,因此出现在模块定
义之外,也可以在单独的文本文件中定义 UDP。UDP 只能有一个输出或一
个/多个输入端口。UDP 的行为以真值表的形式描述。
5) 并行语句块和顺序语句块。并行语句块中的各语句并行执行。当并行语句
块中的最后动作执行完成是,顺序语句块的语句继续执行。也就是说,并
行语句块中的所有语句必须在控制转出语句块之前完成执行。并行语句块
1