利用WReal加速系統模擬
簡介 VerilogA是電路設計特別是IC設計常用的建模語言。它使用電壓和電流的數學計算來類比電路模組模擬。VerilogA模型可以準確描述電路的各種特性。因此可以很好的在系統設計前期進行建模。 但是,由於VerilogA完全使用Spice連續時間模擬引擎,在準確描述系統行為的同時帶來了相對比較大的模擬計算量,也意味著相對比較長的模擬時間。這在含有高頻的訊號的系統模擬中尤為明顯。 加速系統模擬,特別是含有大量時鐘/邏輯行為的系統的其中方法是使用WReal模型。 WReal語言使用數字模擬的引擎,用浮點數來表示節點的電壓值。由於不需要連續時間模擬,外加一些屬於數字域的加速技巧,在系統模擬中使用WReal模型可以很好地加快模擬。
我們下面利用一個VeriloA搭建的模型和部分優化為WReal的模型進行模擬時間對比。
PFC模型電路 我們在這裡搭建了一個CCM的PFC控制器的模型。並不完美但是可以展示兩種建模技術之間的差異了。 AC電源經過二極體橋後進入一個Boost電路。控制電路電流環調節電感電流等於AC電壓值X輸出電壓。電壓環路保持輸出電壓為400V。 這裡使用模型實現的模組包括:
- 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模型中,以下模組花費了比較多的計算時間:
- AC電壓和電感電流檢測放大器。主要原因是考慮了放大器頻寬的影響,在模型中使用了S域函式。 解決:由於頻寬是我們設計要考慮的一個比較重要的問題,因此這部分計算時間我們並不打算節省。因此這裡保留VerilogA的S域計算函式。
- Gm放大器導致一些收斂性問題而花費的計算時間。 解決:Gm放大器需要電流輸出,這樣才能驗證不同的補償網路帶來的差異。電流輸出只能在模擬域中實現。因此這部分也不做修改。
- 比較器和驅動電路。實際上在輸出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電壓波形的狀態。
相關文章
- 如何利用Ptrace攔截和模擬Linux系統呼叫Linux
- Gpssworld模擬(二):並排排隊系統模擬
- 【Java】酒店管理系統的模擬Java
- 請教UML建立模擬系統
- Linux系統上最快的3個GPU加速終端模擬器你知道嗎?LinuxGPU
- Web 模擬終端部落格系統Web
- web模擬終端部落格系統Web
- windows 系統模擬藍屏方法薦Windows
- 利用Python模擬GitHub登入PythonGithub
- 利用類反射模擬內省功能反射
- 利用雲端 3DEXPERIENCE 平臺加速創新和 PLM——設計、模擬、生產和協作3D
- Java作業系統課設之模擬程式管理系統Java作業系統
- xcode模擬器截圖。mac系統。XCodeMac
- C語言實戰!!!:商城系統模擬C語言
- C#模擬窗體系統選單C#
- 光學數字孿生系統模擬
- 【電子取證:映象模擬篇】DD、E01系統映象動態模擬
- 新能源系統模擬測試解決方案
- Linux系統管理員模擬試卷(轉)Linux
- 案例題-------銀行存取款系統(BSWS)軟體系統模擬
- 加速你的安卓模擬器,讓開發更迅速安卓
- 利用cache特性檢測Android模擬器Android
- 模擬利用MV進行資料遷移
- 駕駛員理論技巧線上模擬考試系統
- TISC — 系統多學科協同模擬平臺
- TISC—系統多學科協同模擬平臺
- 《美國軍用模擬系統剖析》培訓開課
- 交通法規模擬考試系統 官網
- 模切ERP系統如何提升物料的利用率
- 利用jQuery模擬實現select下拉框jQuery
- 利用IT++搭建通訊模擬平臺(C++)C++
- 關於虛擬模擬教學系統使用WebGL部署的痛點分析Web
- Concurrent iHawk — 實時平行計算機模擬系統計算機
- Java入門自定義異常&模擬借書系統Java
- 車身舒適系統模擬測試解決方案
- 使用 Ptrace 去攔截和模擬 Linux 系統呼叫Linux
- Linux 中模擬多種系統負載的方法Linux負載
- 【原始碼】基於MPPT的光伏(PV)系統模擬原始碼