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和测试需求对代码进行进一步的扩展和修改。

相关推荐
hh1992031 个月前
systemverilog中的DPI-C用例介绍
c语言·systemverilog·dpi-c
谷公子的藏经阁4 个月前
设计模式在芯片验证中的应用——迭代器
设计模式·systemverilog·uvm·芯片验证·design pattern
wjh776a685 个月前
基于PCIE4C的数据传输(三)——使用遗留中断与MSI中断
linux·fpga开发·systemverilog·xilinx·pcie
wjh776a687 个月前
【RS422】基于未来科技FT4232HL芯片的多波特率串口通信收发实现
fpga开发·verilog·systemverilog·xilinx·rs422
一只迷茫的小狗9 个月前
systemverilog/verilog文件操作
systemverilog
小邦是名小ICer9 个月前
7.2 uvm_resource_db in UVM
uvm
apple_ttt10 个月前
SystemVerilog学习(0)——目录与传送门
fpga开发·fpga·systemverilog·芯片验证
一只迷茫的小狗10 个月前
UVM建造测试用例
uvm
不动明王呀10 个月前
uvm白皮书练习_ch2_ch231_加入transaction
uvm