截止到目前我了解到的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的框架了!!!
网友评论