3

私は簡単なシーケンスを持っています

 regmodel.REGx.write (...)

regmodel vizの下に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);

今、私は regName を持っていますが、以下を使用することはできません:

   regmodel.regName.write (...)

regName は文字列型で、regmodel にはレジスタ名 regName がありません。これを達成する他の方法はありますか? get_name、get_full_name を見ていましたが、この場合は役に立ちませんでした。

今のところ、if - else 8 回または case ステートメントを使用できますが、レジスタが多数ある場合は非常に不便です。

4

1 に答える 1

5

プログラムで構成された文字列を使用してレジスタを確実に見つけることができます。を使用する必要があります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_reguvm_reg::get_field_by_name

于 2014-01-28T02:06:11.280 に答える