2017-02-14 80 views
0

強制翻轉信號的位使用此方法有效嗎?System Verilog - 強制信號翻轉/翻轉

1.

task 
begin 
force higher_level.lower_level.a[1] = ~higher_level.lower_level.a[1]; 
end 

我和混合的結果充其量嘗試這個​​。有時候這個位會翻轉,但有時它仍然是一樣的。

不過,我也寫一個不太優雅的代碼與翻轉位,它的工作原理所有的時間相同的目的,如下所示:

2.

task 
begin 
if(higher_level.lower_level.a[1] == 1'b1) 
force higher_level.lower_level.a[1] = 1'b0; 
else 
force higher_level.lower_level.a[1] = 1'b1; 
end 

的是第一個代碼不是翻轉位的好方法?還是有什麼我錯過了?

higher_level.lower_level.a[51:0]是一個52位信號

感謝:d

回答

0

不,第一種方法是行不通的。如果是這樣,它就像一個無限循環振盪器。

第二種方法要求您設置一個採樣過程,您需要決定何時採樣a

如果a被某個表達式驅動,則可以強制它成爲該表達式的反轉。

+0

嗨戴夫,只是想知道你是什麼意思的抽樣過程?我也忘了提及這個代碼是在一個'task'塊中,所以,當'task'塊結束時,無限循環的問題就不會成爲問題。如果我的理解是正確的,那麼一旦任務結束,「力量」應該停止強制信號。 – TheSprintingEngineer

+0

我的意思是「if」語句必須在某個時刻評估它的分支表達式,也就是說當你忘記提及的任務被調用時。 「力量」聲明建立了一個新的過程,它像一個連續的任務一樣:每當RHS上的信號發生變化時,RHS就會得到重新評估,並向LHS提供一個委託人。這個過程一直存在,直到另一個'force'取代它,或者有一個'release'。 –

+0

噢好吧,對於第一種方法,如果我在任務結束時使用'release',那麼信號應該保持該值,直到其他值被寫入信號'a',或者方法1不會工作在任何條件下,我應該只堅持方法2? – TheSprintingEngineer