Verilog HDL基础之:其他常用语句
束。在一个模块中,使用initial和always语句的次数是不受限制的。task和function语句可以在程序模块中的一处或多处调用,其具体使用方法在第4章中详细介绍。这里只对initial和always语句加以介绍。
1.initial语句
initial语句的格式如下:
initial begin
语句1;
语句2;
......
语句n;
end
举例说明。
例3:initial语句1。
initial begin
areg=0; //初始化寄存器areg
for(index=0; indexsize; index=index+1)
memory[index]=0; //初始化一个memory
end
在这个例子中用initial语句在仿真开始时对各变量进行初始化。
例4:initial语句2。
initial begin
inputs = b000000; //初始时刻为0
#10 inputs = b011001; //赋值时刻为10
#10 inputs = b011011; //赋值时刻为20
#10 inputs = b011000; //赋值时刻为30
#10 inputs = b001000; //赋值时刻为40
end
从这个例子中,我们可以看到initial语句的另一个用途,即用initial语句来生成激励波形作为电路的测试仿真信号。一个模块中可以有多个initial块,它们都是并行运行的。initial块常用于测试文件和虚拟模块的编写,用来产生仿真测试信号和设置信号记录等仿真环境。
2.always语句
always语句在仿真过程中是不断重复执行的,其声明格式如下:
always 时序控制> 语句>
always语句由于其不断重复执行的特性,只有和一定的时序控制结合在一起才有用。如果一个always语句没有时序控制,则这个always语句将会发成一个仿真死锁,例如:
always areg = ~areg;
这个always语句将会生成一个0延迟的无限循环跳变过程,这时会发生仿真死锁。如果加上时序控制,则这个always语句将变为一条非常有用的描述语句,例如:
always #half_period areg = ~areg;
这个例子生成了一个周期为period(2×half_period) 的无限延续的信号波形,常用这种方法来描述时钟信号,作为激励信号来测试所设计的电路。
reg[7:0] counter;
reg tick;
always @(posedge areg) begin
tick = ~tick; //tick反相
counter = counter + 1; //计数器递增
end
这个例子中,每当areg信号的上升沿出现时,把tick信号反相,并且把counter增加1。这种时间控制是always语句最常用的。
always 的时间控制可以是沿触发也可以是电平触发的,可以单个信号也可以多个信号,中间需要用关键字 or 连接,如:
always @(posedge clock or posedge reset) begin //由两个沿触发的always块
…
end
always @( a or b or c ) begin //由多个电平触发的always块
…
end
沿触发的always块常常描述时序逻辑,如果符合,可综合风格要求,用综合工具自动转换为表示时序逻辑的寄存器组和门级逻辑。电平触发的always块常常用来描述组合逻辑和带锁存器的组合逻辑,如果符合,可综合风格要求,转换为表示组合逻辑的门级逻辑或带锁存器的组合逻辑。
VerilogHDL 华清远见 相关文章:
- Verilog门电平模型化(06-06)
- VHDL:中文版Verilog HDL简明教程:第3章 Verilog语言要素(06-06)
- VHDL:中文版Verilog HDL简明教程:第2章 HDL指南(06-06)
- VHDL:中文版Verilog HDL简明教程:第1章 简介(06-06)
- VHDL:中文版Verilog HDL简明教程:第3章 Verilog语言要素(续)(06-06)
- 基于Verilog应用(06-06)