0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

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

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

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

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

1 典型UVM驗(yàn)證平臺

圖片

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

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

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

現(xiàn)有機(jī)制更多通信問題

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

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

3.1 新概念

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

3.2 使用舉例

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

圖片

  • A|PORT發(fā)起端口操作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的實(shí)現(xiàn) :function void B::put(my_transaction tr);

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

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

4.1 使用舉例

圖片

  1. A|analysis_port發(fā)起端口操作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的實(shí)現(xiàn)

    function void B::write

    function void C::write

5 多IMP的模塊的通信問題

5.1 問題描述

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

5.2 解決方法

方法一:使用宏uvm_analysis_imp_decl

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

  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方法實(shí)現(xiàn)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函數(shù) 對應(yīng)上

    function void my_scoreboard ::write_model(my_transaction tr);

    function void my_scoreboard ::write_monitor(my_transaction tr);

方法二:使用FIFO通信

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

// 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); // 獲取的數(shù)據(jù)存到get_expect中
act_port.get(get_actual); // 獲取的數(shù)據(jù)存到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雖然名字中有關(guān)鍵字export, 但是其類型卻是IMP

5.3 用FIFO還是用IMP

個人推薦使用FIFO,尤其是對于使用端口數(shù)組的情況。因?yàn)閍p與imp直接相連不能使用for循環(huán)(write函數(shù)需要一個一個寫,沒法用數(shù)組),會導(dǎo)致代碼量增加,理解困難。

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報(bào)投訴
  • UVM
    UVM
    +關(guān)注

    關(guān)注

    0

    文章

    181

    瀏覽量

    19114
  • TLM
    TLM
    +關(guān)注

    關(guān)注

    1

    文章

    32

    瀏覽量

    24722
  • IMP
    IMP
    +關(guān)注

    關(guān)注

    0

    文章

    11

    瀏覽量

    8378
  • FIFO存儲
    +關(guān)注

    關(guān)注

    0

    文章

    103

    瀏覽量

    5953
收藏 人收藏

    評論

    相關(guān)推薦

    數(shù)字IC驗(yàn)證之“什么是UVM”“UVM的特點(diǎn)”“UVM提供哪些資源”(2)連載...

    ??梢?b class='flag-5'>在不改變平臺代碼的基礎(chǔ)上改變平臺的行為,以產(chǎn)生不同類型的激勵。平臺可以不同的驗(yàn)證工程之間進(jìn)行移植,善于利用uvm提供的各種機(jī)制??梢允跪?yàn)證平臺具有極強(qiáng)的可重用性。
    發(fā)表于 01-21 16:00

    數(shù)字IC驗(yàn)證之“典型的UVM平臺結(jié)構(gòu)”(3)連載...

    應(yīng)用的過程,將uvm的組件封裝起來,可以將這些封裝的組件作為一個整體進(jìn)行重用,進(jìn)行芯片級或者是系統(tǒng)級驗(yàn)證的時候,往往會出現(xiàn)多個模塊的驗(yàn)證?! 〈藭r,測試平臺的結(jié)構(gòu)會發(fā)生變化,圖中
    發(fā)表于 01-22 15:32

    數(shù)字IC驗(yàn)證之“構(gòu)成uvm測試平臺的主要組件”(4)連載...

    的基類。驗(yàn)證工程師搭建驗(yàn)證平臺的時候,每一個組件需要從相應(yīng)的基類進(jìn)行擴(kuò)展?! 砜匆幌?b class='flag-5'>uvm提供了哪些基類,以及這些基類和平臺中的各個組件之間的關(guān)系?! ?b class='flag-5'>uvm
    發(fā)表于 01-22 15:33

    什么是uvmuvm的特點(diǎn)有哪些

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

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

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

    談?wù)?b class='flag-5'>UVMuvm_info打印

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

    UVMseq.start()和default_sequence執(zhí)行順序

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

    典型的UVM Testbench架構(gòu)

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

    UVM TLM的基本概念介紹

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

    UVM學(xué)習(xí)筆記(一)

    driver應(yīng)該派生自uvm_driver,而uvm_driver派生自uvm_component
    的頭像 發(fā)表于 05-26 14:38 ?1277次閱讀
    <b class='flag-5'>UVM</b>學(xué)習(xí)筆記(一)

    UVMuvm_config_db機(jī)制背后的大功臣

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

    如何用Verdi查看UVM環(huán)境的變量?

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

    UVMuvm_config_db機(jī)制背后的大功臣

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

    行為型設(shè)計(jì)模式UVM的應(yīng)用

    接下來介紹行為型設(shè)計(jì)模式UVM的應(yīng)用。
    的頭像 發(fā)表于 08-09 14:01 ?610次閱讀
    行為型設(shè)計(jì)模式<b class='flag-5'>在</b><b class='flag-5'>UVM</b><b class='flag-5'>中</b>的應(yīng)用

    UVM設(shè)計(jì)的sequence啟動方式有哪幾種?

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