Specman UVM: В чем разница между прямым доступом к регистру и использованием read_reg_val()?

Я работаю с пакетом vr_ad для e. Я определил регистр my_reg в vr_ad_reg_file my_reg_file:

reg_def MY_REG MY_REG_FILE 20'h00018 {
    reg_fld my_reg_field     : uint (bits : 32)  : RW : 0x0;
};

Я хотел бы получить доступ к значению регистра. В чем разница (если есть) между прямым доступом к реестру:

some_var = my_reg_file.my_reg.my_reg_field;

и доступ к регистру с помощью read_reg_val():

some_var = my_reg_file.my_reg.read_reg_val();

Спасибо за помощь.


person Halona    schedule 30.10.2014    source источник


Ответы (1)


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

reg_def MY_REG MY_REG_FILE 20'h00018 {
    reg_fld my_reg_field     : uint (bits : 32)  : W : 0x0;
};

Обратите внимание, что я сделал поле только для записи. Допустим, ваше поле обновляется со значением 0x1010_1010.

Вызов my_reg.my_reg_field вернет это значение, 0x1010_1010.

Метод read_reg_val() возвращает значение, которое вы получили бы при доступе на чтение к этому регистру. В этом случае, поскольку поле не читается, вы получите 0x0000_0000 (это значение настраивается, но по умолчанию это значение сброса).

Также есть метод read_reg_rawval(), который возвращает значение, которое хранится в реестре (т.е. игнорирует политики доступа к полям). В нашем случае он вернет значение, хранящееся в поле 0x1010_1010.

read_reg_val() и read_reg_rawval() полезны, когда в регистре объявлено несколько полей, потому что эти методы будут упаковывать значения всех из них и возвращать скалярное значение (типа vr_ad_data_t).

person Tudor Timi    schedule 30.10.2014