2016-12-12 8 views
1

У меня есть читать последовательность регистров, что идет что-то вроде этого:Как получить чтения данных из vr_ad_sequence

extend vr_ad_sequence_kind: [READ_REG]; 
extend READ_REG vr_ad_sequence { 
    // register to read 
    reg_kind : vr_ad_reg_kind; 
    !reg : vr_ad_reg; 

    // more fields no longer shown here 

    body() @driver.clock is { 
     var reg_item : vr_ad_reg; // reg_item gets a value from a 
            // method that returns the correct 
            // register instance from the addr_map, 
            // which I no longer want to show here 

     reg = new vr_ad_reg with { .kind = reg_kind; };  
     read_reg { .static_item == reg_item; } reg; 
    }; 
}; 

Теперь у меня есть виртуальная последовательность, которая делает vr_ad_sequence выше:

extend MAIN MAIN_TEST sample_vseq { 
    !reg_read : READ_REG vr_ad_sequence; 

    body() @driver.clock is first { 
     do reg_read keeping { 
      .driver == driver.reg_driver; 
      .reg_kind == MY_REGISTER; 
     }; 

     // how to get the value of MY_REGISTER.MY_FIELD from 
     // the reg_read sequence above? 
    }; 
}; 

Моя основная цель - прочитать значение определенного битового поля регистра, которое является MY_FIELD в приведенном выше примере. Есть ли способ сделать это без изменения чего-либо в оригинале READ_REG vr_ad_sequence? Если это не поможет, как мне сделать READ_REG vr_ad_sequence вернуть значение чтения вызывающему sample_vseq?

Большое спасибо за внимание.

+0

Вы уверены, что ваш BFM обновляет свои автобусные операции с данными, она читает? Вам необходимо создать необходимую инфраструктуру по цепочке vr_ad -> sequence_driver -> BFM. –

+0

@TudorTimi: Да, фактически после «выполнения последовательности« READ_REG »vr_ad выполняет' compare_and_update_body() ', который получает правильное значение шины, как я вижу из этого сообщения - пожалуйста, обратитесь к основному вопросу выше. – renvill

+0

hi, Поле регистра последовательности, как ожидается, изменится действием read_reg. И значение, которое нужно поместить в регистр, - это значение, возвращаемое методом vr_ad_execute_op() (метод драйвера BFM). Может случиться так, что vr_ad_execute_op возвращает одно значение (0x4, в вашем примере) и монитор, вызывающий compare_and_update - вызовы с другими данными (0). Я предлагаю установить точку прерывания на * .vr_ad_execute_op и увидеть возвращаемое значение. – user3467290

ответ

1

Для получения значения регистра после считывания сначала необходимо убедиться, что чтение закончилось на шине. Таким образом, ваш BFM блокирует (что часто это не так), или вы добавляете флаг в последовательность, которая сообщает, был ли получен ответ (это можно установить из BFM/драйвера). Затем вы можете получить значение из экземпляра vr_ad_map. .

body() @driver.clock is first { 
    do reg_read keeping { 
     .driver == driver.reg_driver; 
     .reg_kind == MY_REGISTER; 
    }; 
    // Wait for read response 
    sync true(reg_read != NULL and reg_read.done); 
    // Access shadow register through pointer to vr_ad_map instance 
    print addr_map.get_register_by_kind(MY_REGISTER).as_a(MY_REGISTER vr_ad_reg).MY_FIELD; 
}; 

(я не могу проверить синтаксис прямо сейчас)

+0

Это решило проблему. Правильный синтаксис будет выглядеть следующим образом: 'print get_enclosing_unit (my_env_u) .addr_map.get_reg_by_kind (MY_REGISTER) .as_a (MY_REGISTER vr_ad_reg) .MY_FIELD;' поскольку я в виртуальной последовательности. Линия немного длинная, но она служит своей цели. Огромное спасибо! – renvill