2016-10-30 1 views
0

J'ai écrit une séquence qui peut être générique pour une variété de tests. Je veux le faire en ajoutant des fichiers de configuration pour chaque test. Le code pour le sequnce:UVM- Utilisation de mes propres fichiers de configuration vs using config db

//---------------------------------------------------------------------- 
//Sequence 
//---------------------------------------------------------------------- 
class axi_sequence extends uvm_sequence#(axi_transaction); 
    `uvm_object_utils(axi_sequence) 

    //new 
    function new (string name = "axi_sequence"); 
     super.new(name); 
    endfunction: new 

    //main task 
    task body(); 
     int file_p, temp, len; 
     byte mode; 
     bit [31:0] addr; 
     string str;  
     axi_transaction axi_trx; 
     bit [31:0] transfers [$]; 
     bit [31:0] data;  


     //open file 
     file_p = $fopen("./sv/write_only.txt", "r"); //the name of the file should be same as the name of the test 
     //in case file doesn't exist 
     `my_fatal(file_p != 0, "FILE OPENED FAILED") 
     //read file 
     while ($feof(file_p) == 0) 
    begin 
     temp = $fgets(str, file_p); 
     axi_trx = axi_transaction::type_id::create(.name("axi_trx"), .contxt(get_full_name())); 
     // ~start_item~ and <finish_item> together will initiate operation of 
     // a sequence item. 
     start_item(axi_trx); 
     transfers = {}; 
     $sscanf(str, "%c %d %h", mode, len, addr); 
     //assign the data to str 
     str = str.substr(12,str.len()-1); 
     //create and assign to transfers queue 
     if(mode == "w") 
     begin 
      for (int i = 0; i <= len; i++) begin 
      temp = $sscanf(str, "%h", data); 
      `my_fatal(temp > 0, "THE LENGHT PARAM IS WRONG- too big") 
      transfers. push_back(data); 
      str = str.substr(13+(i+1)*8,str.len()-1); 
     end//end for 
      `my_fatal($sscanf(str, "%h", temp) <= 0, "THE LENGHT PARAM IS WRONG- too small") 
     end//if  
     axi_trx.init(mode,len,addr,transfers); 
     if (to_random == 1) to_random should be a part of the configuration file. 
      trx.my_random(); //trx is transaction instance 
      else 
      trx.delay = const_config; //const_delay should be a part of the configuration file. 
     //contains the send_request which send the request item to the sequencer, which will forward 
      // it to the driver. 
     finish_item(axi_trx); 
    end//begin 
    endtask: body 

endclass: axi_sequence 

Dois-je le faire en utilisant différents fichiers de configuration, ou puis-je le faire par des valeurs qui seront passées du test à l'agent par le db de configuration? Et comment puis-je passer un chemin différent (pour le file_p = $ fopen()) pour chaque test?

+0

Quelle est la configuration ici qui doit être modifiée avec chaque test? – noobuntu

+0

@ noobuntu- ./sv/write_only f (chemin d'accès au fichier), to_random, const config – sara8d

Répondre

1

Vous ne devriez pas avoir besoin d'un fichier de configuration séparé pour chaque test. Idéalement, vous devez simplement transmettre la configuration depuis le niveau de test vers l'environnement via config_db (ou via un objet de configuration séparé pour votre agent)

Lorsque vous créez votre séquence dans votre test (ou séquenceur virtuel), vous devrait être en mesure de définir vos variables au besoin.