Transactions
在UVM中,transaction是一個(gè)類(lèi)對(duì)象,它包含了建模兩個(gè)驗(yàn)證組件之間的通信所需的任何信息。一個(gè)用來(lái)傳輸信息的簡(jiǎn)單總線協(xié)議transaction建模示例如下:
class simple_trans extends uvm_sequence_item; rand data_t data; rand addr_t addr; rand enum {WRITE,READ} kind; constraint c1 { addr < 16’h2000; } ... endclass
transaction對(duì)象包含變量、約束以及生成和操作事務(wù)所需的其他字段和方法。封裝在transaction中的信息表明了建模的抽象級(jí)別。上面的simple_trans可以被擴(kuò)展為包含更多的信息(例如要注入的等待狀態(tài)的數(shù)量、傳輸?shù)拇笮』蚱渌麑傩裕?,還可以對(duì)此transaction擴(kuò)展以增加更多定向約束。
Transaction-Level 通信
Transaction-level接口定義了一組使用transaction作為參數(shù)的方法。TLM port定義了一組方法,與之相連的TLMexport提供了這些方法的實(shí)現(xiàn)(implementation)。
基本TLM通信
最基本的transaction-level操作就是一個(gè)組件將一個(gè)transactionput給另一個(gè)組件上。
producer 上的方框表示一個(gè)port,consumer上的圓圈表示export。
producer生成transactions并將其發(fā)送出去:
class producer extends uvm_component; uvm_blocking_put_port #(simple_trans) put_port; // 1 parameter function new( string name, uvm_component parent); put_port = new(“put_port”, this); ... endfunction virtual task run(); simple_trans t; for(int i = 0; i < N; i++) begin // Generate t. put_port.put(t); end endtask
uvm_*_port參數(shù)化為將要通信的transaction類(lèi)型。put()調(diào)用的實(shí)際實(shí)現(xiàn)由consumer提供。
class consumer extends uvm_component; uvm_blocking_put_imp #(simple_trans, consumer) put_export; // 2 parameters ... task put(simple_trans t); case(t.kind) READ: // Do read. WRITE: // Do write. endcase endtask endclass
uvm_*_imp接受兩個(gè)參數(shù):transaction的類(lèi)型和聲明方法實(shí)現(xiàn)的對(duì)象類(lèi)型。producer中的put()調(diào)用將阻塞,直到consumer的put實(shí)現(xiàn)完成。除此之外,producer的操作完全獨(dú)立于put的實(shí)現(xiàn)(uvm_put_imp)。事實(shí)上,consumer可以被另一個(gè)也實(shí)現(xiàn)了put方法的組件所取代,producer可以繼續(xù)以完全相同的方式工作。
所以說(shuō),TLM促進(jìn)了驗(yàn)證環(huán)境開(kāi)發(fā)的模塊化,因?yàn)橐粋€(gè)清晰的接口定義,所以組件很容易復(fù)用。
相反的操作是get。
在這種情況下,consumer通過(guò)其get端口向producer請(qǐng)求transactions:
class get_consumer extends uvm_component; uvm_blocking_get_port #(simple_trans) get_port; function new( string name, uvm_component parent); get_port = new(“get_port”, this); ... endfunction virtual task run(); simple_trans t; for(int i = 0; i < N; i++) begin // Generate t. get_port.get(t); end endtask
get()實(shí)現(xiàn)由producer提供。
class get_producer extends uvm_component; uvm_blocking_get_imp #(simple_trans, get_producer) get_export; ... task get(output simple_trans t); simple_trans tmp = new(); // Assign values to tmp. t = tmp; endtask endclass
與上面put()一樣,get_consumer的get()將阻塞,直到get_producer的方法完成。在TLM術(shù)語(yǔ)中,put()和get()是阻塞方法(blocking)。
在這兩個(gè)示例中,都有一個(gè)進(jìn)程在運(yùn)行,控制流都是從port傳遞到export,而數(shù)據(jù)流都是從producer到consumer。
進(jìn)程間通信
在上?的put ?例中,consumer只有在其 put() ?法被調(diào)?時(shí)才會(huì)處于活動(dòng)狀態(tài)。在許多情況下,組件可能需要獨(dú)?運(yùn)?,其中producer在?個(gè)進(jìn)程中創(chuàng)建transactions,?consumer需要在另?個(gè)進(jìn)程中對(duì)這些transactions進(jìn)?操作。
UVM 提供了 uvm_tlm_fifo來(lái)促進(jìn)這種進(jìn)程間通信。uvm_tlm_fifo實(shí)現(xiàn)了所有的TLM接??法,因此producer將transaction放?uvm_tlm_fifo,?consumer則獨(dú)?從fifo中獲取transaction,如下圖所?。
當(dāng)producer向fifo中put一個(gè)transaction時(shí),如果fifo已滿則阻塞,否則成功將transaction放入fifo并立即返回。如果fifo中存在transaction,get操作將立即返回這個(gè)transaction,并且從fifo中刪除這個(gè)transaction,否則它將阻塞直到能夠獲取一個(gè)transaction。
因此,兩次連續(xù)的get()將向consumer產(chǎn)生不同的transaction。而 peek()方法返回transaction的副本而不刪除它,所以兩次連續(xù)的peek()將返回同一transaction的副本。
阻塞(Blocking)和非阻塞(Nonblocking)
到目前為止我們看到的接口都是阻塞的(blocking),阻塞任務(wù)不允許失敗,阻塞執(zhí)行直到它們完成。阻塞期間,仿真時(shí)間會(huì)繼續(xù)向后走。相反,非阻塞任務(wù)調(diào)用會(huì)立即(同一個(gè)delta cycle,不消耗仿真時(shí)間)返回。所以,在 UVM 中,非阻塞任務(wù)調(diào)用就是一個(gè)functions。
class consumer extends uvm_component; uvm_get_port #(simple_trans) get_port; task run; ... for(int i=0; i<10; i++) if(get_port.try_get(t)) //Do something with t. ... endtask endclass
如果存在transaction,它將在參數(shù)中返回,函數(shù)調(diào)?本?將返回TRUE。如果不存在transaction,函數(shù)將返回FALSE。類(lèi)似地,還有try_peek()和try_put()?法 。
連接Transaction-Level組件
在為transaction-level組件定義了ports和exports之后,它們之間的連接是通過(guò)上一級(jí)驗(yàn)證組件中的connect()方法完成的。在驗(yàn)證環(huán)境中,ports和exports之間的 connect() 調(diào)用建立peer-to-peer連接或者層次化的連接,最終連接都終止于put()或者get()方法的實(shí)現(xiàn)。當(dāng)組件調(diào)用
put_port.put(t);意味著它實(shí)際上調(diào)用
target.put_export.put(t);其中target是port連接到的組件。
Port/Export 兼容性
UVM中TLM 通信的另一個(gè)優(yōu)點(diǎn)是在運(yùn)行用例前檢查所有TLM 連接的兼容性。為了使連接有效,export必須提供對(duì)應(yīng)的方法并且數(shù)據(jù)參數(shù)類(lèi)型相同。
blocking_put_port可以連接到 blocking_put_export 或 put_export,blocking_put_export需要實(shí)現(xiàn)put()方法的實(shí)現(xiàn),put_export 還提供 try_put() 和 can_put()的實(shí)現(xiàn)。
???
審核編輯:劉清
-
UVM
+關(guān)注
關(guān)注
0文章
182瀏覽量
19234 -
TLM
+關(guān)注
關(guān)注
1文章
32瀏覽量
24785 -
FIFO存儲(chǔ)
+關(guān)注
關(guān)注
0文章
103瀏覽量
6039
原文標(biāo)題:UVM TLM 的基本概念
文章出處:【微信號(hào):芯片驗(yàn)證工程師,微信公眾號(hào):芯片驗(yàn)證工程師】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
EMI的基本概念
天線分集技術(shù)的基本概念介紹
RAM技術(shù)的基本概念
USB基本概念及從機(jī)編程方法介紹
Uart協(xié)議(即串口)的基本概念及相關(guān)知識(shí)介紹
基于RF射頻知識(shí)基本概念及DTD無(wú)線產(chǎn)品介紹
![基于RF射頻知識(shí)<b class='flag-5'>基本概念</b>及DTD無(wú)線產(chǎn)品<b class='flag-5'>介紹</b>](https://file.elecfans.com/web2/M00/4A/20/pYYBAGKhvJ2ADlfNAAAvMHUXz7k003.png)
典型的UVM Testbench架構(gòu)
![典型的<b class='flag-5'>UVM</b> Testbench架構(gòu)](https://file1.elecfans.com/web2/M00/88/7F/wKgaomRq0gaAMHrGAAA5QCvxGv8490.png)
時(shí)序分析Slew/Transition基本概念介紹
![時(shí)序分析Slew/Transition<b class='flag-5'>基本概念</b><b class='flag-5'>介紹</b>](https://file1.elecfans.com/web2/M00/8C/0D/wKgZomSlErmAdyyDAAAzL4WnVkA281.jpg)
時(shí)序分析基本概念介紹—Timing Arc
![時(shí)序分析<b class='flag-5'>基本概念</b><b class='flag-5'>介紹</b>—Timing Arc](https://file1.elecfans.com/web2/M00/8C/22/wKgZomSmZleAb_vjAABZIlqQ-WE742.jpg)
評(píng)論