精品国产人成在线_亚洲高清无码在线观看_国产在线视频国产永久2021_国产AV综合第一页一个的一区免费影院黑人_最近中文字幕MV高清在线视频

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

在UVM中component之間如何通信呢?

冬至子 ? 來源:多讀點書 ? 作者:夕文x ? 2023-05-26 15:07 ? 次閱讀

在簡單的測試平臺里,component之間通過變量或者config_db機制通信是可行的,但是如果在復雜測試平臺中依然使用這種耦合性很強的方式通信的話,就不太行了。

因此,UVM提供了TLM這樣的概念。接下來將會從需求出發,逐步引入port、export、imp、analysis端口、uvm_analysis_imp_decl宏以及FIFO等。

1 典型UVM驗證平臺

圖片

2 一對一如何通信(一般方法)

說明:這里以monitor和scoreboard之間的通信為例

  • 方法一 使用全局變量 :在monitor里對此全局變量進行賦值, 在scoreboard里監測此全局變量值的改變
    • 問題:所有模塊都可以修改全局變量,合作中他人誤修改可能導致致命bug
  • 方法二 A中pulic變量+B對模塊A的引用 :scoreboard中使用public類型的變量,然后monitor中使用指向scoreboard的指針對該變量進行賦值
    • 問題:monitor可以修改scoreboard中所有public類型變量
  • 方法三 config機制(類似于在指定模塊作用域構建了全局變量) :在base_test中實例化一個config_object,并將其指針通過config_db傳遞給scoreboard和monitor,然后兩個模塊就可以對該config_object中變量進行操作
    • 問題1:需要引入一個專門的config_object類
    • 問題2:一定要有base_test(父模塊)這個第三方的參與,這樣就不能保證某一個從base_test派生而來的類會不會改變這個config_object類中某些變量的值

現有機制更多通信問題

  • 通信需要考慮阻塞和非阻塞的處理方式
  • 如果scoreboard主動要求向monitor請求數據, 這樣的行為方式使用systemverilog搭建會非常復雜

3 一對一如何通信(引入TLM)

3.1 新概念

  • TLM:是Transaction Level Modeling( 事務級建模) 的縮寫,是將某一特定功能的一組信息封裝在一起成為一個類,通過這個類(即事務)進行通信。
  • 三個端口:PORT(發起者)、EXPORT(接收者)、IMP(執行者)
  • 端口方法:put/get/transport/peek/get_peek

3.2 使用舉例

說明:以blocking_put系列端口,PORT>EXPORT>IMP的連接舉例說明

圖片

  • A|PORT發起端口操作put :task A::main_phase中A_port.put(tr);
  • 建立A|PORT和B|EXPORT的連接 :AB的頂層模塊my_env::connect_phase中:A_inst.A_port.connect(B_inst.B_export);
  • 建立B|EXPORT和B|IMP的連接 :B::connect_phase中:B_export.connect(B_imp);
  • 建立B|IMP和B中操作put的連接 :B模塊定義中:uvm_blocking_put_imp#(my_transaction, B) B_imp;
  • B中操作put的實現 :function void B::put(my_transaction tr);

注意:EXPORT可以省略,即 PORT直接連接到IMP

4 一對多如何通信(引入analysis端口)

4.1 使用舉例

圖片

  1. A|analysis_port發起端口操作write :task A::main_phase中A_ap.write(tr);

  2. 建立A|analysis_port和(B或C)|analysis_imp,的連接 :A(B或C)的頂層模塊my_env::connect_phase中

    A_inst.A_ap.connect(B_inst.B_imp);

    A_inst.A_ap.connect(C_inst.C_imp);

  3. 建立(B或C)|analysis_imp和(B或C)中操作write的連接 :(B或C)模塊定義中:

    uvm_analysis_imp#(my_transaction, B) B_imp;或

    uvm_analysis_imp#(my_transaction, C) C_imp;

  4. (B或C)中操作write的實現

    function void B::write

    function void C::write

5 多IMP的模塊的通信問題

5.1 問題描述

一個component(my_scoreboard)內有多個IMP時,依據前面知識,component(my_scoreboard)中只能有一個write方法,這如何處理兩個imp(來自輸出監視monitor 和 來自參考模型model)

5.2 解決方法

方法一:使用宏uvm_analysis_imp_decl

通過宏uvm_analysis_imp_decl,在component(my_scoreboard)中添加不同的后綴以區分兩個imp的處理邏輯。具體實現如下:

  1. 通過宏uvm_analysis_imp_decl聲明兩個后綴_monitor和_model

    uvm_analysis_imp_decl(**_monitor**)
    uvm_analysis_imp_decl( _model )

  2. 使用帶后綴的analysis_imp端口類聲明兩個analysis_imp端口

    uvm_analysis_imp**_monitor**#(my_transaction, my_scoreboard) monitor_imp;

    uvm_analysis_imp**_model**#(my_transaction, my_scoreboard) model_imp;

  3. 使用帶后綴的write方法實現analysis_imp對信號的處理邏輯

    extern function void write**_monitor**(my_transaction tr);

    extern function void write**_model**(my_transaction tr);

  4. 宏uvm_analysis_imp_decl的特性會讓 相同后綴的 analysis_imp端口 和 write函數 對應上

    function void my_scoreboard ::write_model(my_transaction tr);

    function void my_scoreboard ::write_monitor(my_transaction tr);

方法二:使用FIFO通信

將imp的實現邏輯放在FIFO中,而component(my_scoreboard)作為PORT端,主動請求get到FIFO中的數據,關鍵代碼如下:

// my_scoreboard類中
uvm_blocking_get_port #(my_transaction) exp_port;
uvm_blocking_get_port #(my_transaction) act_port;
// task my_scoreboard::main_phase中
exp_port.get(get_expect); // 獲取的數據存到get_expect中
act_port.get(get_actual); // 獲取的數據存到get_actual中

// my_env類中
uvm_tlm_analysis_fifo #(my_transaction) agt_scb_fifo;
uvm_tlm_analysis_fifo #(my_transaction) agt_mdl_fifo;
uvm_tlm_analysis_fifo #(my_transaction) mdl_scb_fifo;
// function void my_env::connect_phase中
i_agt.ap.connect(agt_mdl_fifo.analysis_export);
mdl.port.connect(agt_mdl_fifo.blocking_get_export);
mdl.ap.connect(mdl_scb_fifo.analysis_export);
scb.exp_port.connect(mdl_scb_fifo.blocking_get_export);
o_agt.ap.connect(agt_scb_fifo.analysis_export);
scb.act_port.connect(agt_scb_fifo.blocking_get_export);

注意:FIFO中的analysis_export和blocking_get_export雖然名字中有關鍵字export, 但是其類型卻是IMP

5.3 用FIFO還是用IMP

個人推薦使用FIFO,尤其是對于使用端口數組的情況。因為ap與imp直接相連不能使用for循環(write函數需要一個一個寫,沒法用數組),會導致代碼量增加,理解困難。

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • UVM
    UVM
    +關注

    關注

    0

    文章

    181

    瀏覽量

    19088
  • TLM
    TLM
    +關注

    關注

    1

    文章

    32

    瀏覽量

    24711
  • IMP
    IMP
    +關注

    關注

    0

    文章

    11

    瀏覽量

    8365
  • FIFO存儲
    +關注

    關注

    0

    文章

    103

    瀏覽量

    5946
收藏 人收藏

    評論

    相關推薦

    數字IC驗證之“什么是UVM”“UVM的特點”“UVM提供哪些資源”(2)連載...

    。可以不改變平臺代碼的基礎上改變平臺的行為,以產生不同類型的激勵。平臺可以不同的驗證工程之間進行移植,善于利用uvm提供的各種機制。可以使驗證平臺具有極強的可重用性。
    發表于 01-21 16:00

    數字IC驗證之“典型的UVM平臺結構”(3)連載...

    應用的過程,將uvm的組件封裝起來,可以將這些封裝的組件作為一個整體進行重用,進行芯片級或者是系統級驗證的時候,往往會出現多個模塊的驗證。  此時,測試平臺的結構會發生變化,圖中
    發表于 01-22 15:32

    數字IC驗證之“構成uvm測試平臺的主要組件”(4)連載...

    的基類。驗證工程師搭建驗證平臺的時候,每一個組件需要從相應的基類進行擴展。  來看一下uvm提供了哪些基類,以及這些基類和平臺中的各個組件之間的關系。  uvm
    發表于 01-22 15:33

    什么是uvmuvm的特點有哪些

    直觀的印象,就是uvm驗證平臺,它是分層的結構。圖中的每一個巨型框都代表著平臺的一個構成元素。這些元素,我們稱為平臺組建,下面來簡單的分析一下。從最底層上來看,agent 包含了driver,monitor和sequence
    發表于 02-14 06:46

    請問一下UVM的UVMsequences是什么意思啊

    UVM方法學,UVMsequences 是壽命有限的對象。UVM sequences從uvm_sequence_item基類擴展得到,
    發表于 04-11 16:43

    談談UVMuvm_info打印

    上有\`uvm_file和\`uvm_line的傳參,它們定義如下:  `define uvm_file `__FILE__  `define uvm_line `__LINE__  
    發表于 03-17 16:41

    UVMseq.start()和default_sequence執行順序

    和seq2誰會先啟動?  // Method1: using build-in start() method of sequence  task run_phase(uvm_phase phase
    發表于 04-04 17:15

    典型的UVM Testbench架構

    UVM類庫提供了通用的代碼功能,如component hierarchy、transaction level model(TLM),configuration database等等,使用戶能夠創建任何類型的Testbench架構。
    的頭像 發表于 05-22 10:14 ?1861次閱讀
    典型的<b class='flag-5'>UVM</b> Testbench架構

    UVM TLM的基本概念介紹

    UVM,transaction 是一個類對象,它包含了建模兩個驗證組件之間通信所需的任何信息。
    的頭像 發表于 05-24 09:17 ?1537次閱讀
    <b class='flag-5'>UVM</b> TLM的基本概念介紹

    UVM學習筆記(一)

    driver應該派生自uvm_driver,而uvm_driver派生自uvm_component
    的頭像 發表于 05-26 14:38 ?1202次閱讀
    <b class='flag-5'>UVM</b>學習筆記(一)

    UVMuvm_config_db機制背后的大功臣

    本次講一下UVMuvm_config_db,UVM中提供了一個內部數據庫,可以在其中存儲給定名稱下的值,之后可以由其它TB組件去檢索。
    的頭像 發表于 06-20 17:28 ?1154次閱讀

    如何用Verdi查看UVM環境的變量?

    我們常用的debug UVM的方法是通過打印log實現。有沒有辦法像 debug RTL代碼一樣將 UVM 變量拉到波形上看?答案是有的,下面讓我們看看是怎么做到的。
    的頭像 發表于 06-25 16:01 ?1379次閱讀
    如何用Verdi查看<b class='flag-5'>UVM</b>環境<b class='flag-5'>中</b>的變量?

    UVMuvm_config_db機制背后的大功臣

    本次講一下UVMuvm_config_db,UVM中提供了一個內部數據庫,可以在其中存儲給定名稱下的值,之后可以由其它TB組件去檢索。
    的頭像 發表于 06-29 16:57 ?1012次閱讀

    行為型設計模式UVM的應用

    接下來介紹行為型設計模式UVM的應用。
    的頭像 發表于 08-09 14:01 ?563次閱讀
    行為型設計模式<b class='flag-5'>在</b><b class='flag-5'>UVM</b><b class='flag-5'>中</b>的應用

    UVM設計的sequence啟動方式有哪幾種

    本篇介紹UVM的sequence,這是UVM中最基礎的部分。對于前面介紹的uvm_callback, uvm_visitor等,很少被使用
    的頭像 發表于 08-17 10:07 ?3357次閱讀
    <b class='flag-5'>UVM</b>設計<b class='flag-5'>中</b>的sequence啟動方式有哪幾種<b class='flag-5'>呢</b>?