網(wǎng)站首頁 編程語言 正文
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
相關(guān)推薦
- 2022-09-22 nodeSelector:Pod 定向調(diào)度
- 2022-10-23 Android性能優(yōu)化全局異常處理詳情_Android
- 2022-05-23 Python學(xué)習(xí)之時(shí)間包使用教程詳解_python
- 2021-12-15 go語言處理TCP拆包/粘包的具體實(shí)現(xiàn)_Golang
- 2021-12-07 Linux下Hbase安裝配置教程_Linux
- 2022-10-14 ‘configurationClass‘ must be assignable to [org.hi
- 2022-08-11 Python處理文本數(shù)據(jù)的方法詳解_python
- 2024-02-01 QueryWrapper、LambdaQueryWrapper、QueryChainWrapper、
- 最近更新
-
- window11 系統(tǒng)安裝 yarn
- 超詳細(xì)win安裝深度學(xué)習(xí)環(huán)境2025年最新版(
- Linux 中運(yùn)行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲(chǔ)小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎(chǔ)操作-- 運(yùn)算符,流程控制 Flo
- 1. Int 和Integer 的區(qū)別,Jav
- spring @retryable不生效的一種
- Spring Security之認(rèn)證信息的處理
- Spring Security之認(rèn)證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權(quán)
- redisson分布式鎖中waittime的設(shè)
- maven:解決release錯(cuò)誤:Artif
- restTemplate使用總結(jié)
- Spring Security之安全異常處理
- MybatisPlus優(yōu)雅實(shí)現(xiàn)加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務(wù)發(fā)現(xiàn)-Nac
- Spring Security之基于HttpR
- Redis 底層數(shù)據(jù)結(jié)構(gòu)-簡(jiǎn)單動(dòng)態(tài)字符串(SD
- arthas操作spring被代理目標(biāo)對(duì)象命令
- Spring中的單例模式應(yīng)用詳解
- 聊聊消息隊(duì)列,發(fā)送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠(yuǎn)程分支