一、验证框架
在本章节将建立如所示框架,gen、send、recv等都将封装到类里。

二、测试代码 test.sv
2.1 包含类文件
据说变量 run_for_n_packets 是一个全局变量。
program automatic test(router_io.TB rtr_io);
`include "Packet.sv"
int run_for_n_packets; // number of packets to test
int TRACE_ON = 0;
`include "router_test.h"
`include "Driver.sv"
`include "Receiver.sv"
`include "Generator.sv"
`include "Scoreboard.sv"2.2 定义变量
semaphore sem[];
Driver drvr[];
Receiver rcvr[]; // receiver
Generator gen[]; // generator
Scoreboard sb; // scoreboard2.3 开启仿真
(1)这里 旗语sem、驱动器drvr、接收器rcvr、生成器gen 都是动态数组;在initial中被初始化为16的长度。
(2)然后 计分板sb,只有一个。
(3)平台启动的语句 sb.start()、gen[i].start()、drvr[i].start()、rcvr[i].start()是在类里定义的task,且使用可fork...join_none来生成线程,即这里的每个start都不会堵塞,按顺序在同一时刻启动。
initial begin
run_for_n_packets = 2000;
sem = new[16];
drvr = new[16];
rcvr = new[16];
gen = new[16];
sb = new("Scoreboard");
foreach (sem[i]) sem[i] = new(1);
foreach (gen[i])
gen[i] = new($sformatf("gen[%0d]", i), i);
foreach (drvr[i])
drvr[i] = new($sformatf("drvr[%0d]", i), i, sem, gen[i].out_box, sb.driver_mbox,rtr_io);
foreach (rcvr[i])
rcvr[i] = new($sformatf("rcvr[%0d]", i), i, sb.receiver_mbox, rtr_io);
reset();
sb.start();
foreach (gen[i]) gen[i].start();
foreach (drvr[i]) drvr[i].start();
foreach (rcvr[i]) rcvr[i].start();
wait(sb.DONE.triggered);
end2.4 末尾代码
task reset();
rtr_io.reset_n = 1'b0;
rtr_io.cb.frame_n <= '1;
rtr_io.cb.valid_n <= '1;
repeat(2) @rtr_io.cb;
rtr_io.cb.reset_n <= 1'b1;
repeat(15) @(rtr_io.cb);
endtask: reset
endprogram: test
三、待续
版权声明:本文为ShiAokai原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。