行为描述方式

设计的行为功能使用下述过程语句结构描述:
1) initial 语句:此语句只执行一次。
2) always 语句:此语句总是循环执行 , 或者说此语句重复执行。
   只有寄存器类型数据能够在这两种语句中被赋值。寄存器类型数据在被赋新值前保持原有值不变。所有的初始化语句和 always 语句在 0 时刻并发执行。
   下例为 always 语句对 1 位全加器电路建模的示例。

module FA_Seq (A, B, Cin, Sum, Cout);
input A, B, Cin;
output Sum, Cout;
reg Sum, Cout;
reg T1, T2, T3;
always
@ ( A or B or Cin ) begin
Sum = (A ^ B) ^ Cin;
T1 = A & Cin;
T2 = B & Cin;
T3 = A & B;
Cout = (T1| T2) | T3;
end
endmodule

   模块 FA_Seq 有三个输入和两个输出。由于 Sum 、 Cout 、 T1 、 T2 和 T3 在 always 语句中被赋值 , 它们被说明为 reg 类型 (reg 是寄存器数据类型的一种 ) 。 always 语句中有一个与事件控制 ( 紧跟在字符 @ 后面的表达式 ) 。相关联的顺序过程 (begin-end 对 ) 。这意味着只要 A 、 B 或 Cin 上发生事件,即 A 、 B 或 Cin 之一的值发生变化,顺序过程就执行。在顺序过程中的语句顺序执行,并且在顺序过程执行结束后被挂起。顺序过程执行完成后, always 语句再次等待 A 、 B 或 Cin 上发生的事件。
   在顺序过程中出现的语句是过程赋值模块化的实例。模块化过程赋值在下一条语句执行前完成执行。过程赋值可以有一个可选的时延。
   时延可以细分为两种类型 :
1) 语句间时延 : 这是时延语句执行的时延。
2) 语句内时延 : 这是右边表达式数值计算与左边表达式赋值间的时延。
   下面是语句间时延的示例:

Sum = (A ^ B) ^ Cin;
#4 T1 = A & Cin;

   在第二条语句中的时延规定赋值延迟 4 个时间单位执行。就是说,在第一条语句执行后等待 4 个时间单位,然后执行第二条语句。下面是语句内时延的示例。

Sum = #3 (A^ B) ^ Cin;

   这个赋值中的时延意味着首先计算右边表达式的值 , 等待 3 个时间单位,然后赋值给 Sum 。
   如果在过程赋值中未定义时延,缺省值为 0 时延,也就是说,赋值立即发生。这种形式以及在 always 语句中指定语句的其他形式将在第 8 章中详细讨论。
   下面是 initial 语句的示例:

`timescale 1ns / 1ns
module Test (Pop, Pid);
output Pop, Pid;
reg Pop, Pid;

initial 
begin
Pop = 0; // 语句 1 。
Pid = 0; // 语句 2 。
Pop = #5 1; // 语句 3 。
Pid = #3 1; // 语句 4 。
Pop = #6 0; // 语句 5 。
Pid = #2 0; // 语句 6 。
end
endmodule

initial 语句包含一个顺序过程。这一顺序过程在 0 ns 时开始执行,并且在顺序过程中所有语句全部执行完毕后 , initial 语句永远挂起。这一顺序过程包含带有定义语句内时延的分组过程赋值的实例。语句 1 和 2 在 0 ns 时执行。第三条语句也在 0 时刻执行 , 导致 Pop 在第 5 ns 时被赋值。语句 4 在第 5 ns 执行 , 并且 Pid 在第 8 ns 被赋值。同样, Pop 在 14 ns 被赋值 0 , Pid 在第 16 ns 被赋值 0 。第 6 条语句执行后, initial 语句永远被挂起。



  Verilog HDL简介|

Copyright © 2005-2008 All Rights Reserved
ARM开发板网 版权所有