日本免费高清视频-国产福利视频导航-黄色在线播放国产-天天操天天操天天操天天操|www.shdianci.com

學(xué)無先后,達(dá)者為師

網(wǎng)站首頁 編程語言 正文

UVM中analysis端口的使用方法

作者:Alfred.HOO 更新時(shí)間: 2022-07-11 編程語言

UVM中有兩種特殊的端口:analysis_port和analysis_export。這兩者其實(shí)與put和get系列端口類似,都用于傳遞transaction。它們的區(qū)別是:
第一,默認(rèn)情況下,一個(gè)analysis_port(analysis_export)可以連接多個(gè)IMP,也就是說,analysis_port(analysis_export)與IMP
之間的通信是一對(duì)多的通信,而put和get系列端口與相應(yīng)IMP的通信是一對(duì)一的通信(除非在實(shí)例化時(shí)指定可以連接的數(shù)量,參照4.2.1節(jié)A_port的new函數(shù)原型代碼清單4-4)。analysis_port(analysis_export)更像是一個(gè)廣播。

第二,put與get系列端口都有阻塞和非阻塞的區(qū)分。但是對(duì)于analysis_port和analysis_export來說,沒有阻塞和非阻塞的概念。
因?yàn)樗旧砭褪菑V播,不必等待與其相連的其他端口的響應(yīng),所以不存在阻塞和非阻塞。一個(gè)analysis_port可以和多個(gè)IMP相連接進(jìn)行通信,但是IMP的類型必須是uvm_analysis_imp,否則會(huì)報(bào)錯(cuò)。
對(duì)于put系列端口,有put、try_put、can_put等操作,對(duì)于get系列端口,有g(shù)et、try_get和can_get等操作。對(duì)于analysis_port和
analysis_export來說,只有一種操作:write。在analysis_imp所在的component,必須定義一個(gè)名字為write的函數(shù)。

要實(shí)現(xiàn)圖中所示的連接關(guān)系,A的代碼為:

文件:src/ch4/section4.3/4.3.1/analysis_port/A.sv
3 class A extends uvm_component;
4   `uvm_component_utils(A)
5
6   uvm_analysis_port#(my_transaction) A_ap; //
…
13 endclass
…
20 task A::main_phase(uvm_phase phase); //
21   my_transaction tr;
22   repeat(10) begin
23     #10;
24     tr = new("tr");
25     assert(tr.randomize());
26     A_ap.write(tr); //
27    end
28 endtask

A的代碼很簡(jiǎn)單,只是簡(jiǎn)單地定義一個(gè)analysis_port,并在main_phase中每隔10個(gè)時(shí)間單位寫入一個(gè)transaction。B的代碼為:

文件:src/ch4/section4.3/4.3.1/analysis_port/B.sv
3 class B extends uvm_component;
4 `uvm_component_utils(B)
5
6 uvm_analysis_imp#(my_transaction, B) B_imp; //
…
15 endclass
…
26 function void B::write(my_transaction tr); //
27   `uvm_info("B", "receive a transaction", UVM_LOW)
28   tr.print();
29 endfunction

如前所述,B是B_imp所在的component,因此要在B中定義一個(gè)名字為write的函數(shù)。在B的main_phase中不需要做任何操作。
C的代碼與B完全相似,只要把相應(yīng)的B替換為C即可。
env中的連接關(guān)系為:

//my_env.sv
29 function void my_env::connect_phase(uvm_phase phase);
30 super.connect_phase(phase);
31 A_inst.A_ap.connect(B_inst.B_imp);
32 A_inst.A_ap.connect(C_inst.C_imp);
33 endfunction

上面只是一個(gè)analysis_port與IMP相連的例子。analysis_export和IMP也可以這樣相連接,只需將上面例子中的
uvm_analysis_port改為uvm_analysis_export就可以。
與put系列端口的PORT和EXPORT直接相連會(huì)出錯(cuò)的情況一樣,analysis_port如果和一個(gè)analysis_export直接相連也會(huì)出錯(cuò)。只
有在analysis_export后面再連接一級(jí)uvm_analysis_imp,才不會(huì)出錯(cuò)。

現(xiàn)實(shí)情況中,scoreboard除了接收monitor的數(shù)據(jù)之外,還要接收reference model的數(shù)據(jù)。相應(yīng)的scoreboard就要再添加一個(gè)
uvm_analysis_imp的IMP,如model_imp。此時(shí)問題就出現(xiàn)了,由于接收到的兩路數(shù)據(jù)應(yīng)該做不同的處理,所以這個(gè)新的IMP也要
有一個(gè)write任務(wù)與其對(duì)應(yīng)。但是write只有一個(gè),怎么辦?
UVM考慮到了這種情況,它定義了一個(gè)宏uvm_analysis_imp_decl來解決這個(gè)問題,其使用方式為:

//my_scoreboard.sv
4 `uvm_analysis_imp_decl(_monitor) //
5 `uvm_analysis_imp_decl(_model)   //
6 class my_scoreboard extends uvm_scoreboard;
7 my_transaction expect_queue[$];
8
9 uvm_analysis_imp_monitor#(my_transaction, my_scoreboard) monitor_imp; //
10 uvm_analysis_imp_model#(my_transaction, my_scoreboard) model_imp;    //
…
15 extern function void write_monitor(my_transaction tr); //
16 extern function void write_model(my_transaction tr);   //
17 extern virtual task main_phase(uvm_phase phase);
18 endclass

上述代碼通過宏uvm_analysis_imp_decl聲明了兩個(gè)后綴_monitor和_model。UVM會(huì)根據(jù)這兩個(gè)后綴定義兩個(gè)新的IMP類:
uvm_analysis_imp_monitor和uvm_analysis_imp_model,并在my_scoreboard中分別實(shí)例化這兩個(gè)類:monitor_imp和model_imp。當(dāng)與monitor_imp相連接的analysis_port執(zhí)行write函數(shù)時(shí),會(huì)自動(dòng)調(diào)用write_monitor函數(shù),而與model_imp相連接的analysis_port執(zhí)行write函數(shù)時(shí),會(huì)自動(dòng)調(diào)用write_model函數(shù)。所以,只要完成后綴的聲明,并在write后面添加上相應(yīng)的后綴就可以正常工作了:

//my_scoreboard.sv
30 function void my_scoreboard::write_model(my_transaction tr);  //
31 expect_queue.push_back(tr);
32 endfunction
33
34 function void my_scoreboard::write_monitor(my_transaction tr); //
35 my_transaction tmp_tran;
36 bit result;
37 if(expect_queue.size() > 0) begin
…
55 end
56
57 endfunction

原文鏈接:https://blog.csdn.net/Michael177/article/details/125710968

欄目分類
最近更新