2016-04-13 128 views
0

其中哪些阻礙的模擬性能在我的測試平臺和爲什麼(尋找從系統的Verilog編譯器的角度來看答案):比較仿真性能

task A; 
wait(dut_if.a==1); 
. 
. 
endtask 

OR

task A; 
    forever @(posedge clk) begin 
    if(dut_if.a==1).. 
    end 
endtask 

PS:「 a「是在模擬期間在某個時鐘邊緣得到確認的dut信號。假設這個任務只被調用一次。

+0

感謝您的意見。所以從我的理解,永遠和永遠阻止一旦轉換爲低級語言實際上是某種中斷服務例程和等待語句將有點像分支指令。如我錯了請糾正我。如果你能指點我一些從編譯器角度談論系統verilog的源代碼,那將是非常好的。 –

回答

2

第一個選項會有更好的表現。我假設在您的使用情況下,這兩個選項在功能上都是正確的。

第二段代碼,等待每個時鐘,然後檢查條件。由於等待處於永久循環內,因此此代碼將導致在每個時隙的上下文切換。另一方面,選項1中的代碼僅切換一次上下文。

4

這兩者在功能上並不相同。第一個片段等待a變高(即完全相同的週期),而第二片段等待a「看到」要高在時鐘週期:

 _ _ _ _ _ 
clk _| |_| |_| |_| |_| |_ 
      ______________ 
a ______| 

      | | 
      1 2 

的數字表示你當每個被觸發。你真正想要的是:

@(posedge clk iff dut_if.a); 

這是語義上等同於片斷2. @Coverify做出應該在這裏也同樣適用(更快,因爲沒有上下文切換)的意見。

0

這兩個選項在功能上並不等同。

但在這種情況下,第二個選項會比第一個選項好,在模擬性能上。

因爲,在第一個選項,工具,需要檢查的價值,每個 和每一個時間步長,而在第二個選項,工具將檢查只在 posedge,而不是每個時間步長。

0

哪種性能更好?這取決於模擬器的實現。在真實的事件庫模擬器中,情況1的性能會更好,因爲評估代碼在每個時鐘邊沿都不會喚醒。不過,我懷疑案例2在現實世界中會有更好的表現,因爲評估代碼與時鐘刻度很好地一致。

如果您的代碼不是建模異步邏輯,我建議您堅持案例2.該代碼更易於理解和理解。與時鐘對齊使您的生活變得更加輕鬆。