。。

6.3seqr&driver-seqr的仲裁(sequence的仲裁問題)

1.seqr的仲裁

(1) 當有多個sequence同時在一個sequencer上啓動時,所有的sequence都參與仲裁,根據算法決定哪個sequence發送transaction.仲裁算法由sequencer決定.

(2) sequencer在仲裁時,會查看sequence的is_relevant函數的結果.如果為1,則sequence有效,參與仲裁;如果為0,則sequence無效,表示sequence主動放棄sequencer的使用權(可以通過重載is_relevant函數使sequence失效,使sequence主動放棄控制權).

注1:通過lock任務和grab任務,sequence可以獨佔sequencer,強行使sequencer發送自己產生的transaction;

注2:sequence也可以通過控制is_relevant函數實現在一定時間內不參與仲裁,主動放棄sequencer的控制權;

仲裁隊列的鏡像個數_最高優先級

仲裁隊列的鏡像個數_最高優先級_02

(3) 如果sequencer發現其上啓動的所有sequence都無效(即is_relevant的返回值均為0), sequencer就會調用wait_for_relevant函數並等待sequence變有效. wait_for_relevant函數中,必須將使sequence無效的條件清除,不然系統會處於sequencer循環調用wait_for_relevant的死循環狀態.

注1:sequence的失效是自己控制的,但是重新有效卻受其他sequence控制;當其他sequence的transaction發送完畢後,sequencer發現失效sequence無效,會調用其wait_for_relevant;如果其他sequence用於不結束,那麼失效sequence將永遠處於失效狀態;

仲裁隊列的鏡像個數_優先級_03

 

(4) is_relevant與wait_for_relevant函數應成對重載,不能只重載其中一個;在wait_for_relevant中,必須使sequence無效的條件清除,否則系統將處於死循環的狀態;

(5) 通過lock與grab操作, sequence可以獨佔sequencer.

仲裁隊列的鏡像個數_優先級_04

 

仲裁隊列的鏡像個數_仲裁隊列的鏡像個數_05

 

仲裁隊列的鏡像個數_死循環_06

 2.seqr的仲裁所考慮的因素

2.1 transaction的優先級(會受sequencer仲裁算法影響)

(1)對於transaction來説,存在優先級的概念,優先級越高越容易被選中.

(2)當使用uvm_do或uvm_do_with宏時,產生的transaction的優先級是默認的優先級,即-1.

(3)可以通過uvm_do_pri或uvm_do_pri_with改變所產生transaction的優先級(第二個參數是優先級,該值需要是大於-1的整數;數字越大,優先級越高;);

仲裁隊列的鏡像個數_優先級_07

仲裁隊列的鏡像個數_優先級_08

注1:由於sequence1中transaction的優先級較高,所以按照預期,先選擇sequence1產生的transaction; 當sequence1的transaction全部生成完畢後,再產生sequence0的transaction; 但事實並不如預期那樣!!!這是因為sequencer的仲裁算法有很多種,默認情況下,sequencer的仲裁算法是SEQ_ARB_FIFO,它會嚴格遵循先入先出的順序,而不會考慮優先級;

 2.2 sequence的優先級

(1) sequence的優先級可以在啓動時指定.對sequence設置優先級的本質是設置其內產生的transaction的優先級.

(2)seq.start的函數的第一個參數為sequencer,第二個參數是parent sequence,可以設置為null; 第三個參數是優先級;

仲裁隊列的鏡像個數_最高優先級_09

 

注1:運行上圖中代碼,會發現sequence1中transaction完全發送完後,才發送sequence0中的transaction;

2.3 sequencer的仲裁算法(可以通過seqr的set_arbitration選擇一種仲裁算法)

(1) SEQ_ARB_FIFO:嚴格遵循先入先出順序,而不考慮優先級; 

(2) SEQ_ARB_WEIGHTED:加權的仲裁;

(3) SEQ_ARB_RANDOM:完全隨機選擇; 

(4) SEQ_ARB_STRICT_FIFO:嚴格按照優先級,當有多個同一優先級的sequence時,按照先入先出的順序原則;

(5) SEQ_ARB_STRICT_RANDOM:嚴格按照優先級,當有多個同一優先級的sequence時,隨機從最高優先級中選擇;

(6) SEQ_ARB_USER:用户自定義的仲裁算法;這種模式下,必須覆蓋uvm_sequencer的user_priority_arbitartion()方法;該方法的輸入參數是sequencer的sequence_item queue,user實現一個返回值為整數的方法,從sequencer的sequence_item queue中挑選一個sequence_item;

 

仲裁隊列的鏡像個數_最高優先級_10

 

注1:上圖中設置sequencer的仲裁算法為SEQ_ARB_STRICT_FIFO後,會發現直到sequence1發送完transaction後,sequence0才開始發送;

 

仲裁隊列的鏡像個數_優先級_11

 

仲裁隊列的鏡像個數_優先級_12