UVM-prebody

1.在pre_body中raise_objection()

2.通过uvm_config_db来获得一些参数、sequencer等

3.在layered sequencer中,lower sequencer从upper sequencer中得到item。

​ upper_seq_item_port.get_next_item(u_item);

在post_body中,signal the upper sequencer are done.

driver是最靠近DUT的,要想控制DUT需要将操作加载在driver中,比如如果想要复位DUT,需要在driver中,通过对接口中的reset置零。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
interface alu_bfm;
logic clk;
logic reset_n;

task reset_alu(); // 复位dut的任务
reset_n = 0;
@(negedge clk);
@(negedge clk);
reset_n = 1;
endtask
initial begin
clk=0;
forever #10 clk = ~clk;
end
endinterface

class driver extends uvm_driver#(transaction);
....
task run_phase(uvm_phase phase):
bfm.reset_alu(); // 复位DUT
....
endtask
endclass

如果在接口中通过在initial中复位,如下

1
2
3
4
5
6
7
8
9
10
11
interface alu_bfm;
logic clk;
logic reset_n;

initial beign
reset_n = 0;
@(negedge clk);
@(negedge clk);
reset_n = 1;
end
endinterface

这样的话,接口中的reset操作和driver中驱动transaction的操作会同时从0时刻开始,那么可能一些transaction就被错过了。


本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!