SystemVerilog测试框架示例

这里是一个完整的SystemVerilog测试框架示例,包括随机化测试和详细注释。

顶层模块 (Top Module)

module top;
    // 信号声明
    logic clk;
    logic rst_n;
    
    // 接口实例化
    dut_if dut_if_inst(.clk(clk), .rst_n(rst_n));

    // DUT实例化 (假设DUT模块名为'dut')
    dut u_dut(
        .clk(dut_if_inst.clk),
        .rst_n(dut_if_inst.rst_n),
        .data_in(dut_if_inst.data_in),
        .data_out(dut_if_inst.data_out),
        .valid(dut_if_inst.valid),
        .ready(dut_if_inst.ready)
    );

    // 时钟生成
    initial begin
        clk = 0;
        forever #5 clk = ~clk;
    end

    // 复位逻辑
    initial begin
        rst_n = 0;
        #20 rst_n = 1;
    end

    // 实例化并运行测试
    initial begin
        Test test_inst = new(dut_if_inst);
        test_inst.run();
        #1000 $finish; // 延长仿真时间以观察更多的随机事务
    end
endmodule

接口 (Interface)

interface dut_if(input logic clk, input logic rst_n);
    logic [31:0] data_in;
    logic [31:0] data_out;
    logic valid;
    logic ready;
endinterface

事务 (Transaction)

class Transaction;
    rand logic [31:0] data_in;
    rand bit valid;

    function new();
    endfunction

    // 添加约束:valid 只能为0或1,data_in 为32位任意值
    constraint valid_c { valid inside {0, 1}; }
    constraint data_in_c { data_in inside {[32'h0:32'hFFFFFFFF]}; }

    // 打印事务内容
    function void display();
        $display("Transaction: data_in=%h, valid=%0b", data_in, valid);
    endfunction
endclass

驱动器 (Driver)

class Driver;
    virtual dut_if vif;

    function new(virtual dut_if vif);
        this.vif = vif;
    endfunction

    task drive();
        Transaction tr;
        forever begin
            // 生成随机事务
            tr = new();
            if (!tr.randomize()) begin
                $display("Randomization failed!");
            end
            tr.display();

            // 发送事务到DUT
            vif.data_in <= tr.data_in;
            vif.valid <= tr.valid;
            if (tr.valid) begin
                wait(vif.ready);
            end
            @(posedge vif.clk); // 等待下一个时钟周期
        end
    endtask
endclass

监视器 (Monitor)

class Monitor;
    virtual dut_if vif;

    function new(virtual dut_if vif);
        this.vif = vif;
    endfunction

    task monitor();
        forever begin
            @(posedge vif.clk);
            if (vif.valid && vif.ready) begin
                $display("Data: %h", vif.data_out);
            end
        end
    endtask
endclass

代理 (Agent)

class Agent;
    virtual dut_if vif;
    Driver drv;
    Monitor mon;

    function new(virtual dut_if vif);
        this.vif = vif;
        drv = new(vif);
        mon = new(vif);
    endfunction

    task run();
        fork
            drv.drive();
            mon.monitor();
        join
    endtask
endclass

环境 (Environment)

class Env;
    virtual dut_if vif;
    Agent agent;

    function new(virtual dut_if vif);
        this.vif = vif;
        agent = new(vif);
    endfunction

    task run();
        agent.run();
    endtask
endclass

测试用例 (Test Case)

class Test;
    Env env;

    function new(virtual dut_if vif);
        env = new(vif);
    endfunction

    task run();
        env.run();
    endtask
endclass

这个完整的SystemVerilog测试框架包括顶层模块、接口、事务、驱动器、监视器、代理、环境和测试用例,并使用随机化功能生成输入信号。每个模块和类都有详细注释,解释其功能和作用。可以根据具体的DUT和测试需求对代码进行进一步的扩展和修改。

  • 10
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

逍遥xiaoy

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值