2014-01-27 2 views
3

Я простую последовательностьМогу ли я получить имя регистра (доступный в regmodel) из строки

regmodel.REGx.write (...) 

Давайте рассмотрим Я 8 регистров под regmodel именно. REG0, REG1, REG2, ...., REG7 Я хотел бы передать номер как аргумент test plus, скажем + 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 doens't есть имена регистров регистр ', Есть ли другой способ достичь это? Я смотрел на 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 -> Blocks (https://verificationacademy.com/verification-methodology-reference/uvm/docs_1.1d/html/index.html), я нахожу ее там :) – wisemonkey