上期答案
工厂是UVM中使用的一种特殊查找表,用于创建组件或事务类型的对象。使用工厂创建对象的好处是,测试平台构建可以在运行时决定创建哪种类型的对象。因此,一个类可以用另一个派生类替换,而无需任何实际代码更改。为确保此功能,建议所有类都在工厂注册。如果不注册到工厂,则将无法使用工厂方法::type_id::create()构造对象。
UVM工厂允许在构造时将一个类替换为另一个派生类。通过将一个类替换为另一个类而不需要编辑或重新编译测试平台代码,这对于控制测试平台的行为很有用。
类型覆盖意味着每次在测试平台层次结构中创建组件类类型时,都会在其位置创建替代类型。这适用于该组件类型的所有实例。
另一方面,实例覆盖意味着仅覆盖组件类的特定实例。组件的特定实例由该组件在UVM组件层次结构中的位置进行索引。
由于只有UVM组件类可以在UVM测试平台中具有层次结构,因此实例覆盖只能作用于组件类,而sequence(或者说object)只能覆盖类型。
不,只有UVM_component类是UVM测试平台层次结构的一部分,从而可以使用实例覆盖。sequence_item或sequence不是UVM测试平台层次结构的一部分,因此只能使用类型覆盖来覆盖,类型覆盖将覆盖该类型的所有对象。
uvm_objection类提供了一种在多个组件和sequence之间共享计数器的方法。每个组件/sequence可以异步地"raise"和"drop" objections,这会增加或减少计数器值。当计数器达到零(从非零值开始)时,将发生"all dropped"情况。
objection机制最常用于UVM phase机制中,以协调每个run_time phase的结束。在phase中启动的用户进程会首先raise objections,并在进程完成后drop objections。当一个phase中的所有进程都放下objections时,该phase的objections计数器清零。这种“all dropped”的情况说明每个进程都同意结束该phase。
下面是一个示例,说明如何在sequencer(my_sequencer)上启动sequence(my_test_sequence)并在sequence执行后drop objections
task run_phase( uvm_phase phase);
phase.raise_objection( this );
my_test_sequence.start(my_sequencer);
phase.drop_objection( this );
endtask
正确答案将在下一期公布,或者到下面的文章获取答案