1

私は16個のレジスタのレジスタスペースを持っています。これらは、シリアル バス (シングルおよびバースト) を介してアクセスできます。これらのレジスター用に UVM reg モデルを定義しました。ただし、バス上のバースト トランザクションをサポートする reg モデル メソッドはありません。

回避策として

  1. 同じスペースのメモリ モデルを宣言できます。バースト アクセスが必要なときはいつでもメモリ モデルを使用しますが、同じものに対して 2 つの別々のクラスを宣言するのは冗長なようで、このアプローチではレジスタ値が正しくミラーリングされません。
  2. バイト数の反復をループし、レジスタに 1 つずつアクセスする関数を作成しますが、このメソッドはバス上でバースト トランザクションを作成しません。

したがって、レジスタ モデルで burst_read および burst_write メソッドを使用する方法があるかどうかを知りたいです。burst_read と burst_write がミラーリングをサポートしていればいいのですが (現在の実装ではサポートされていません)、そうでない場合は .predict と .set を使用できるので、大きな問題ではありません。

または、レジスタ モデルのメソッドを簡単に実装して、バースト操作をサポートできますか。

4

2 に答える 2

2

私はあなたが始めるのを助けるためにこれを見つけました:

http://forums.accellera.org/topic/716-uvm-register-model-burst-access/

男は、読み取り/書き込みが取るオプションの「拡張」引数の使用について言及しています。コンテナー オブジェクト内にバースト長の長さを格納し ( Java とint比較して) 、最初のレジスターIntegerを呼び出すときにそれを引数として渡すことができます。write()

大まかなスケッチ (未テスト):

// inside your register sequence
uvm_queue #(int) container = new("container");
container.push_front(4);
start_reg.write(status, data, .extension(container));


// inside your adapter
function uvm_sequence_item reg2bus(const ref uvm_reg_bus_op rw);
  int burst_len = 1;

  uvm_reg_item reg_item = get_item();
  uvm_queue #(int) extension;
  if ($cast(extension, reg_item.extension))
    burst_len = extension.pop_front();

  // do the stuff here based on the burst length
  // ...
endfunction

uvm_queueUVM には自明なコンテナー オブジェクトがないため、使用しました。

于 2014-04-21T00:28:42.353 に答える