之前在看Altera的官方教程上就有說明,如果我們定義一個reg [`word_w]user_ram[`word_d] ; QuartusII會自動綜合成為一個ram—— 當然有一些前提:(后續補充)
今天就這個知識點看QuartusII 的反應如何 。因為最近在看《CPU自制入門》 我選定的DE1-SOC只有3w多個lab,我移植了原始的工程編譯居然提示需要10w個lab,所以分析與綜合過了之后place的時候就掛掉了,提示lab不足。所以就在折騰哪里可以節省資源
在gpr.v 里面剛好有一個定義
reg [`WordDataBus] gpr [`REG_NUM-1:0];
可是下面的代碼中卻有了reset過程
for (i = 0; i < `REG_NUM; i = i + 1) begin gpr[i] <= #1 `WORD_DATA_W'h0; end
在綜合成ram的特例中說明了,如果有了reset過程就不能生成ram了。好先來看看有了reset QuartusII 給個什么反應
i的循環語句QuartusII 給出了警告說發現了latch,這個有點不明白。最后看rtl viewer
12層大概都是張這個樣子而資源使用情況呢
大家看分析與綜合之后的報告,資源使用情況怎么會是這樣呢?(我這么說是想大家一會留意一下屏蔽掉ram的reset功能之后資源占用情況)
仔細看綜合報告的倒數第二行 : 說最后的資源使用情況有可能不同。
好,現在讓我們看看屏蔽掉ram的reset之后分析與綜合之后的情況如何,首先看綜合報告
第二行就說明了,發現了一個沒有被推論RAM實體—— 似乎言外之意是你沒有調用這么一個block,我發現了我來調用。
倒數第二行的說明也是說資源不可以相信上面的—— 和沒有屏蔽reset的時候資源使用情況是一樣的。
結論: 分析與綜合之后的資源使用率是估算的,是不准確的
好,我們再看看QuartusII 說發現了ram,那么它是怎么處理的,當然是看rtl viewer
呵呵,QuarutsII 真的是自己調用了ram。