文章目录
概要
在 UVM 验证环境中,Sequence 是生成激励事务(Transaction)的核心组件。下面通过一个完整示例,详细说明 Sequence 的结构、关键组件及使用方法。
一、基本 Sequence 结构示例
// 1. 定义事务类
class my_transaction extends uvm_sequence_item;
rand bit [7:0] addr;
rand bit [15:0] data;
rand bit wr_rd; // 1=写, 0=读
// 约束条件
constraint c_addr_range {
addr inside {
[8'h00:8'hFF]}; }
constraint c_wr_data {
wr_rd == 1 -> data > 16'h100; }
// 注册到UVM工厂
`uvm_object_utils_begin(my_transaction)
`uvm_field_int(addr, UVM_ALL_ON)
`uvm_field_int(data, UVM_ALL_ON)
`uvm_field_int(wr_rd, UVM_ALL_ON)
`uvm_object_utils_end
function new(string name = "my_transaction");
super.new(name);
endfunction
// 自定义方法:打印事务信息
virtual function void print_info();
`uvm_info("TRANS", $sformatf("Addr=0x%02h, Data=0x%04h, Wr/Rd=%b",
addr, data, wr_rd), UVM_MEDIUM)
endfunction
endclass
// 2. 定义基础Sequence类
class base_sequence extends uvm_sequence #(my_transaction);
`uvm_object_utils(base_sequence)
// 存储配置参数的句柄
my_config cfg;
function new(string name = "base_sequence");
super.new(name);
endfunction
// body()方法:Sequence的核心执行体
virtual task body();
my_transaction tx;
// 1. 从config_db获取配置参数(如果有)
if (!uvm_config_db#(my_config)::get(null, get_full_name(), "cfg", cfg))
`uvm_warning("CFG", "No config provided, using default values")
// 2. 创建并随机化事务
`uvm_do(tx) // 等价于:
// tx = my_transaction::type_id::create("tx");
// start_item(tx);
// if (!tx.randomize()) `uvm_fatal("RAND", "Transaction randomization failed");
// finish_item(tx);
// 3. 可选:修改事务属性
tx.print_info()