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

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

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

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

rfdqdzdg ? 來源:IC Verification Club ? 2023-08-17 10:07 ? 次閱讀

本篇介紹UVM中的sequence,這是UVM中最基礎(chǔ)的部分。對于前面介紹的uvm_callback, uvm_visitor等,很少被使用到或者也只有搭建平臺的人會(huì)使用。不能認(rèn)為平臺的搭建更富有“技術(shù)含量”,用例的構(gòu)建有時(shí)候更重要。UVM提供了多種方式,常常讓使用者混淆,本篇將會(huì) “捋” 一下sequence_item,sequence,sequencer,driver的協(xié)作關(guān)系,結(jié)合設(shè)計(jì)模式中的命令模式,中介模式,橋接模式進(jìn)行介紹。

啟動(dòng)與掛載

基本理解:UVM中各個(gè)組件的相互“交流”是基于實(shí)際業(yè)務(wù)提取出的transaction(uvm_sequence_item);uvm_sequence中的body()函數(shù)負(fù)責(zé)產(chǎn)生發(fā)送這些transaction,生命周期是body()函數(shù)的執(zhí)行期;uvm_sequencer負(fù)責(zé)調(diào)度從uvm_sequence中拿到的transaction,然后發(fā)送給driver;uvm_sequcence和transaction一樣,也是繼承于uvm_sequence_item,uvm_sequcne是transaction的有機(jī)結(jié)合,代表一種具體的業(yè)務(wù)行為,描述一種scenario 這樣更有利于在創(chuàng)建用例時(shí)的復(fù)用。同時(shí)在transaction,uvm_sequence中加入SV特有的語法特點(diǎn),constrain約束,方便擴(kuò)展使用到不同的場景。

啟動(dòng):這里的啟動(dòng)就是通過哪種方式調(diào)用uvm_sequence中的body()函數(shù)的意思。(body()函數(shù)被sequence的 start()函數(shù)調(diào)用,也可以理解成 start()函數(shù)的執(zhí)行)

sequence的掛載:uvm_sequence不屬于component,沒有phase概念,需要掛載在一個(gè)sequencer上,在這個(gè)sequencer的phase中被調(diào)用(default_sequence的情形),同時(shí)uvm_sequence可以操作所掛載的sequencer的成員變量( *比如在sequence中使用sequencer中的寄存器模型句柄;在virtual sequence中調(diào)用 virtual sequcner中的其他 sequcner 句柄 * )。

transaction的掛載:對于transaction,掛載的意思就是將transaction發(fā)送給所掛載的sequencer,sequencer再發(fā)送給連接的driver。(無論sequence還是transaction,掛載的本質(zhì)就是給uvm_sequence_item中的成員變量 m_sequencer賦值,sequence/transaction都繼承于uvm_sequence_item)

( *啟動(dòng),掛載在UVM英文文檔中沒有對應(yīng)關(guān)鍵詞,僅是根據(jù)實(shí)際使用總結(jié)出來的詞匯 * )

繼承關(guān)系:

wKgaomTdgZCAGq9kAAAnwfSCLs4862.jpg

三種sequence的啟動(dòng)方式:

1. start()函數(shù)顯示調(diào)用

使用形式:

wKgZomTdgZCALtvNAAC1v_RKRA8496.jpg

在sequence中顯示調(diào)用strat()函數(shù),第一個(gè)參數(shù)是需要掛載的sequencer;第二個(gè)是parent_sequence,一般傳入this或者不傳入;第三個(gè)是優(yōu)先級;第四個(gè)call_pre_post默認(rèn)為1,則自動(dòng)執(zhí)行pre_body/ post_body()函數(shù)

執(zhí)行pre_start,body等函數(shù)。此時(shí)就完成了sequence的啟動(dòng)過程。

在start()函數(shù)中,首先調(diào)用了函數(shù)set_item_context()函數(shù),這個(gè)函數(shù)位于sequence的父類uvm_sequence_item中,負(fù)責(zé)給成員變量m_sequencer, m_parent_sequence賦值。

如果沒有指定掛載的sequencer,則掛載到parent_sequence的sequencer上。

此處seq0顯示傳入了需要掛載的p_sqr0,則調(diào)用set_sequencer()函數(shù)完成掛載,給m_sequencer賦值。

set_sequencer()函數(shù)會(huì)調(diào)用m_set_p_sequencer(),這個(gè)函數(shù)是一個(gè)空的虛函數(shù)。如果在sequence中調(diào)用了宏uvm_declare_p_sequencer則會(huì)重寫這個(gè)函數(shù),將成員變量p_sequencer指向sequence所掛載的sequencer上。所以使用者要保證start()函數(shù)傳入的sequencer應(yīng)該和宏 uvm_declare_p_sequencer聲明的類型一致。否則$cast轉(zhuǎn)換的時(shí)候會(huì)報(bào)錯(cuò)。

使用uvm_declare_p_sequencer后,就可以在sequence中調(diào)用掛載sequencer的成員函數(shù)和成員變量了。

wKgaomTdgZCAb_9EAATG8ufD8Zc397.jpg

2. `uvm_do()宏

**使用形式: **

wKgaomTdgZCATC10AABPfsyZa64535.jpg

UVM中提供了多個(gè)宏,uvm_do,uvm_do_with,`uvm_do_on_with等,但最終都是調(diào)用了uvm_do_on_pri_with宏。uvm_do_on_pri_with宏第一個(gè)參數(shù)可以傳入sequence,也可以傳入transaction。

uvm_do_on宏第一參數(shù)是sequence。uvm_do_on_pri_with宏中調(diào)用宏uvm_create_on。

create_item通過工廠模式創(chuàng)建sequence實(shí)例

調(diào)用set_item_context()函數(shù),給成員變量m_sequencer, m_parent_sequence賦值,參考上節(jié)分析。此處parent_sequence默認(rèn)是this。

調(diào)用sequence的start函數(shù),流程和上節(jié)一樣,最后調(diào)用body()函數(shù)。

通過宏的形式相比于直接調(diào)用start函數(shù),節(jié)省了sequence的實(shí)例化和隨機(jī)化的步驟,但是對于不熟悉宏的人來說,宏封裝的內(nèi)容可能與其使用意圖偏差。

wKgaomTdgZCABkKGAAPMSNnEIDE492.jpg

3. default_sequence方式

使用形式:

第一種:

wKgZomTdgZCAXT0BAABL9pUPoLc970.jpg

第二種:

wKgZomTdgZCASW25AABVVl9CIog497.jpg

使用default_sequence的方式也是通過工廠模式創(chuàng)建sequence,再隱式的調(diào)用seq.start(this) 函數(shù)

【拓展】

對于sequence中的資源訪問,可以參考 UVM設(shè)計(jì)模式 (三) 靜態(tài)類、資源管理、uvm_event、uvm_*_pool、uvm_config_db、UVM_REGEX_NO_DPI 中的"sequence中的資源訪問"小節(jié),總結(jié)了5種使用方式。

命令模式

Comand Pattern:將一個(gè)請求(命令)封裝成一個(gè)對象,從而可以用不同的請求對接收者進(jìn)行參數(shù)化,實(shí)現(xiàn)請求的發(fā)送者和接收者解耦;還可以對請求排隊(duì),或者記錄請求日志,以及支持撤銷操作。

命令模式和前面提到的策略模式很相似,也是通過“組合 + 多態(tài)”實(shí)現(xiàn)的。設(shè)計(jì)模式更關(guān)注于設(shè)計(jì)意圖,也就是應(yīng)用場景,單純地從代碼實(shí)現(xiàn)上看,有些模式確實(shí)很相似,比如命令模式和策略模式。但策略模式是不同策略具有相同的目的,不同的實(shí)現(xiàn),相互之間可以替換,在命令模式中,是不同的命令具有不同的目的,對應(yīng)不同的邏輯處理,相互之間不可替換。

一個(gè)簡單的示例:captain是命令的發(fā)起者,soldier是命令的接收者。

wKgZomTdgZCAIhpOAAZNAwweQSg612.jpg

start_item finish_item

上節(jié)提到使用uvm_do宏啟動(dòng)sequence,如果宏傳入的第一個(gè)參數(shù)不是uvm_sequence_base類型,就是我們的transaction, 則調(diào)用start_item, finish_item函數(shù)。

wKgaomTdgZCAK2krAAFhjzpkuJ4296.jpg

start_item()三個(gè)參數(shù),第一個(gè)是傳入的transaction, 第二個(gè)是優(yōu)先級,第三個(gè)是指定該transaction發(fā)送給哪一個(gè)sequencer, transaction掛載在哪一個(gè)sequencer上。

如果之前沒有給transaction的m_sequencer賦值,此處sequcner仍未null

調(diào)用get_sequencer()函數(shù),將transaction掛載到sequence啟動(dòng)的sequencer上。

transaction必須指定掛載的sequencer, 否者transaction無法通過sequencer發(fā)送給driver。而sequence卻不一定需要掛載到sequencer上,因?yàn)閟equence的主要目的是執(zhí)行body函數(shù),直接在tc中調(diào)用seq.start()不指定sequencer,也可以。但是default_sequence的形式必須掛載到sequencer上。

set_item_context()函數(shù)上節(jié)已提到。wait_for_grant()等待sequencer仲裁。pre_do() hook函數(shù)。

在finish_item中,調(diào)用transaction掛載sequencer的函數(shù)send_request(), 這個(gè)函數(shù)定義在uvm_sequencer_param_base中。將transaction放入m_req_fifo容器中。

當(dāng)driver中調(diào)用**seq_item_port.get_next_item(req)**時(shí),實(shí)際調(diào)用的是uvm_sequencer中的get_next_item函數(shù)。從m_req_fifo容器中拿到之前sequence放入的transaction。

driver中的seq_item_port.item_done(),實(shí)際調(diào)用的是uvm_sequencer中的item_done函數(shù)。sequence通過wait_for_item_done和sequencer的item_done握手,通過成員變量m_wait_for_item_sequence/transaction_id判斷。每個(gè)sequence, sequence中的每個(gè)transaction其ID都是唯一的。

如果item_done()傳入rsp,調(diào)用put_response函數(shù),與sequence中的get_response配合使用。

wKgZomTdgZCANzbiAAS_fVSQ-Vo438.jpg

wKgZomTdgZCAW3kBAAA2FD9IgxQ510.jpg

start_item/finish_item封裝函數(shù)以及sequence,sequencer,driver的握手關(guān)系如下圖:

wKgaomTdgZCAGlH2AAHYqg3Xs38561.jpg

結(jié)合命令模式,sequence作為命令的發(fā)起者,sequencer作為接收者。sequence負(fù)責(zé)發(fā)送各種transaction, 至于是哪一個(gè)sequencer接收,由transaction中的成員變量m_sequencer決定。

實(shí)現(xiàn)發(fā)送者與接收者的解耦。設(shè)計(jì)模式側(cè)重應(yīng)用場景,transaction僅僅是事務(wù),不具備命令的實(shí)現(xiàn)行為,所以UVM的實(shí)現(xiàn)并不完全符合命令模式。

UVM中的sequencer更像一個(gè)仲裁者,一邊是driver不斷請求transaction,一邊根據(jù)priority給sequcence授權(quán),接收sequence發(fā)送的transaction,支持lock,grab操作。同時(shí)driver,sequence之間也有聯(lián)系,driver可以response transaction給sequence。

在實(shí)際使用中,建議不要使用宏,而是通過start()函數(shù)顯示啟動(dòng)sequence, 通過start_item finish_item發(fā)送transaction。

中介者模式

Mediator Pattern:定義一個(gè)單獨(dú)的(中介)對象,來封裝一組對象之間的交互。將這組對象之間的交互委派給與中介對象操作,來避免對象之間的直接交互,使耦合松散。

如果不使用中介者模式,各個(gè)系統(tǒng)模塊,或者說各個(gè)類之間,互相依賴,就會(huì)形成一個(gè)復(fù)雜的網(wǎng)裝結(jié)構(gòu);使用了中介者模式,系統(tǒng)就變成了結(jié)構(gòu)清晰的星形結(jié)構(gòu)。

wKgaomTdgZCAN45XAABq1QwviUo122.jpg

UVM中virtual sequence就是一個(gè)典型的中介者模式的使用案列。在virtual sequence中可以統(tǒng)一調(diào)度各個(gè)sequence,負(fù)責(zé)每個(gè)sequence的同步,成員變量賦值,隨機(jī)約束等。中介者模式實(shí)現(xiàn)簡單,具體示例不在演示。






審核編輯:劉清

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

    關(guān)注

    27

    文章

    8705

    瀏覽量

    147195
  • 寄存器
    +關(guān)注

    關(guān)注

    31

    文章

    5343

    瀏覽量

    120385
  • 耦合器
    +關(guān)注

    關(guān)注

    8

    文章

    725

    瀏覽量

    59716
  • UVM
    UVM
    +關(guān)注

    關(guān)注

    0

    文章

    182

    瀏覽量

    19171
  • sequence
    +關(guān)注

    關(guān)注

    0

    文章

    23

    瀏覽量

    2848

原文標(biāo)題:UVM設(shè)計(jì)模式 (七)命令模式、三種sequence啟動(dòng)方式、start_item/finish_item、中介模式

文章出處:【微信號:數(shù)字芯片設(shè)計(jì)工程師,微信公眾號:數(shù)字芯片設(shè)計(jì)工程師】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。

收藏 人收藏

    評論

    相關(guān)推薦

    STM32F407可以哪幾種方式進(jìn)行啟動(dòng)

    STM32F407的啟動(dòng)模式是什么?STM32F407可以哪幾種方式進(jìn)行啟動(dòng)?
    發(fā)表于 10-21 08:02

    STM32哪幾種啟動(dòng)模式

    STM32哪幾種啟動(dòng)模式?STM32燒錄程序的方式是什么?
    發(fā)表于 10-25 06:40

    SYSCLK的BOOT引腳哪幾種不同的啟動(dòng)模式

    SYSCLK的BOOT引腳哪幾種不同的啟動(dòng)模式?
    發(fā)表于 10-29 07:20

    實(shí)現(xiàn)手機(jī)快充哪幾種方式

    充電器實(shí)現(xiàn)快充的原理是什么?實(shí)現(xiàn)手機(jī)快充哪幾種方式?
    發(fā)表于 11-03 07:06

    SPI協(xié)議的工作方式哪幾種

    SPI是什么?SPI協(xié)議的工作方式哪幾種?
    發(fā)表于 11-04 08:01

    I.MX6U啟動(dòng)方式哪幾種?如何去選擇

    I.MX6U啟動(dòng)方式哪幾種?如何去選擇?如何利用匯編語言來初始化一下C語言環(huán)境
    發(fā)表于 11-30 07:11

    TokenServer哪幾種開發(fā)方式

    TokenServer哪幾種開發(fā)方式?TokenClient和TokenServer端開發(fā)的流程哪些
    發(fā)表于 12-27 06:12

    System復(fù)位哪幾種方式

    System復(fù)位哪幾種方式?系統(tǒng)時(shí)鐘的結(jié)構(gòu)是怎樣構(gòu)成的?求解答
    發(fā)表于 01-14 06:13

    芯片的啟動(dòng)方式哪幾種

    芯片的啟動(dòng)方式哪幾種?如何去實(shí)現(xiàn)?
    發(fā)表于 01-18 06:16

    HTTP協(xié)議哪幾種加密方式

    HTTP協(xié)議哪幾種加密方式?其加密方式何優(yōu)缺點(diǎn)
    發(fā)表于 01-20 06:13

    什么是流控?流控的方式哪幾種

    什么是流控?流控的方式哪幾種?流控的串口是怎樣去定義的?
    發(fā)表于 01-26 08:16

    SDK配網(wǎng)的方式哪幾種

    SDK配網(wǎng)的方式哪幾種?微信配網(wǎng)與app配網(wǎng)的原理是什么?
    發(fā)表于 02-22 08:25

    UVM sequence分層哪幾種方式

    驗(yàn)證環(huán)境需要對數(shù)據(jù)進(jìn)行分層。例如,將32比特的寄存器讀寫封裝成數(shù)據(jù)讀寫和狀態(tài)讀寫等實(shí)際業(yè)務(wù)操作等或者對底層sequence進(jìn)行一些隨機(jī)控制等。實(shí)現(xiàn)這種分層可以兩種方式:1、Sequence
    發(fā)表于 04-11 16:37

    軸承跑內(nèi)圓哪幾種修復(fù)方式

    軸承跑內(nèi)圓哪幾種修復(fù)方式
    發(fā)表于 01-23 11:07 ?7次下載

    電容器的補(bǔ)償方式哪幾種?

    電容器在電子領(lǐng)域中使用十分普遍,而在它的使用過程,為了保證電路可靠性和性能穩(wěn)定,電容器的補(bǔ)償就變得尤為重要。那么,電容器的補(bǔ)償方式哪幾種
    的頭像 發(fā)表于 11-16 15:12 ?3988次閱讀