Verilog HDL 学习要点总结(二)

Posted by Harid七月 - 14 - 2011 Leave comments

1、网络类型的变量不能储存值,而且它必须受到驱动器(例如门或连续赋值语句,assign)的驱动。如果没有驱动器连接到网络类型的变量上,则该变量就是高阻的,即其值为z。常用的网络数据类型包括wire型和tri型。这两种变量都是用于连接器件单元,它们具有相同的语法格式和功能。

2、Verilog程序模块中输入、输出信号类型默认时自动定义为wire型。

3、reg型数据的默认初始值为不定值x。reg型数据常用来表示“ always”模块内的指定信号,常代表触发器。在“always”模块内被赋值的每一个信号都必须定义成reg型。 reg型数据可以赋正值,也可以赋负值。但是当一个reg型数据是一个表达式中的操作数时,它的值被当作是无符号值,即正值。例如,当一个4位的寄存器用做表达式中的操作数时,如果开始寄存器被赋以值-1,则在表达式中进行运算时,其值被认为是+15。

注意: reg型只表示被定义的信号将用在“always”模块内,理解这一点很重要。并不是说reg型信号一定是寄存器或触发器的输出,虽然reg型信号常常是寄存器或触发器的输出,但并不一定总是这样。

4、Verilog HDL 通过对reg型变量建立数组来对存储器建模,可以描述RAM型存储器、ROM型存储器和reg文件。但是要注意,存储器赋值不能在一条赋值语句中完成,寄存器可以。

5、只有连续赋值语句(即用关键字 assign 引出的语句)和实例引用语句(即用已定义的模块名引出的语句),可以独立于过程块而存在于模块的功能定义部分。

6、并行语句块(fork  join)有以下4个特点:

(1)、块内语句是同时执行的,即程序流程控制一进入到该并行块,块内语句则开始同时并行地执行;

(2)、块内每条语句的延迟时间是相对于程序流程控制进入到块内的仿真时间的;

(3)、延迟时间是用来给赋值语句提供执行时序的;

(4)、当按时间时序排序在最后的语句执行完后或一个disable语句执行时,程序流程控制跳出该程序块。

7、阻塞语句,如果没有写延迟时间看起来是在同一时刻运行,但实际上是有先后的,即在前面的先运行,然后再运行下面的语句,阻塞语句的次序与逻辑行为有很大的关系。而非阻塞的就不同了,在begin  end 之间的所有非阻塞语句都在同是时刻被赋值,即end执行完的时刻,因此逻辑行为与非阻塞语句的次序就没有关系。

8、条件语句必须在过程块语句是使用,即由initial和always语句引导的执行语句集合。除这两种语句引导的begin  end块中可以编写条件语句外,模块中的其他地方都不能编写。这是因为条件语句必须顺序执行。

9、if 条件语句中,系统对表达式的值进行判断,若为“0,x,z”都按“ 假”处理,只有是“ 1”的时候按“ 真”处理。

10、如果用到if 语句,最好写上 else 选项,如果用 case语句,最好写上 default项。遵循以上两条原则,可以避免生成并不想要的锁存器,使设计者更加明确设计目标,同时也增强了Verilog程序的可读性。

11、forever 语句常用来产生周期性的波形,用来作为仿真测试信号。它与 always语句不同之处在于不能独立写在程序中,而必须写在 initial 块中。

12、for 循环变量的增加与C不同,不能用简化的“ ++ ”写法,而必须用类似“ i=i+1”的写法。

13、结构化的过程块,即 initial 和 always块,构成了行为建模的基础。其他所有的行为级语句只能出现在这两种块之中。 initial 块只执行一次,而 always 块不断地反复执行,直到仿真的结束。

14、Verilog 中控制时序和语句执行顺序的3种方式是基于延迟的时序控制、基于事件的时序控制和电平敏感的时序控制。wait 语句用于对电平敏感的时序控制。


   声明:本文采用 BY-NC-SA 协议进行授权 | 星期九
   原创文章转载请注明:转自《Verilog HDL 学习要点总结(二)


分享按钮