2015-11-05 77 views
0

我有兩個有關在測試臺中使用非阻塞賦值的問題。在測試平臺中使用非阻塞賦值:Verilog

  1. 我們可以在總是@(posedge clk)w.r.t testbench中使用阻塞賦值嗎?我想我們可以使用,因爲我們不必擔心硬件。但我需要確認。
  2. 我在測試平臺中使用了下面的代碼,但它不能按預期工作。


always @(posedge clk) 
begin

while((state==2'd3) && (x!=OUT_MAX_SIZE_32) && (count_done==4'd4)) begin

$display("a[%d] :%h, %d",l,a[l],x); a[l] <= {b[x][31], b[x][30], b[x][29], b[x][28], b[x][27], b[x][26], b[x][25], b[x][24]}; a[l+1] <= {b[x][23], b[x][22], b[x][21], b[x][20], b[x][19], b[x][18], b[x][17], b[x][16]}; a[l+2] <= {b[x][15], b[x][14], b[x][13], b[x][12], b[x][11], b[x][10], b[x][9], b[x][8]}; a[l+3] <= {b[x][7], b[x][6], b[x][5], b[x][4], b[x][3], b[x][2], b[x][1], b[x][0]} ; x <= x+1; l <= l+4; end end

正在發生的事情是X如果我使用非阻塞賦值不遞增。但是如果我使用阻塞分配,它按預期工作。我需要幫助分析它。

+0

這已經不是主題:如果沒有異步電路涉及您的項目,您可能想在代碼中使用'if'語句而不是'while'語句。 – e19293001

回答

0

非阻塞分配總是可以在測試臺代碼中使用。這變成無限循環通過使用非阻塞賦值

參照的SystemVerilog LRM 1800年至2012年第10.4.2節,

非阻斷程序分配允許分配調度,而不會阻塞程序流。

參照節4.9.4,

非阻塞賦值語句(見10.4.2)總是計算更新值和日程表更新爲NBA更新事件,無論是在當前時間如果延遲爲零,或者如果延遲爲非零,則作爲未來事件。

在此,時鐘的posedge,讓說x = 0時所以它是假設循環被執行。非阻塞任務的RHS在活躍區域進行評估,而實際任務在NBA區域完成。

所以,X增量1 計劃NBA相同時間標記的區域。另外,由於它是一個非阻塞語句,while循環的條件在活動區域​​中再次被檢查而不會阻塞任何東西(再次獲得x = 0)。再次,x預計將在NBA區域中遞增並且該循環永遠持續。因此,您無法增加x。類似的評論適用於l。

雖然使用阻斷賦值,該值是立即分配給表達的LHS,因此X/L增加而增加。

另外,$display執行於活動區域,所以你將無法獲得x的值爲1.下圖應該給你清晰的想法。

Event regions

有關活動區的更多信息,請參閱CummingsSNUG2006Boston_SystemVerilog_Events紙。

+0

令人難以置信的解釋......感謝你:)那麼你認爲我不得不擔心在此使用阻塞任務嗎?我的意思是我需要找到另一種使用** NBA **來實現這個部分的方法嗎? – ssgr

+0

我認爲使用阻塞任務將是一個更好的選擇。在這裏,我只有一些粗略的想法,在NBA聲明之前使用**#1或其他延遲**,但這不是一個好的編碼練習。如果你刪除while循環並且在條件中使用if(x!= OUT_MAX_SIZE_32 && ...)或者其他一些邏輯操作可能會很好。 – sharvil111

1

您可以也應該在測試平臺中使用非阻塞賦值。模擬器不知道你的設計和你的測試臺之間的區別。您需要以防止競爭條件的方式進行編碼。

從你展示的代碼中,我不明白爲什麼它會有所作爲,除非在其他地方有xl其他你沒有顯示的任務。

+0

我已經使用** x **和** l **的唯一其他地方是**初始**塊,我已經將它們初始化爲零。 – ssgr