2016-12-12 3 views
1

J'ai une séquence de lecture de registre qui va quelque chose comme ceci:Comment obtenir les données lues à partir d'un 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; 
    }; 
}; 

Maintenant, j'ai une séquence virtuelle qui fait le vr_ad_sequence ci-dessus:

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? 
    }; 
}; 

Mon objectif principal est de lire la valeur d'un champ de bit de registre spécifique qui est MY_FIELD dans l'exemple ci-dessus. Y at-il un moyen de le faire sans rien modifier dans le READ_REG vr_ad_sequence d'origine? Si cela ne peut pas être aidé, comment puis-je rendre le READ_REG vr_ad_sequence renvoyer la valeur lue à l'appelant sample_vseq?

Merci beaucoup d'avance.

+0

Êtes-vous sûr que votre BFM est mise à jour vos transactions de bus avec les données qu'il lit? Vous devez disposer de l'infrastructure appropriée tout le long de la chaîne vr_ad -> sequence_driver -> BFM. –

+0

@TudorTimi: Oui, après avoir fait la séquence 'READ_REG', le vr_ad fait un' compare_and_update_body() 'qui obtient la bonne valeur de bus, comme je peux le voir dans ce message - veuillez vous référer à la question principale au dessus. – renvill

+0

hi, Le champ reg de la séquence devrait en effet changer par l'action read_reg. Et la valeur à mettre dans le registre est la valeur renvoyée par la méthode vr_ad_execute_op() (la méthode du pilote BFM). Il peut arriver que vr_ad_execute_op renvoie une valeur (0x4, dans votre exemple) et le moniteur, appelant compare_and_update - appels avec une autre donnée (0). Je suggère de définir un point d'arrêt à * .vr_ad_execute_op, et voir la valeur qu'il renvoie. – user3467290

Répondre

1

Pour obtenir la valeur de registre après la lecture, vous devez d'abord vous assurer que la lecture est terminée sur le bus. Donc, soit votre BFM bloque (ce qui n'est souvent pas le cas), soit vous ajoutez un drapeau à la séquence qui indique si la réponse a été reçue (ceci peut être défini depuis le BFM/driver). Ensuite, vous pouvez obtenir la valeur de l'instance de vr_ad_map. E.g.

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; 
}; 

(je ne peux pas vérifier la syntaxe en ce moment)

+0

Cela a résolu le problème. La syntaxe correcte serait: 'print get_enclosing_unit (mon_env_u) .addr_map.get_reg_by_kind (MON_REGISTER) .as_a (MON_REGISTER vr_ad_reg) .MY_FIELD;' puisque je suis dans une séquence virtuelle. La ligne est un peu longue, mais elle sert son but. Merci beaucoup! – renvill