Verilog HDL 设计模拟
Verilog|3">Verilog HDL 不仅提供描述设计的能力,而且提供对激励、控制、存储响应和设计验证的建模能力。激励和控制可用初始化语句产生。验证运行过程中的响应可以作为 “ 变化时保存 ” 或作为选通的数据存储。最后,设计验证可以通过在初始化语句中写入相应的语句自动与期望的响应值比较完成。
下面是测试模块 Top 的例子。该例子测试上面讲到的 FA_Seq 模块。
‘timescale 1ns/1ns
module Top; // 一个模块可以有一个空的端口列表。
reg PA, PB, PCi;
wire PCo, PSum;
// 正在测试的实例化模块:
FA_Seq F1(PA, PB, PCi, PSum, PCo); // 定位。
initial
begin: ONLY_ONCE
reg [3:0] Pal;
// 需要 4 位 , Pal 才能取值 8 。
for (Pal = 0; Pal 8; Pal = Pal + 1)
begin
{PA, PB, PCi} = Pal;
#5 $display (“PA, PB, PCi = %b%b%b”, PA, PB, PCi,
“ : : : PCo, PSum=%b%b”, PCo, PSum);
end
end
endmodule
在测试模块描述中使用位置关联方式将模块实例语句中的信号与模块中的端口相连接。也就是说, PA 连接到模块 FA_Seq 的端口 A , PB 连接到模块 FA_Seq 的端口 B ,依此类推。注意初始化语句中使用了一个 for 循环语句,在 PA 、 PB 和 PCi 上产生波形。 for 循环中的第一条赋值语句用于表示合并的目标。自右向左,右端各相应的位赋给左端的参数。初始化语句还包含有一个预先定义好的系统任务。系统任务 $display 将输入以特定的格式打印输出。
系统任务 $display 调用中的时延控制规定 $display 任务在 5 个时间单位后执行。这 5 个时间单位基本上代表了逻辑处理时间。即是输入向量的加载至观察到模块在测试条件下输出之间的延迟时间。
这一模型中还有另外一个细微差别。 Pal 在初始化语句内被局部定义。为完成这一功能,初始化语句中的顺序过程( begin-end )必须标记。在这种情况下 , ONLY_ONCE 是顺序过程标记。如果在顺序过程内没有局部声明的变量,就不需要该标记。下面是测试模块产生的输出。
PA, PB, PCi = 000 ::: PCo, PSum = 00
PA, PB, PCi = 001 ::: PCo, PSum = 01
PA, PB, PCi = 010 ::: PCo, PSum = 01
PA, PB, PCi = 011 ::: PCo, PSum = 10
PA, PB, PCi = 100 ::: PCo, PSum = 01
PA, PB, PCi = 101 ::: PCo, PSum = 10
PA, PB, PCi = 110 ::: PCo, PSum = 10
PA, PB, PCi = 111 ::: PCo, PSum = 11
验证与非门交叉连接构成的 RS_FF 模块的测试模块如下例所示。
`timescale 10ns/1ns
module RS_FF (Q, Qbar, R, S);
output Q, Qbar;
input R, S;
nand #1 (Q, R, Qbar);
nand #1 (Qbar, S, Q,);
// 在门实例语句中,实例名称是可选的。
endmodule
module Test;
reg TS, TR;
wire TQ, TQb;
// 测试模块的实例语句:
RS_FF NSTA (.Q(TQ), .S(TS), .R(TR), .Qbar(TQb));
// 采用端口名相关联的连接方式。
// 加载激励:
initial
begin:
TR = 0;
TS = 0;
#5 TS = 1;
#5 TS = 0;
TR = 1;
#5 TS = 1;
TR = 0;
#5 TS = 0;
#5 TR = 1;
end
// 输出显示:
initial
$monitor (At time %t , , $time,
TR = %b, TS=%b, TQ=%b, TQb= %b, TR, TS, TQ, TQb);
endmodule
RS_FF 模块描述了设计的结构。在门实例语句中使用门时延;例如,第一个实例语句中的门时延为 1 个时间单位。该门时延意味着如果 R 或 Qbar 假定在 T 时刻变化, Q 将在 T+1 时刻获得计算结果值。
模块 Test 是一个测试模块。测试模块中的 RS_FF 用实例语句说明其端口用端口名关联方式连接。在这一模块中有两条初始化语句。第一个初始化语句只简单地产生 TS 和 TR 上的波形。这一初始化语句包含带有语句间时延的程序块过程赋值语句。
第二条初始化语句调用系统任务 $monitor 。这一系统任务调用的功能是只要参数表中指定的变量值发生变化就打印指定的字符串。下面是测试模块产生的输出。请注意 `timescale 指令在时延上的影响。
At time 0, TR=0, TS=0, TQ=x, TQb= x
At time 10, TR=0, TS=0, TQ=1, TQb= 1
At time 50, TR=0, TS=1, TQ=1, TQb= 1
At time 60, TR=0, TS=1, TQ=1, TQb= 0
At time 100, TR=1, TS=0, TQ=1, TQb= 0
At time 110, TR=1, TS=0, TQ=1, TQb= 1
At time 120, TR=1, TS=0, TQ=0, TQb= 1
At time 150, TR=0, TS=1, TQ=0, TQb= 1
At time 160, TR=0, TS=1, TQ=1, TQb= 1
At time 170, TR=0, TS=1, TQ=1, TQb= 0
At time 200, TR=0, TS=0, TQ=1, TQb= 0
At time 210, TR=0, TS=0, TQ=1, TQb= 1
At time 250, TR=1, TS=0, TQ=1, TQb= 1
At time 260, TR=1, TS=0, TQ=0, TQb= 1
- 基于SystemC 的系统验证研究和应用(08-10)
- SoC:IP是新的抽象(10-24)
- 从传统电路检查到先进可靠性验证的最佳实践(07-03)
- 基于Verilog语言的等精度频率计设计(08-14)
- Verilog串口通讯设计(06-06)
- 用硬件描述语言设计复杂数字电路的优点(06-06)