2015-11-25 4 views
0

Я хочу контролировать несколько портов анализа и «публиковать» элемент через один порт анализа. Он работает с предопределенным типом элемента, но не может быть параметризован.initialize systemverilog (ovm) параметризованный массив классов

Код:

class ovm_analysis_sink #(int NUM_PORTS = 1, type T = ovm_object) extends ovm_component; 

// ....................................... 
`ovm_component_param_utils(ovm_analysis_sink#(NUM_PORTS,T)) 
// ....................................... 

ovm_analysis_imp #(T,ovm_analysis_sink) mon_analysis_imp[NUM_PORTS-1:0]; 
ovm_analysis_port #(T) mon_analysis_port = new("mon_analysis_port", this); 

virtual function void build() ; 
string inst; 
for(int i=0 ;i < NUM_PORTS ;i++) 
    begin 
    $sformat(inst,"mon_analysis_imp_%0d",i); 
mon_analysis_imp[i] = new(inst,this); 
    end 

super.build() ; 

endfunction : build 

Использование в analysis_sink:

ovm_analysis_sink #(3,a_type) a_item_sink; 

И сообщение об ошибке:

Error-[ICTTFC] Incompatible complex type usage ovm_tb.sv, 42 
Incompatible complex type usage in task or function call. 
The following expression is incompatible with the formal parameter of the function. 
The type of the actual is 'class $unit::ovm_analysis_sink#(3,class $unit::a_type)', 
while the type of the formal is 'class $unit::ovm_analysis_sink#(1,class ovm_pkg::ovm_object)'. 
Expression: this Source info: ovm_analysis_imp::new(inst, this) 

ответ

1

Ошибка говорит типа несовместимости. Это означает, что фактические (время выполнения) и формальные (компиляционные) аргументы/типы порта реализации не совпадают.

В то время как декларация анализа порта. Объявление порта, как показано выше, создает дескриптор анализа порта imp типа uvm_analysis_sink #(1,uvm_object), а вы хотите, чтобы он был типа uvm_analysis_sink #(3,a_type).

Таким образом, объявить его следующим образом:

ovm_analysis_imp #(T,ovm_analysis_sink#(NUM_PORTS,T)) mon_analysis_imp[NUM_PORTS-1:0]; 

Это должно удалить тип конфликта и сделать его назначение совместимый тип. Теперь любой параметр , переопределяющий, должен работать.

Я создал образец UVM-кода на EDAPlayground для справки. Аналогично относится к тестовому стенду OVM. Для получения дополнительной информации см. Вопрос this.