Имя последовательности как вход задачи

У меня есть последовательность регистров SPB, которая устанавливает значения аппаратных регистров в конкретной конфигурации. Значения этой конфигурации используются последующей последовательностью DAI путем присвоения значений регистра значениям последовательности DAI. Мне удалось это правильно, используя следующий код для присвоения значений регистра временным целым числам, которые будут использоваться для ограничения последовательности DAI:

 task assign_reg_value();

    `uvm_info ("VIRT_SEQ_MODEL_PRINT", $sformatf ("Initial Register Setup : %s", ljf_reg_wr_seq.model.sprint()), UVM_LOW)



    //------------------------------------------------------------------------------------------------------
    //Get the register field value and assign it to the temporary variable. These are used for the serial 
    //sequence
    //------------------------------------------------------------------------------------------------------
    //DAI_CTRL
    seq_ser_format      = ljf_reg_wr_seq.model.DAI_CTRL.format.get();

    //MORE LINES SIMILAR TO ABOVE HERE 

endtask

Однако в случае запуска более одной последовательности регистров для разных конфигураций в одном моделировании мне требуется метод обобщения вышеуказанной задачи таким образом, чтобы он принимал аргумент имени последовательности. Без этого мне пришлось бы реплицировать ~ 50 строк кода и изменить имя последовательности. В приведенном ниже псевдокоде показана необходимая мне функциональность:

seq_ser_format = <seq_name>.model.DAI_CTRL.format.get(); 

Я предполагаю, что есть способ сделать это, установив имя последовательности регистров в базе данных конфигурации перед ее запуском, а затем извлекая ее из задачи после ее завершения. У кого-нибудь есть предложения по этой реализации? Можно ли это сделать с помощью базы данных конфигурации?


uvm
person Robert Owen    schedule 20.10.2015    source источник


Ответы (1)


В вашей тестовой/виртуальной последовательности вы можете реализовать свою задачу следующим образом:

task assign_reg_value(my_base_sequence seq);
  // ...
  seq_ser_format = seq.get_format_reg();
endtask

Я предполагаю, что ваши последовательности расширены из базового класса my_base_sequence. Затем вам нужно реализовать вышеуказанную функцию get_format_reg() в вашем методе my_base_sequence as virtual и переопределить ее в ваших подклассах.

class my_base_sequence extends uvm_sequence;
  // ...
  virtual function int get_format_reg();
     // leave it empty
     $display("Not implemented in base class");
  endfunction
endclass

class ljf_reg_wr_sequence extends my_base_sequence;
// ...
  virtual function int get_format_reg();
    return this.mode1.DAI_CTRL.format.get();
  endfunction
endclass

Затем в вашей тестовой/виртуальной последовательности:

// ...
ljf_reg_wr_sequence ljf_reg_wr_seq;
other_reg_sequence other_seq;
// ... create sequence

assign_reg_value(ljf_reg_wr_seq);
// do something
assign_reg_value(other_seq);
// ...
person AldoT    schedule 21.10.2015
comment
У меня есть примерно 15 полей регистра для 'get()'. Этот метод станет полностью неуправляемым, так как потребует отдельной функции для каждого в базовом классе и в каждом подклассе, не так ли? - person Robert Owen; 21.10.2015
comment
Я понимаю. В этом случае просто раз и навсегда реализуйте 15 отдельных функций в базовом классе. Тогда у вас будет одна общая функция assign_reg_value. - person AldoT; 21.10.2015
comment
Или вам даже не нужны 15 функций при условии, что дескриптор регистра реализован в базовом классе. Просто убедитесь, что регистр не null, когда вы вызываете assign_reg_value(your_seq); - person AldoT; 21.10.2015
comment
Дескриптор модели reg реализован в базовом классе последовательности. Как будет выглядеть функция? Будет ли у меня просто 15 строк, похожих на строки для каждого поля регистра? - person Robert Owen; 21.10.2015
comment
Да, всего 15 строк, независимо от того, сколько у вас разных последовательностей. - person AldoT; 21.10.2015
comment
Хорошо. Спасибо за вашу помощь, принял это как решение. - person Robert Owen; 21.10.2015