2014-04-09 25 views
2

我有一個分析端口連接到3個記分板。當在分析端口上完成寫入時,用戶(記分板)以特定順序被調用。但我希望他們以不同的順序被調用。如何控制UVM分析端口訂戶的順序?

顯式排序的實際用例如下。一個記分牌只會記錄,所以應該先調用它。另一個記分牌進行非常基本的低級別檢查,所以它應該被稱爲第二。第三個記分牌執行非常複雜的更高級別的檢查,因此應該最後調用它。

SV片段:

sb1 = scoreboard_1::type_id::create("sb1", null); 
sb2 = scoreboard_2::type_id::create("sb2", null); 
sb3 = scoreboard_3::type_id::create("sb3", null); 

// Connect analysis port to scoreboard 
m_ap = new("ap", null); 
m_ap.connect(sb2.m_imp); 
m_ap.connect(sb3.m_imp); 
m_ap.connect(sb1.m_imp); 
m_ap.resolve_bindings(); 

// Write 
m_ap.write(10); 

電流輸出:

# UVM_INFO design.sv(15) @ 0: sb1 [write] scoreboard_1 
# UVM_INFO design.sv(32) @ 0: sb2 [write] scoreboard_2 
# UVM_INFO design.sv(49) @ 0: sb3 [write] scoreboard_3 

如何控制命令的用戶被稱爲嗎?我想他們是按以下順序:

  • scoreboard_3
  • scoreboard_2
  • scoreboard_1

示例代碼在EDA遊樂場:http://www.edaplayground.com/x/2zQ

回答

3

的分析端口提供商內結束當您撥打connect()時,您會看到一個字符串關聯數組。當它做一個foreach(見resolve_bindings()),你會得到的項目按字典順序。這僅適用於目前實施的UVM;未來的實現可能會決定使用對象的關聯數組,對此沒有定義的順序。

分析端口背後的主要思想是它們不需要連接。這意味着每個用戶應該完全獨立於連接到該端口的任何其他用戶,因此您不能依賴任何訂購。

如果您想確保您的寫入按特定順序執行,您應該通過您的測試平臺結構強制執行它:要麼有一個頂級記分板連接到您的AP,以特定順序或鏈將記分板放在一起,以便記分板1完成記錄,然後寫入記分板2,然後寫入記分板3。

+0

擁有頂級記分牌委託人看起來像一團糟。在這種情況下,創建我自己的uvm_analysis_port可以使訂戶保持註冊訂單狀態,這可能會更清潔。 –

1

在主要模擬器(ModelSim/Questa,INCISIV和VCS)中,字符串關聯數組uvm_port_base.svh的順序是按字母順序排列的。這意味着分析端口寫入的順序對應於用戶名的字母順序。

爲了讓用戶在請求順序寫入,修改名稱類似:

sb1 = scoreboard_1::type_id::create("-sb1", null); 
sb2 = scoreboard_2::type_id::create("--sb2", null); 
sb3 = scoreboard_3::type_id::create("---sb3", null); 

,你會看到輸出變化:在EDA遊樂場

# UVM_INFO design.sv(49) @ 0: ---sb3 [write] scoreboard_3 
# UVM_INFO design.sv(32) @ 0: --sb2 [write] scoreboard_2 
# UVM_INFO design.sv(15) @ 0: -sb1 [write] scoreboard_1 

修復: http://www.edaplayground.com/x/3bf

+0

您依賴於連接存儲在字符串索引的關聯數組中的事實。爲此,標準規定項目索引的順序是詞典。如果在將來的版本中UVM的實現發生變化,並且他們決定使用類的關聯數組,那麼您將無法再依賴這個順序。 –

0

訂戶被調用的順序是「未定義」;即如果您在模擬器之間移動,訂單可能會發生變化。因此,您必須設計您的代碼才能在不依賴訂單的情況下工作。

如果訂單很重要,請在代碼中明確表示(即將您的行爲合併到一個更大的記分牌,然後按順序委託)。不要依賴無證行爲。

+1

訂單當前不是'未定義',它是訂戶的全名(由'get_full_name()'返回)的字典順序。 –

+0

實際上是在文檔的某處,因爲我找不到它? –

+0

這不在文檔中,但我查看了代碼,分析接口的實現存儲在關聯數組中,並由'get_full_name()'索引。 LRM聲明按字符串索引的關聯數組按字典順序迭代。所有這些無論如何都是一個可能會改變的UVM實現細節,所以對於所有的意圖和目的,我都會假設這個訂單是'未定義的'。 –