UVM中参数化的类

截止到目前我了解到的UVM类只有uvm_sequence/uvm_sequencer_param/uvm_driver是带有参数化的类型的。

uvm_driver#(REQ,RSP)

  • 默认的情况下REQ=RSP
  • 默认的类型是uvm_sequence_item
  • TLM端口uvm_seq_item_pull_port
    my_driver extends uvm_driver(my_transaction)
    seq_item_port.get_next_item(req)
  • 其中req的类型默认是my_transaction,如果没有声明,那默认就是uvm_sequence_item的类型。
  • 规范来讲的话,这里要写成my_transaction

uvm_sequencer_param#(REQ,RSP)

  • 默认RSP=REQ
  • 默认的类型为uvm_sequence_item
  • uvm_tlm_fifo就是sqr和driver的item的FIFO。
  • rerandomize=1的时候的randomize,一定要用my_ransaction
  • 这个类对用户的可见度比较低。

uvm_sequencer#(REQ,RSP)

  • uvm_sequencer extends uvm_sequencer_param_base
  • 通过tlm端口我们知道,driver里面的seq_item_port.get_next_item就是对应的调用的uvm_sequencer的,所以这里面有一个隐形的规定,uvm_sequencer和uvm_driver的参数应该保持一致。

小结:要保证uvm_sequencer/uvm_sequence以及uvm_driver的参数一致性。

如果一个seq要发送不同的item,item之间并没有继承关系。可以参看张强的6.4.3.
多说一句有关于这里的两个cast:

  • req实际上是从seq那一侧的item例化的,指向的是my_transaction和you_transaction。
  • cast是同类型对象的转换,driver的req一定要是seq那边过来的,所以这里不能自己new一个item,如果那样的话,这就不是UVM的框架了!!!

你可能感兴趣的:(UVM中参数化的类)