利用WReal加速系統模擬

吳順珉發表於2020-02-04

簡介 VerilogA是電路設計特別是IC設計常用的建模語言。它使用電壓和電流的數學計算來類比電路模組模擬。VerilogA模型可以準確描述電路的各種特性。因此可以很好的在系統設計前期進行建模。 但是,由於VerilogA完全使用Spice連續時間模擬引擎,在準確描述系統行為的同時帶來了相對比較大的模擬計算量,也意味著相對比較長的模擬時間。這在含有高頻的訊號的系統模擬中尤為明顯。 加速系統模擬,特別是含有大量時鐘/邏輯行為的系統的其中方法是使用WReal模型。 WReal語言使用數字模擬的引擎,用浮點數來表示節點的電壓值。由於不需要連續時間模擬,外加一些屬於數字域的加速技巧,在系統模擬中使用WReal模型可以很好地加快模擬。

我們下面利用一個VeriloA搭建的模型和部分優化為WReal的模型進行模擬時間對比。

PFC模型電路 我們在這裡搭建了一個CCM的PFC控制器的模型。並不完美但是可以展示兩種建模技術之間的差異了。 AC電源經過二極體橋後進入一個Boost電路。控制電路電流環調節電感電流等於AC電壓值X輸出電壓。電壓環路保持輸出電壓為400V。 enter image description here 這裡使用模型實現的模組包括:

  • AC電壓檢測
  • 電感電流檢測
  • 輸出電壓Gm放大器
  • 乘法器
  • 電流Gm放大器
  • 斜坡比較器
  • 驅動電路

VerilogA模擬

第一個版本,所有以上模組都是用VerilogA模型。 做瞬態模擬,模擬上電後的瞬態10mS。為避免磁碟讀寫佔用太多時間,只儲存主要的13個節點電壓。使用Spectre單程式模擬。 模擬結果Log如下:

Intrinsic tran analysis time:    CPU = 404.168 s, elapsed = 408.992 s.
Total time required for tran analysis `tran': CPU = 404.174 s (6m  44.2s), elapsed = 409.009 s (6m  49.0s).
Time accumulated: CPU = 404.669 s (6m  44.7s), elapsed = 410.611 s (6m  50.6s).
Peak resident memory used = 165 Mbytes.

也就是總共使用了大約410秒。

修改模型

為了加快模擬速度,我們可以開啟Diagnose選項,觀察模擬器主要花費時間比較多的模組和節點。

在第一版的VerilogA模型中,以下模組花費了比較多的計算時間:

  1. AC電壓和電感電流檢測放大器。主要原因是考慮了放大器頻寬的影響,在模型中使用了S域函式。 解決:由於頻寬是我們設計要考慮的一個比較重要的問題,因此這部分計算時間我們並不打算節省。因此這裡保留VerilogA的S域計算函式。
  2. Gm放大器導致一些收斂性問題而花費的計算時間。 解決:Gm放大器需要電流輸出,這樣才能驗證不同的補償網路帶來的差異。電流輸出只能在模擬域中實現。因此這部分也不做修改。
  3. 比較器和驅動電路。實際上在輸出Log裡面可以看到PWM訊號輸出點,佔據了15%的Convergence failure counts。是僅次於電流檢測電阻兩端的計算點。 我們嘗試將原本的VerilogA實現的比較器和驅動電路修改為WReal。

原本的比較器程式碼如下:

analog begin

@(initial_step) begin
    vos = (hysmode==0)?vhys/2:(-vhys);
    i = 0;
end
    i = (V(ip, in)- vos)>0?1:0;

    if(hysmode==0) begin
        vos = (i>0)?(-vhys/2):(vhys/2);
    end
    else begin
        vos = (i>0)?-vhys:0;
    end

V(vout) <+ transition(i*V(vcc, gnd), tdelay, trise, tfall);

end

VerilogA程式碼本身並不複雜。可以優化的主要是兩個方面: 1. 上電過程中,VCC變化的時候可以不進行計算。我們只希望輸入變化可能導致輸出變化的時候再進行計算。 2. 輸出波形transition語句會由於離散的i變化而產生大量的點。 我們修改為WReal模型如下:

always @(ip, in) begin
    i = (ip-in-vos)>0?1:0;
    if(hysmode==0) begin
        vos = (i>0)?(-vhys/2):(vhys/2);
    end
    else begin
        vos = (i>0)?-vhys:0;
    end
    xout = i*(vcc-gnd);
end
assign vout = xout;

注意在這裡所有的輸入輸出都已經設定為WReal型別也就是浮點數值。 敏感列表只在ip和in發生變化的時候進行處理,避免了上電過程中VCC變化導致的計算。 將浮點數直接賦值給WReal網線,由於輸出訊號進入驅動模組,而驅動模組的輸入也是WReal型別,使得這個網線不會被轉換為Electrical,也意味著這個網線上沒有多餘的點和計算量。

我們進一步分析還可以發現,由於比較器的輸入是環路的補償點。緩慢變化的補償點電壓導致敏感列表響應了大量的事件。實際上我們並不關心ip和in的微小變化。我們只關心什麼時候輸入會導致輸出翻轉。因此我們進一步將模型修改為如下:

always @(absdelta(ip-in-last, `vtol, 1n)) begin // save even more event
    last = ip-in;
    i = (ip-in-vos)>0?1:0;
    if(hysmode==0) begin
        vos = (i>0)?(-vhys/2):(vhys/2);
    end
    else begin
        vos = (i>0)?-vhys:0;
    end
    xout = i*(vcc-gnd);
end

assign vout = xout;

我們每次儲存下當前的輸入差分電壓。我們只在輸入差分電壓變化大於預先定義的`Vtol(這裡定義為1mV)的時候才進行計算。這樣進一步減小了計算量。

對於驅動模組我們使用相同的思路進行修改。

WReal模擬 在經過以上WReal 修改後,我們的系統中含有VerilogA的模型,也含有修改後的比較器和驅動模組的WReal模型。我們再進行同樣的模擬:

Intrinsic tran analysis time:    CPU = 53.0514 s, elapsed = 52.0369 s.
Total time required for tran analysis `tran': CPU = 53.0572 s, elapsed =
        52.0454 s.
Time accumulated: CPU = 53.8021 s, elapsed = 59.6655 s.
Peak resident memory used = 125 Mbytes.

模擬時間從410秒變成了59秒,我們得到了7倍的模擬加速。

從前後兩次模擬的波形對比可以看到,輸出電壓幾乎沒有差異。電感電流檢測輸出電壓,藍色的VerilogA波形比較“規整”而WReal毛刺多一些,但也基本上可以看到上電inrush到開始跟隨AC電壓波形的狀態。 enter image description here

相關文章