SV_LAB学习05篇 LAB5

一、验证框架

在本章节将建立如所示框架,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;                         // scoreboard

2.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);
    end

2.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版权协议,转载请附上原文出处链接和本声明。