要解決任何綜合崩潰問題,通常應(yīng)該從了解崩潰發(fā)生在綜合的哪個階段著手,以及工具方面是否有任何跡象指向特定的模塊、賦值、聲明或推斷。
在某些情況下會出現(xiàn)日志不足的狀況,并且需要與賽靈思共享 RTL 設(shè)計,才能對問題進(jìn)行進(jìn)一步調(diào)試。
Elaboration 階段中的工具崩潰:
這意味著該工具是在對 RTL 設(shè)計進(jìn)行細(xì)化時崩潰的,綜合日志看上去如下所示:
-------------------------------------------------------------------
Starting RTL Elaboration : Time (s): …
----------------------------------------------------------------
…….
Abnormal program termination (11)
Please check '..hs_err_pidxxxx.log' for details
Parent process (pid xxxxx) has died. This helper process will now exit
OR
----------------------------------------------------------------
Starting RTL Elaboration : Time (s): …
----------------------------------------------------------------
----------------------------------------------------------------
Finished RTL Elaboration : Time (s): cpu = …
----------------------------------------------------------------
RTL Elaboration failed
在綜合日志中,您應(yīng)該會看到類似于“Abnormal program termination (11)”的崩潰相關(guān)消息(盡管可能是在沒有消息的情況下)。這些問題就是崩潰問題。
如果是細(xì)分崩潰問題,在大多數(shù)情況下,問題出在工具中未得到正確處理的 RTL 或 RTL 的某些部分。如果是這類情況,請與我們分享您的工程,以便我們可以在工具中添加修復(fù)程序,避免將來出現(xiàn)這類問題。
要在您這里調(diào)試此類問題,以下步驟可能會有用。這里的目標(biāo)是將崩潰縮小到“設(shè)計模塊”,然后 -> “RTL 文件” -> “某部分 RTL” -> “Line of RTL 代碼行”。
確定發(fā)生問題的 RTL 文件是最艱巨的任務(wù)之一。要找到有問題的模塊,可以使用以下方法:
使用黑匣子的方法
賽靈思
假設(shè)設(shè)計結(jié)構(gòu)及層級如下所示:
這里的目標(biāo)是使用 black_box 屬性消除其他三個模塊。我們需要假設(shè)一個模塊有問題。假設(shè) A 有問題:對于這種情況,保持 A 模塊完好無損,并將 RTL 文件中的 B、C 和 D 都設(shè)為 black_box:
(* black_box *) module B (
…)
end module
(* black_box *) module C (
…)
end module
(* black_box *) module D (
…)
end module
運行 Synthesis 并檢查工具是否以崩潰。
如果工具已崩潰,則問題要么出在模塊 A,要么出在其子模塊 (A11、A12 ... A21、A22 ......)中。在這種情況下,通過保留 A1 并將 A2 設(shè)為 black_box 繼續(xù)調(diào)試,依此類推。
如果工具沒有崩潰,則嘗試保持 B 模塊完好無損,并將 A、C 和 D 標(biāo)記為 black_box。
這里有一個簡單的示例工程:
在綜合上述層級時,該工具崩潰并在綜合日志中出現(xiàn)以下錯誤:
….
….
Parameter break bound to: 8'b11110000
An unrecoverable error has occurred, synthesis canceled.
-------------------------------------------------------------------
Finished RTL Elaboration : Time (s): cpu = 0005 ; elapsed = 0007 . Memory (MB): peak = 3278.059 ; gain = 194.688 ; free physical = 20020 ; free virtual = 114523
-------------------------------------------------------------------
RTL Elaboration failed
INFO: [Common 17-83] Releasing license: Synthesis
4 Infos, 5 Warnings, 0 Critical Warnings and 1 Errors encountered.
synth_design failed
ERROR: [Common 17-69] Command failed: Synthesis failed - please see the console or run log file for details
INFO: [Common 17-206] Exiting Vivado at Thu Feb 21 2322 2019...
正如您在日志中可以清楚地看到的那樣,當(dāng)工具試圖對設(shè)計進(jìn)行細(xì)分時發(fā)生了崩潰。
為了調(diào)試這個問題,我們需要開始對模塊進(jìn)行黑盒測試。嘗試多個組合后,當(dāng)使用black_box屬性禁用ps2_to_ascii1時,綜合通過,同樣,當(dāng)僅啟用pas2_to_ascii2時,該工具會崩潰,如下所示:
…
attribute black_box : string;
attribute black_box of Debounce : component is "yes";
attribute black_box of sinchronizer : component is "yes";
attribute black_box of SIPO : component is "yes";
attribute black_box of Driver : component is "yes";
…
由于我們已經(jīng)確定了RTL文件/模塊,現(xiàn)在的目標(biāo)是要找到RTL中導(dǎo)致崩潰的部分。這可能是因大循環(huán)迭代、長而復(fù)雜的賦值、復(fù)雜的位片操作或不正確的編碼方式或不支持的結(jié)構(gòu)而導(dǎo)致的。在上述示例中,由于不支持編碼方式,導(dǎo)致工具崩潰:
process(…)
begin
case dummy is
when S1 =>
if rising_edge(clk) then
...
end if;
end if;
when S2 =>
if rising_edge(clk) then
...
end if;
end if;
when S3 =>
if rising_edge(clk) then
...
end if;
end if;
when S4 =>
...
end case;
end process;
**也可以通過使單個模塊成為綜合的“頂層模塊”來查看工具是否會崩潰來找到引起問題的模塊或RTL文件。
例如,當(dāng)pas2_to_ascii2被設(shè)置為頂層模塊時,上述工程會以相同的錯誤崩潰。
跨邊界優(yōu)化階段的崩潰:
什么是跨邊界優(yōu)化?
該工具將基于synth_design命令嘗試在任何給定設(shè)計上執(zhí)行許多優(yōu)化。全局設(shè)置、塊級設(shè)置和屬性可以定義工具是否可以在層級(邊界)內(nèi)或跨層級(邊界)執(zhí)行優(yōu)化。對于Vivado的默認(rèn)設(shè)置,‘-flatten_hierarchy’ 被設(shè)置為‘rebuilt’,該工具會嘗試展平層級并執(zhí)行跨邊界優(yōu)化。
該工具會試圖找到跨邊界的優(yōu)化可能性,并且可能會由于工具錯誤或由于設(shè)計問題而崩潰(在最壞的情況下)。在上述情況下,日志可能如下所示:
--------------------------------------------------------------------------
Start Cross Boundary Optimization
--------------------------------------------------------------------------
Abnormal program termination (6)
Please check 'hs_err_pid5649.log' for details
Parent process (pid 5649) has died. This helper process will now exit
為了防止這類崩潰,一個簡單的解決方法是通過將全局設(shè)置“flatten_hierarchy”更改為“none”來禁用跨邊界優(yōu)化。使用“none”的缺點可能是一個糟糕的QoR,所以可能不適用于所有設(shè)計。
一個更好的方法是通過黑匣方法找到引起問題的層級,然后對該層級使用“KEEP_HIERARCHY/DONT_TOUCH”屬性來禁用該層級內(nèi)/來自該層級的任何跨邊界優(yōu)化。
也有一個可能是,工具在推斷/優(yōu)化 BRAM時崩潰。
在這種情況下,您可以禁用BRAM推斷來看看這是否是真正的原因。要實現(xiàn)這一點,需要將-max_bram選項設(shè)置為‘0’。如果在將‘synth_design -max_bram’設(shè)置為0后工具即完成綜合,那么,崩潰與BRAM推斷有關(guān)。
由于禁用BRAM推斷不是一個可接受的方案,用戶將需要找到BRAM寄存器所在的模塊,并且基于客戶的應(yīng)用情況,可以對存儲器寄存器使用“DONT_TOUCH”屬性以阻止BRAM推斷。
另一種方法是將該模塊標(biāo)記為OOC、同時-max_bram標(biāo)記為'0',并使用默認(rèn)值(即-max_bram "-1")來運行頂層模塊的綜合。
如果您仍然遭遇崩潰,請將您的日志文件(hs_pidxxxx.log and runme.log)和詳細(xì)的設(shè)計信息發(fā)布到賽靈思官方中文論壇。
時序優(yōu)化中的崩潰:
Vivado是一個時序驅(qū)動綜合引擎,對于所有設(shè)計,該工具都會嘗試查看是否有任何可能執(zhí)行的優(yōu)化以滿足設(shè)計的時序要求。在一些情況下,該工具可能會在時序優(yōu)化階段崩潰,日志如下:
-------------------------------------------------------------------
Start Timing Optimization
-------------------------------------------------------------------
Abnormal program termination (11)
Please check 'hs_err_pid15514.log' for details
在這類情況下,首先要做的事是禁用約束(.xdc)文件并運行綜合。如果工具通過綜合操作,那么問題可能與設(shè)計加約束的方式(用戶問題)或工具處理設(shè)計約束的方式(工具問題)有關(guān)。
調(diào)試此類問題的一種方法會是找到導(dǎo)致崩潰的約束/約束集。這可以通過注釋約束然后逐個啟用它們來查看工具何時再次崩潰來完成。一旦您有一組引起失敗的約束,請參考UFDM驗證約束及其用法,然后對其進(jìn)行相應(yīng)的修改以避免這類崩潰問題。
如果您仍然看到崩潰,請將您的日志文件 (hs_pidxxxx.log and runme.log)及詳細(xì)設(shè)計信息發(fā)布到賽靈思中文論壇。
其他重要調(diào)試步驟及其分析結(jié)果:
FSM 推斷崩潰問題:
我們還看到了在綜合FSM時工具崩潰的一些問題,將全局設(shè)置-fsm_extraction設(shè)為“off”有助于解決基于FSM的崩潰問題。
堆棧溢出引起的崩潰問題:
該工具在堆棧的內(nèi)存耗盡時可能會崩潰,而且可能會不報告任何情況。此外,該工具甚至可能不會在運行目錄中生成hs_pidxxxx.日志。對于與堆棧相關(guān)的崩潰,請使用以下命令調(diào)用Vivado工具:
“vivado -stack 2000”
這樣做有助于該工具獲得更多可用來執(zhí)行綜合的堆棧內(nèi)存,并且還可以避免與堆棧相關(guān)的崩潰問題。
Windows操作系統(tǒng)特定的崩潰:
有幾種原因會引起特定于Windows的崩潰,因此要確保您看到的問題不是Windows操作系統(tǒng)的特定問題,請在任一支持的Linux操作系統(tǒng)上運行一次。
OOC (Out of Context)與非OOC流程:
我們已經(jīng)看了一些示例,當(dāng)工程設(shè)置為完全非OOC(沒有IP、沒有RTL模塊為OOC)時,整個設(shè)計會通過綜合。在某些情況下,相反的情況也可行,可通過在OOC模式而不是“Global”模式下生成IP的輸出文件。
-
Vivado
+關(guān)注
關(guān)注
19文章
806瀏覽量
66241 -
時序優(yōu)化
+關(guān)注
關(guān)注
0文章
4瀏覽量
1446
發(fā)布評論請先 登錄
相關(guān)推薦
評論