//來自微信公眾號 "數字晶元實驗室"

Memory是晶元設計的重要組成部分。

Memory可以小到形成一個簡單的寄存器組。隨著晶元面積的增長,晶元中的Memory越來越多。本文討論綜合出設計中Memory的多維數組的含義和選擇來自工藝廠商Memory的一些需要考慮的因素。

如何實現多維數組。

Memory可以由綜合工具直接根據數組結構綜合出來。以下是用於綜合出小型存儲器的實例 RTL代碼。

module my_memory (datai,datao,clk,wr_n,addr) ;
parameter width = 4 ;
parameter log2_depth = 16 ;
input [width-1 : 0] datai ,addr ;
input clk ,wr_n,rd_n ;
output [width-1 :0] datao ;

reg [width-1 :0] memory [log2_depth -1 :0] ;
reg [width -1 : 0 ] datao ;
always@(posedge clk) begin
if(wr_n == 1b0) memory[addr] <= datai ;
else if(rd_n == 1b0) datao <= memory[addr] ; //Synchronous read
end
endmodule //my_module

上述代碼會綜合出64個根據地址索引的觸發器。

Verilog-2001引入了多維存儲器。上面的例子可以擴展到三個維度,即x,y和z,如下:

module my_memory(datai , datao , clk ,wr_n ,addr_x , addr_y ,addr_z) begin
parameter width = 4 ;
parameter log2_d = 4 ;
input [width -1 : 0] datai , addr_x ,addr_y , addr_z ;
input clk ,wr_n ,rd_n ;
output [width -1 : 0] datao ;
reg [width-1 :0] memory [log2_d -1 : 0 ] //addr_x
[log2_d -1 : 0 ] //addr_y
[log2_d -1 : 0 ] ; //addr_z
reg [width-1 : 0] datao ;
always@(posedge clk) begin
if(wr_n == 1』b0 ) memory[addr_x][addr_y][addr_z] <= datai ;
else if(rd_n == 1』b0) datao <= memory[addr_x][addr_y][addr_z] ;
end
endmodule

上面的多維數組最終會被合成x * y * z * width_=4 * 4 * 4 * 4= 256個單獨的觸發器。

使用來自半導體供應商的硬核memory會有更好的時序,面積和功耗,因為??它的邏輯是經過優化的,而不是使用離散邏輯。

但是,例化一個工藝相關的memory將使得該設計在不同工藝下不可重用。所以,我們應該在頂層用一個wrapper實例化設計和memory,而不是在設計中實例化memory。

實例化工藝相關的memory有哪些需要考慮的因素?

根據應用,memory的選擇基於在以下性能參數上:

面積:如果該晶元,面積是主要關注點,那麼就需要高密度的memory。通常而言,面積還取決於memory的工藝。

頻率:如果速度是主要關注點,那麼就需要高速的memory。

功耗:這是低電壓和低功耗應用的關鍵問題之一。此外,如果功耗變高,則整個系統的性能變得更低。它還增加了最終的封裝成本。

還需要考慮memory的其他設計變數:

memory容量:例如,將memory指定為512Kbits。

電壓:某些memory是針對特定電壓範圍而設計的。

同步或非同步:指定memory是否具有同步讀/寫或非同步讀/寫。使用哪一個主要取決於是否存在時鐘和匹配設計的時序要求。

單埠或多埠:確定memory是否由單個或多個讀/寫埠訪問。使用多埠memory的一個關鍵問題是多個埠正在嘗試寫入相同地址的memory會發生什麼問題。

觸發器或基於鎖存器:確定memory內的基本單元是否是基於觸發器或者鎖存器。

這種memory的重要考慮因素是可測試性和功耗。基於觸發器的設計比基於鎖存器更容易測試。隨著memory大小的增加,memory的可掃描性是重要的標準。許多供應商都提供了BIST邏輯,使memory可掃描。


推薦閱讀:
相关文章