SystemVerilog测试框架示例

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

顶层模块 (Top Module)

systemverilog 复制代码
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)

systemverilog 复制代码
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)

systemverilog 复制代码
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)

systemverilog 复制代码
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)

systemverilog 复制代码
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)

systemverilog 复制代码
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)

systemverilog 复制代码
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)

systemverilog 复制代码
class Test;
    Env env;

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

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

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

相关推荐
啄缘之间1 天前
4.6 学习UVM中的“report_phase“,将其应用到具体案例分为几步?
学习·verilog·uvm·sv
lj想拿50w3 天前
systemverilog刷题小记
systemverilog·ic验证
bitlogic6 天前
理解 SystemVerilog 中的循环与并发线程
verilog·systemverilog·scope·verification·fpga & design·lifetime·并发线程
啄缘之间6 天前
3.9 学习UVM中的uvm_env类分为几步?
学习·verilog·uvm·sv
啄缘之间8 天前
3.3 学习UVM中的uvm_driver 类分为几步?
学习·测试用例·verilog·uvm
啄缘之间12 天前
verilog练习:i2c slave 模块设计
学习·fpga开发·verilog·uvm
啄缘之间13 天前
1.4 学习序列(Sequence)分为几步?
学习·uvm·sv
啄缘之间13 天前
verilog练习:8bit移位寄存器
开发语言·学习·fpga开发·verilog·uvm
啄缘之间14 天前
3. 学习UVM的核心组件
学习·verilog·uvm·sv
m0_713541841 个月前
systemverilog中的force,release和assign
systemverilog