Verilog语法之十:过程块(initial和always)
发布网友
发布时间:2天前
我来回答
共1个回答
热心网友
时间:2024-12-01 13:13
过程块作为行为模型的基础,在Verilog语法中扮演着重要角色。
过程块主要分为两种类型。
在过程块中,我们可以看到以下组成部分:
initial语句和always语句,以及begin_end与fork_join的搭配,是Verilog中的高频用法。
1.initial语句
initial语句的格式如下:
举例来说明:
[例1]:
在这个例子中,initial语句用于在仿真开始时对变量进行初始化。
[例2]:
从这个例子中,我们可以看到initial语句的另一用途,即用它来生成激励波形,作为电路的测试仿真信号。一个模块中可以有多个initial块,它们是并行运行的。
initial块通常用于测试文件和虚拟模块的编写,用来产生仿真测试信号和设置信号记录等仿真环境。
2.always语句
always语句在仿真过程中是不断重复执行的。
其声明格式如下:
always语句由于其不断重复执行的特性,只有与一定的时序控制结合在一起才有用。如果一个always语句没有时序控制,则这个always语句将会导致仿真死锁。以下是一个例子:
[例1]:
这个always语句将会生成一个0延迟的无限循环跳变过程,这时会发生仿真死锁。如果加上时序控制,则这个always语句将变为一条非常有用的描述语句。以下是一个例子:
[例2]:
这个例子生成了一个周期为20的无限延续的信号波形,这种方法常用来描述时钟信号,作为激励信号来测试所设计的电路。
[例3]:
这个例子中,每当areg信号的上升沿出现时,tick信号会反相,并且counter增加1。这种时间控制是always语句最常用的。
always的时间控制可以是沿触发也可以是电平触发的,可以是单个信号也可以是多个信号,中间需要用关键字or连接,如:
沿触发的always块通常描述时序逻辑,如果符合可综合风格要求,可用综合工具自动转换为表示时序逻辑的寄存器组和门级逻辑,而电平触发的always块通常用来描述组合逻辑和带锁存器的组合逻辑,如果符合可综合风格要求,可转换为表示组合逻辑的门级逻辑或带锁存器的组合逻辑。一个模块中可以有多个always块,它们都是并行运行的。
always是一个极高频的语法,always@()用法总结如下:
① always@(信号名)
• 信号名有变化就触发事件
② always@(posedge信号名)
• 信号名有上升沿就触发事件
③ always@(negedge信号名)
• 信号名有下降沿就触发事件
④ always@(敏感事件1or敏感事件2or…)
• 敏感事件之一触发事件
• 没有其他组合触发
⑤ always@(*)
• 无敏感列表,描述组合逻辑,和assign语句是有区别的
assign赋值语句和always@(*)语句之间的差别有:
1.被assign赋值的信号定义为wire型,被always@(*)结构块下的信号定义为reg型,值得注意的是,这里的reg并不是一个真正的触发器,只有敏感列表为上升沿触发的写法才会综合为触发器,在仿真时才具有触发器的特性。
2.另一个区别则是更细微的差别:举个例子,在这种情况下,做仿真时a将会正常为0,但是b却是不定态。这是为什么?Verilog规定,always@(*)中的*是指该always块内的所有输入信号的变化为敏感列表,也就是仿真时只有当always@(*)块内的输入信号产生变化,该块内描述的信号才会产生变化,而像always@(*)b = 1'b0;