2014-01-27 108 views
3

獲得註冊名(在regmodel提供)我有一個簡單的序列我可以從字符串

regmodel.REGx.write (...) 

讓我們考慮我已經下regmodel即8個寄存器。 REG0,REG1,REG2,...,REG7 我想通過數字作爲測試加參數,說+ NUM = 4

使用$ sformat或$ psprintf,我可以創建具有正確的註冊名稱的字符串變量例如

if ($value$plusargs ("NUM=%0d", num)) 
    $display ("Testcase passed %0d num", num); 
    else 
    num = 0; 
    $sformat (regName, "REG%0d", num); 

現在我已經寄存器名,但我不能使用下列內容:

regmodel.regName.write (...) 

寄存器名是字符串類型regmodel好好嘗試一下有任何寄存器名寄存器名,是否有任何其他的方式來實現這個?我正在查看get_name,get_full_name,但在這種情況下無法提供幫助。

現在我可以有if - else 8次或者case語句,但是對於大量的寄存器來說真的很不方便。

回答

4

您當然可以使用已編程組成的字符串找到一個寄存器。您將需要使用uvm_reg_block::get_reg_by_name

的使用將是這個樣子:

function void write_reg_by_num(int num, bit[31:0] data); 
    string reg_name = $sformatf("REG%0d", num); 
    uvm_reg reg = regmodel.get_reg_by_name(reg_name); 
    if (reg == null) begin 
    // No reg was found... you likely want to flag an error here 
    end else begin 
    uvm_status_e status; 
    reg.write(status, data); 
    end 
endfunction 

注意,最終uvm_reg對象是基類的,所以如果你想訪問各個領域,你需要使用基類的方法來訪問田野。也就是說,您需要使用uvm_reg上的方法,例如uvm_reg::get_field_by_name

+0

感謝它完美的工作,儘管我現在沒有創建單獨的功能。現在我查看Register model - > Blocks(https://verificationacademy.com/verification-methodology-reference/uvm/docs_1.1d/html/index.html)的文檔,我發現它在那裏:) – wisemonkey

相關問題