【发布时间】:2020-05-30 05:58:13
【问题描述】:
我有一个参数化的 seq_item 如下
class seq_item#(int A = 64) extends uvm_sequence_item;
`uvm_object_param_utils(seq_item#(A))
rand logic [A-1:0] v;
constraint v_c {
v inside {[0:1000]};
}
endclass : seq_item
class extended_seq_item#(int A = 64) extends seq_item#(A);
`uvm_object_param_utils(extended_seq_item#(A))
constraint extended_v_c {
v inside {[10:50]};
}
endclass : extended_seq_item
class reg_adapter#(int A = 100) extends uvm_reg_adapter;
`uvm_object_param_utils(reg_adapter#(A))
typedef seq_item#(A) seq_item_t;
function new(string name = "reg_adapter")
seq_item_t req;
req = seq_item_t::type_id::create("req");
endfunction
endclass : reg_adapter
class test extends uvm_test;
`uvm_component_utils(test)
reg_adapter#(10) adapter;
function void build_phase(uvm_phase phase);
seq_item#(10)::type_id::set_type_override(extended_seq_item#(10)::get_type());
super.build_phase(phase);
adapter = reg_adapter::type_id::create("adapter");
endfunction : build_phase
endclass : test
在我的 UVM TB 中,我需要使用扩展的 seq_item 工厂覆盖所有 seq_item 实例。不同的实例会有不同的 A 参数值。我如何工厂覆盖它?
问题是 seq_item 来自通用抵押品,它对 rand 变量 v 具有通用约束,适用于所有 IP。对于我的 IP,我需要为 extended_seq_item 中给出的 v 添加一个额外的约束。我的 IP 使用了 reg_adapter,它预计会采用 extended_seq_item 并添加额外的约束
感谢和问候, 基兰
【问题讨论】:
-
如果可能,您应该研究是否可以将
A设为类的成员/变量而不是参数。应谨慎使用参数。如果没有,@dave_59 的答案就是要走的路。 -
我更新了描述。我需要 A 作为变量 v 的位宽,因此它不能是另一个类的变量,它必须是一个参数
标签: system-verilog uvm