mcdf_base_virtual_sequence
1.virtua sequence介绍:
①virtual sequence 可以承载不同目标sequencer的sequence群落,组织协调这些底层sequence可以发送到不同的底层sequencer上(通过宏`uvm_do_on直接创建并发送到virtual sequencer内的底层sequencer上),virtual sequencer一般只会挂载到virtual sequencer上。注:一般底层seq不需要“显式”创建,是通过宏创建之后发送的。
2.⭐base_virtual_sequence写法
(1)内部声明各个底层sequence
(2)创建配置数据,配置寄存器,配置formatter的虚方法,do_data,do_reg,do_formatter,以及一个diff_value函数比较两个数据。
(3)原来在sv中在test实现的方法,现在已经全转移到virtual sequence中,test成为一个“容器”。
①sv中配置方法流程为:test调用do_data、do_reg、do_formatter函数,这三个函数在内部调用data.gen(),reg_gen(),fmt_gen()函数通过配置generator产生的数据在经过系统发送到各个agent的driver中,来配置输入的数据,寄存器的配置和formatter的配置;以下是do_data示例,do_reg、do_formatter类似。
task do_data();
void'(chnl_gens[0].randomize() with {ntrans==100; ch_id==0; data_nidles==0; pkt_nidles==1; data_size==8; });
void'(chnl_gens[1].randomize() with {ntrans==100; ch_id==1; data_nidles==1; pkt_nidles==4; data_size==16;});
void'(chnl_gens[2].randomize() with {ntrans==100; ch_id==2; data_nidles==2; pkt_nidles==8; data_size==32;});
fork
chnl_gens[0].start();
chnl_gens[1].start();
chnl_gens[2].start();
join
#10us; // wait until all data haven been transfered through MCDF
endtask
②uvm中配置方法流程:在seq中调用do_data、do_reg,do_formatter函数,这三个函数在内部利用宏(`uvm_do_on_with)创建并配置发送sequence,到底层sequencer再到各个agent的driver中实现对数据,对寄存器,对formatter的配置。注:virtual sequence与virtual sequencer的挂载是在test中start。
task do_data();
fork
`uvm_do_on_with(chnl_data_seq, p_sequencer.chnl_sqrs[0], {ntrans==100; ch_id==0; data_nidles==0; pkt_nidles==1; data_size==8; })
`uvm_do_on_with(chnl_data_seq, p_sequencer.chnl_sqrs[1], {ntrans==100; ch_id==1; data_nidles==1; pkt_nidles==4; data_size==16;})
`uvm_do_on_with(chnl_data_seq, p_sequencer.chnl_sqrs[2], {ntrans==100; ch_id==2; data_nidles==2; pkt_nidles==8; data_size==32;})
join
#10us; // wait until all data haven been transfered through MCDF
endtask
3.⭐case_sequence的写法
只需在内部里面实现在base_seq创建的空的虚函数的补充,也就是对do_data,do_formatter,do_reg进行填充,在函数中利用宏(`uvm_do_on_with)完成对底层seq的创建、随机化和发送。代码示例如下:
task do_formatter();
`uvm_do_on_with(fmt_config_seq,p_sequencer.fmt_sqr,{fifo == LONG_FIFO;bandwidth == HIGH_WIDTH;})
endtask
task do_data();
fork
`uvm_do_on_with(chnl_data_seq,p_sequencer.chnl_sqrs[0],{ntrans ==100;ch_id==0;data_nidles == 0;pkt_nidles ==1;data_size ==8;})
`uvm_do_on_with(chnl_data_seq,p_sequencer.chnl_sqrs[1],{ntrans ==100;ch_id==1;data_nidles == 1;pkt_nidles ==2;data_size ==16;})
`uvm_do_on_with(chnl_data_seq,p_sequencer.chnl_sqrs[2],{ntrans ==100;ch_id==2;data_nidles == 2;pkt_nidles ==3;data_size ==32;})
join
#10
endtask
标签:do,sequence,virtual,chnl,UVM,sequencer,nidles,data
From: https://blog.csdn.net/m0_67409905/article/details/145076486