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