2014-11-14 87 views
4

我對SystemVerilog中的競態條件有疑問,特別是在UVM中。在標準情況下,我們所擁有的是多個驅動程序,它們在同一時鐘前驅動我們的小玩意兒,在記分牌中產生一些函數調用。這些調用是同時進行的,他們檢查/修改黃金參考模型中的某些共享變量是現實的。如果這些操作是在非阻塞賦值的情況下完成的,那就沒有問題,但是阻塞賦值可能會存在競爭條件。哪個是解決這個問題的最好方法?要不在課堂上實現黃金參考模型? 預先感謝UVM阻塞分配競爭條件

記分牌的僞代碼的一個例子可以是:

function void write_A(input TrA A); 
    if(GRF.b >= 100 && A.a==1) 
     GRF.c = 1; 
endfunction 

function void write_B(input TrB B); 
    GRF.b+=B.b; 
endfunction 

當然的結果取決於這兩個函數執行的順序,這是未知的。人們可以用一些同步機制來解決,但是很多寫並行函數會使事情變得更加困難。使用非阻塞賦值會使情況變得更加清晰和簡單......也許解決方案可能是讓GRF的所有成員都是靜態的?

+0

這就是爲什麼你通常實現一些同步機制來處理並行性。 – 2014-11-15 00:43:10

+0

如果我沒有記錯,應該使用uvm_analysis功能自動處理計劃和同步記分板。 – Greg 2014-11-15 19:03:22

回答

3

這裏的問題在於,您試圖使用行爲代碼來模擬RTL行爲。您在多個線程中使用多個函數,並以隨機順序在同一時鐘邊緣全部調用它們。除了在您的操作中強制執行命令之外,沒有解決這個問題的辦法。

最簡單的方法是將記分牌中的所有@(posedge clk)線程合併到一個線程中。這會迫使你每次都以相同的順序調用函數。

所以不是

@(posedge clk) 
    write_A(A); 

@(posedge clk) 
    write_B(B); 

你有

@(posedge clk) begin 
    write_A(A); 
    write_B(B); 
end 

後者的代碼將每次運行方式相同。

+0

是的,這正是我採用的解決方案,謝謝! – Alessandro 2014-12-23 21:05:30

1

只是因爲表達式或分配嘗試同時訪問相同的信號而創建競爭條件。

如果兩個信號嘗試在不同的時間標記上訪問相同的信號,則用戶可以刪除競爭條件。

實際上代碼是用verilog編寫的,或者系統verilog是在不同的時間區域執行的,如活動區域,反應區域。

比賽條件可以刪除使用以下的東西。

(1)程序塊

(2)時鐘控制塊

(3)非阻斷分配新建分配FY

程序塊之前和使用非阻擋分配除去計時塊競爭狀態。

正如我上面解釋過的,用verilog代碼或系統verilog代碼編寫的聲明不是單次執行代碼。工具執行特定語法的區域有所不同。

這裏我主要講了有源區和反應區。活動區考慮連續分配,阻止分配。無效區域考慮在該區域評估非阻塞分配的LHS。

評估第一個活動區域,然後評估反應區域。

所以在程序塊刪除競爭條件驗證工程師照顧這些事情(執行區域)。

現在在系統verilog中還有很多其他的區域被添加爲像prepone區域,觀察區域,延期區域。