對RAM初始化怎麼做
- 2019 年 10 月 31 日
- 筆記
RAM的初始化並沒有那麼神秘,如果是採用Xilinx的IP Core,只需提供一個.coe文件,其內容就是RAM的初始值,只需要注意coe文件的格式就好,這裡就不再贅述。
初始化方法
如果是自己寫的RTL程式碼,如何初始化呢?這裡提供兩個常用方法。來看一個例子,如下圖所示。

程式碼第16行,通過default將所有地址的初始值設置為0;
程式碼第17行,通過索引結合default的方式,將地址0的初始值設置為4,地址1的初始值設置為5,其餘地址的初始值設置為0;
程式碼第19行至第25行,採用initial語句,通過調用readmemb(類似的還有readmemh)實現對RAM的初始化。使用$readmemb時,需要提供一個.mem文件,文件內容就是RAM的初始值,這裡給出一個.mem的例子,如下圖所示。

模擬問題
使用$readmemb時,需要把.mem文件加入到Vivado工程中,如下圖所示。

如果沒有添加此文件,會顯示如下Warning資訊。


綜合問題
無論是default還是readmemb定義的初始值,在綜合時都是可以生效的。對於一個深度為4寬度為4的單埠RAM,綜合後的網表如下圖所示。

通過如下圖所示的Tcl命令可獲得相應的初始值,與init_data.mem中定義的初始值是一致的。

結論
兩種RAM初始化的方式:
-採用default或地址索引加default的方式
-採用$readmemb或$readmemh的方式
思考空間
如果需要對ram_block的2號和3號地址分別定義初始值為1和4,其餘地址對應初始值為0,該如何描述?