在前面文章的producer和consumer示例中,只存在一个进程。producer调用put时执行了consumer中的put方法,consumer调用get时执行了producer中的get方法。
在实际验证环境中你会遇到需要将进程1中的producer_1连接到进程2中的consumer_2的情况,因为TLM组件需要在自己的进程中工作(解耦合)。
连接producer_1组件和consumer_2组件的一种非常常见的方法是使用uvm_tlm_fifo组件。uvm_tlm_fifo是参数化的FIFO以指定存储在fifo中的对象类型,具有put export和get exports。uvm_tlm_fifo的构造函数具有一个用于指示fifo的最大深度(默认为1)的参数。
class producer_1_consumer_2 extends uvm_component;
producer_1 producer1_inst;
consumer_2 consumer2_inst;
uvm_tlm_fifo#(simple_packet) fifo_inst; // fifo stores simple_packets
function new(string name, uvm_component parent);
producer1_inst= new("producer1_inst", this);
consumer2_inst= new("consumer2_inst", this);
fifo_inst= new("fifo_inst", this, 16); // set fifo depth to 16
endfunction
virtual function void connect();
producer1_inst.put_port.connect(fifo_inst.put_export);
consumer2_inst.get_port.connect(fifo_inst.get_export);
endfunction
endclass
运行此代码时,producer_1组件中将创建的数据包存储到fifo中,consumer_2组件调用get方法从fifo中取出数据。
由于存在FIFO,producer_1组件进程和consumer_2组件进程之间的同步现在已经解耦。任何一个进程都可以添加任意延迟, fifo和阻塞put/get调用的使用可确保不会丢失任何数据包,这也使得验证平台的搭建更加容易。
往期精彩