Как выполнить uvm_do_on без рандомизации?

У меня есть виртуальный секвенсор, из которого я параллельно выполняю три транзакции, каждая на соответствующем секвенсоре. Итак, у меня есть что-то вроде этого:

class top_vseqr extends uvm_seqr extends uvm_sequencer;
  type_a_seqr seqr_a;
  type_b_seqr seqr_b;
  type_c_seqr seqr_c;

...

endclass: top_vseqr

class simple_vseq extends uvm_sequence;
  `uvm_declare_p_sequencer(top_vseqr)

  type_a_seq seq_a;
  type_b_seq seq_b;
  type_c_seq seq_c;

  ...

  virtual task body();
    fork
      `uvm_do_on(seq_a, p_sequencer.seqr_a)
      `uvm_do_on(seq_b, p_sequencer.seqr_b)
      `uvm_do_on(seq_c, p_sequencer.seqr_c)
    join
  endtask: body

endclass: simple_vseq

Но теперь я хочу иметь возможность управлять определенными транзакциями в виртуальном секвенсоре в зависимости от теста, который я запускаю. Для этого у меня есть класс с импортом анализа, который обновляется каждый раз, когда монитор видит транзакцию в интерфейсе, и функция, которая возвращает следующую транзакцию для управления. Итак, теперь я хочу сделать что-то вроде следующего:

class test extends uvm_test;

  model model_a;
  simple_vseq seq;
  top_vseqr virt_seqr;

  ...

  task run_phase(uvm_phase phase);

    ...

    seq = simple_vseq::type_id::create("seq", this);
    seq.seq_a = model_a.get_sequence();
    seq.start(virt_seqr);

    ...

  endtask: run_phase

Копаясь в документации UVM, я увидел, что есть макрос uvm_send, но он не позволяет выбрать секвенсор для запуска последовательности (т. е. я не видел uvm_send_on или что-то в этом роде). Что я могу сделать?

Спасибо!


uvm
person eSedano    schedule 07.03.2014    source источник


Ответы (3)


Вы можете реализовать содержимое uvm_do_on macro без вызова randomize() (как вы показали во втором фрагменте), не беспокоясь. Во всяком случае, это рекомендуется некоторыми экспертами, потому что механизм рукопожатия секвенсора/драйвера довольно прост. Макросы `uvm_do* не являются нормой, они просто помогают вам в начале.

person Tudor Timi    schedule 07.03.2014

Я не думаю, что есть `uvm_send_on macro, но есть макрос `uvm_create_on(SEQ_OR_ITEM, SEQR), который вы можете использовать. Из документации UVM это то же самое, что и `uvm_create, за исключением того, что он также устанавливает родительскую последовательность в последовательность, в которой вызывается макрос, и устанавливает секвенсор в указанный аргумент ~SEQR~. Фактически, `uvm_create macro вызывает `uvm_create_on macro внутренне, передавая m_sequencer по умолчанию. Вы можете переопределить его с помощью вызова `uvm_create_on.

В качестве альтернативы вы также можете выполнить set_sequencer для вашего объекта sequence_item, чтобы он установил переменную m_sequencer.

Надеюсь это поможет.

person sundar    schedule 08.03.2014

`uvm_do_on_with может удовлетворить ваши требования, и вы также можете удалить rand в своем пакете, чтобы отключить рандомизацию или добавить ограничение

person jackyq    schedule 22.10.2016