SystemVerilog(六):Testbench(绿皮书)

class transaction;                   // 4属性2方法的事务
    rand bit[31:0]src,dst,data[8];   // 随机化数据,dst表目的,src表源
    bit[31:0]crc;                    // 循环冗余校验
    
    virtual function void calc_crc;  // 基类虚方法,可以在扩展类中重写
        crc=src^dst^data.xor;
    endfunction

    virtual function void disoplay(input string prefix="");
        $display("%sTr:src=%h,dst=%h,crc=%h",prefix,src,crc);
    endfunction
enclass

-----------------------------------------------------------------------------------------
class Badtr extends transaction;     // 错误注入扩展类
    rand bit bad_crc;
    
    virtual function void calc_crc;  // 重写calc_crc方法
        super.calx_crc();            // 计算正确的crc
        if(bad_crc)crc=~crc;         // 随机产生错误的crc
    endfunction

    virtual function void display(intput string prefix=""); // 重写display方法
        $write("%sBadtr:bad_crc=%b,",prefix,bad_crc);
        super.display;
    endfunction 
endclass

-----------------------------------------------------------------------------------------
class generator;                     //创建事务,随机化,送给邮箱put
    mailbox gen2drv;
    transaction blueprint;

    function new(mailbox gen2drv);
        this.gen2drv = gen2drv;
        blueprint = new();
    endfunction

    task run();
        transaction tr;
        
        forever begin
            assert(blueprint.randomize)   //这里的assert?
            tr = blueprint.copy();
            gen2drv.put(tr);
        end
    endtask
endclass 

-----------------------------------------------------------------------------------------
class environment;
    mailbox gen2drv;
    generator gen;
    drive drv;

    function build();
        gen2drv = new();
        gen = new(gen2drv);   //注意输入
        drv = new(gen2drv);
    endfunction

    task run();
        fork                  //注意    
        gen.run();
        drv.run();
        join_none
    endtask

    task wrap_up();
    endtask
endclass

-----------------------------------------------------------------------------------------
program automatic test;        //简单的测试程序,走一遍环境。注意automatic
    environment env;
    initial begin
        env.new();
        env.build();

        begin 
            Badtr bad = new();        //实例错误事务
            env.gen.blueprint = bad;  //错误对象代替蓝图对象
        end                           //"钩子"完成事务基类错误注入

        env.run();
        env.wrap_up();
    end
endprogram

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章