Specman: Есть ли способ получить доступ к различным переменным по какому-то индексу?

в моей среде проверки у меня есть 3 разных регистра с одинаковыми полями: load_0, load_1 и load_2. Теперь у меня одна и та же функция дублируется по 3 раза для каждого регистра и отличается только одной строкой:

duplicated_func_0() {
    value = timer_regs.load_0; //This is the only different line (in duplicated_func_1 - load_1 is substituted

    ...

};

Есть ли лучший способ получить доступ к имени переменной (которая отличается только своим индексом), чем дублировать одну и ту же функцию 3 раза? Что-то вроде этого:

not_duplicated_func(index : uint) {
    value = timer_regs.load_%x; //Is there a way to put the input index in the variable name instead of %x?

};

Я буду признателен за любую помощь, которую вы можете предоставить.


person Halona    schedule 17.09.2014    source источник
comment
Если вы все еще боретесь с определениями регистров, вот пост, который может оказаться полезным: blog.verificationgentleman.com/2014/11/   -  person Tudor Timi    schedule 17.11.2014


Ответы (1)


Внутри timer_regs я бы не определял 3 переменные, load_0, load_1 и load_2, а список соответствующего типа:

extend TIMER_REGS vr_ad_reg_file {
  loads[3] : list of TIMER_LOAD vr_ad_reg;
};

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

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

extend TIMER_REGS vr_ad_reg_file {
  loads[3] : list of TIMER_LOAD vr_ad_reg;
  keep loads[0] == load_0;
  keep loads[1] == load_1;
  keep loads[2] == load_2;
};
person Tudor Timi    schedule 17.09.2014
comment
Я дал вам это предложение уже для вашего предыдущего вопроса (с непрямым доступом). - person Tudor Timi; 17.09.2014
comment
Из-за некоторых ограничений (из-за полного чипа) я думаю, что не могу изменить определение регистров :( - person Halona; 17.09.2014
comment
Это e, конечно, вы можете :P Просто ограничить каждый loads[i] равным load_i. Таким образом, вы можете получить свой торт и съесть его тоже. - person Tudor Timi; 17.09.2014
comment
Если у вас есть 3 разных подтипа, по одному для каждого регистра, то вам немного не повезло. Тогда вы должны попытаться обсудить с коллегами полный чип и изменить свой код, чтобы он имел только один подтип. Таким образом, им нужно будет внести лишь несколько (а может, и никаких) изменений в свой код, потому что у них все еще есть 3 экземпляра, а вы получаете возможность индексации. - person Tudor Timi; 17.09.2014
comment
Кроме того, если вам не нужно обращаться ни к одному из полей реестра, только к полному значению, то вам снова повезло. Вы можете объявить список просто как loads[3] : list of vr_ad_reg, и тогда вы сможете жить с тремя подтипами. В ваших функциях вы сможете вызвать get_cur_value(), чтобы получить значение всего регистра. - person Tudor Timi; 17.09.2014