本文將接著分享sequencer的相關(guān)知識,對于sequencer的仲裁特性有幾種可選,UVM_SEQ_ARB_FIFO ;UVM_SEQ_ARB_WEIGHTED;UVM_SEQ_ARB_RANDOM ;UVM_SEQ_ARB_STRICT_FIFO等。出其中三種需要特別區(qū)分外其它的模式可以滿足絕大多數(shù)的仲裁需求。
sequencer的仲裁特性及應(yīng)用
在之前我們就談到了,uvm_sequencer類自建了仲裁機制用來保證多個sequence同時掛載到sequencer時,可以按照規(guī)則允許特定的sequence中的item優(yōu)先通過。在實際使用中,我們可以通過uvm_sequencer::set_arbitration(UVM_SEQ_ARB_TYPE val)來設(shè)置仲裁模式。這里的仲裁模式UVM_SEQ_ARB_TYPE有下面幾種值可以選擇:
UVM_SEQ_ARB_FIFO :默認(rèn)模式。來自于sequences的發(fā)送請求,按照FIFO先進(jìn)先出的方式被依次授權(quán),和優(yōu)先級沒有關(guān)系。
UVM_SEQ_ARB_WEIGHTED:不同sequence的發(fā)送請求,將按照它們的優(yōu)先級被隨機授權(quán)。
UVM_SEQ_ARB_RANDOM :不同的請求會被隨機授權(quán),而無視它們的抵達(dá)順序和優(yōu)先級。
UVM_SEQ_ARB_STRICT_FIFO:不同的請求,會按照它們的優(yōu)先級以及抵達(dá)順序來依次授權(quán),因此與優(yōu)先級和抵達(dá)時間都有關(guān)。
UVM_SEQ_ARB_STRICT_RANDOM:不同的請求,會按照它們最高的優(yōu)先級被隨機授權(quán),與抵達(dá)時間無關(guān)。
UVM_SEQ_ARB_USER:用戶可以自仲裁機制方法user_priority_arbitration()來裁定哪個sequence的請求優(yōu)先被授權(quán)。
在上面的仲裁模式中,與priority有關(guān)的模式有UVM_SEQ_ARB_WEIGHTED、UVM_SEQ_ARB_STRICT_FIFO和UVM_SEQ_ARB_STRICT_RANDOM。這三種模式的區(qū)別在于,UVM_SEQ_ARB_WEIGHTED的授權(quán)會落到各個優(yōu)先級的請求上面,而UVM_SEQ_ARB_STRICT_RANDOM則只會將授權(quán)隨機安排到最高優(yōu)先級的請求上面,UVM_SEQ_ARB_STRICT_FIFO則不會隨機授權(quán),而是嚴(yán)格按照優(yōu)先級以及抵達(dá)順序來依次授權(quán)。沒有特別要的要求,則用戶不需要再額外自定義授權(quán)算法,因此使用UVM_SEQ_ARB_USER這一模式的情況不多見,其它的模式可以滿足絕大多數(shù)的仲裁需求。
鑒于sequence在傳送的優(yōu)先級可以影響sequencer的仲裁授權(quán),我們有必要結(jié)合sequencer的仲裁模式選擇和sequence發(fā)送的優(yōu)先級參數(shù)設(shè)置給出一段例碼。通過這段例碼,希望讀者可以掌握如何設(shè)置仲裁模式和優(yōu)先級的傳遞。
輸出結(jié)果:
上面的例碼中,seq1、seq2、seq3在同一時刻發(fā)起傳送請求,通過`uvm_do_prio_with的宏,在發(fā)送sequence時可以傳遞優(yōu)先級參數(shù)。由于將seq1與seq2設(shè)置為同樣的高優(yōu)先級,而seq3設(shè)置為較低的優(yōu)先級,這樣在隨后的UVM_SEQ_ARB_STRICT_FIFO仲裁模式下,可以從輸出結(jié)果看到,按照優(yōu)先級高低和傳送請求時間順序,先將seq1和seq2中的item發(fā)送完畢,隨后將seq3發(fā)送完。
除了在上面的sequence遵循仲裁機制,將自身的item發(fā)送完才結(jié)束自身的正常模式以外,在一些特殊情形下,有一些sequence需要有更高的權(quán)限取得sequencer的授權(quán)來訪問driver。 例如需要響應(yīng)中斷的情形下,用于處理中斷的sequence應(yīng)該有更高的權(quán)限來獲得sequencer的授權(quán)。為此,uvm_sequencer提供了兩種鎖定機制,分別可以通過lock()和grab()方法實現(xiàn)。這兩種方法的區(qū)別在于:
lock()與unlock()這一對方法可以為sequence提供排外的訪問權(quán)限,但前提條件是,該sequence首先需要按照sequencer的仲裁機制獲得授權(quán)。而一旦sequence獲得授權(quán),則無需擔(dān)心權(quán)限被收回,只有該sequence主動unlock它的sequencer主動解鎖,才可以釋放這一鎖定的權(quán)限。lock()是一種阻塞的任務(wù),只有獲得了權(quán)限,它才會返回。
grab()與ungrab()也可以為sequence提供排外的訪問權(quán)限,而且它只需要在sequencer下一次授權(quán)周期時就可以無條件地獲得授權(quán)。與lock方法相比,grab方法無視同一時刻內(nèi)發(fā)起傳送請求的其它sequence,而唯一可以阻止它的只有已經(jīng)預(yù)先獲得授權(quán)的其它lock或者grab的sequence。
這里需要注意的是,由于“解鈴還須系鈴人”,如果sequence使用了lock()或者grab()方法,必須在sequence結(jié)束前調(diào)用unlock()或者ungrab()方法來釋放權(quán)限,否則sequencer會進(jìn)入死鎖狀態(tài)而無法繼續(xù)為其余sequence授權(quán)。下面的給出一段例碼,用來展示如何使用上述的方法實現(xiàn)鎖定的sequence傳送方式。
輸出結(jié)果:
結(jié)合例碼和輸出結(jié)果,我們從中可以發(fā)現(xiàn)如下幾點:
對于locks,在10ns時,它跟其它幾個sequence一同向sequencer發(fā)起請求,按照仲裁模式,sequencer先后授權(quán)給seq1、seq2、seq3,最后才授權(quán)的locks。而locks在獲得授權(quán)之后,就可以一直享有權(quán)限,而無需擔(dān)心權(quán)限被sequencer收回。直到在locks結(jié)束前,用戶需要通過unlock()方法返還權(quán)限。
對于grabs,盡管他在20ns時就發(fā)起了請求權(quán)限(實際上seq1、seq2、seq3也在同一時刻發(fā)起了權(quán)限請求),而由于權(quán)限已經(jīng)被locks占用,所以它也無權(quán)收回權(quán)限。因此只有當(dāng)locks在40ns結(jié)束時,grabs才可以在sequencer沒有被鎖定權(quán)限的狀態(tài)下獲得權(quán)限,而grabs獲得權(quán)限是無視同一時刻發(fā)起請求的其它sequence的。同樣地,在grabs結(jié)束前,也應(yīng)當(dāng)通過ungrab()方法釋放權(quán)限,防止sequencer的死鎖行為。
至此,我們就將sequence/item發(fā)送的方法和宏,以及sequence與sequencer之間的仲裁和授權(quán)請求方式為讀者介紹完畢。
-
Sequencer
+關(guān)注
關(guān)注
0文章
8瀏覽量
8188
發(fā)布評論請先 登錄
相關(guān)推薦
評論