劉 瑛,胡 凱,叢紅艷,萬 清
(中國電子科技集團公司第58研究所,江蘇 無錫 214035)
本文采用基于SMIC 40 nm工藝的Artisan Memory Compiler[1]軟件編譯產(chǎn)生BRAM 18 kB真正雙端口RAM來實現(xiàn)最高680 MHz的讀寫操作速度。根據(jù)電路的各項指標要求,用Verilog硬件描述語言對其進行RTL設計和仿真,來實現(xiàn)配置為18 k或者36 k的存儲器。
BRAM36k最多可以存儲36 kB數(shù)據(jù),并且可以配置成兩個獨立的18 kB RAM或者一個36 kB RAM[2]。每個SRAM36k,作為RAM使用時,可以配置成一個32k×1、16k×2、8k×4、4k×8(9)、2k×16(18)、1k×32(36);作為FIFO使用時,可以配置成8k×4、4k×9(8)、2k×18(16)、1k×36(32)的FIFO。每個SRAM18k作為RAM使用時,可以配置成一個16k×1、8k×2、4k×4、2k×8(9)、1k×16(18)存儲器。作為FIFO使用時,可以配置成一個4k×4、2k×9(8)、1k×18(16)的FIFO。同時該模塊作為RAM使用時,也支持同一個端口,但是讀寫位寬不一樣的模式。
真雙口36 kB BRAM 雙端口存儲器由兩個獨立的18 kB RAM組成,其具體結構內部圖如圖1所示。
其中FIFO_U0完成FIFO讀寫訪問控制功能,支持以兩塊SRAM18k作為一個RAM構成的FIFO讀寫訪問,也支持以SRAM18k_U0作為RAM構成的FIFO讀寫訪問。FIFO_U1只支持以SRAM18k_U1作為RAM構成的FIFO讀寫訪問。SRAM18k_U0完成對SRAM18k_U0以及SRAM18k_U1讀寫訪問控制功能,SRAM18k_U1完成對SRAM18k_U1讀寫訪問控制功能。
由于Memory Compiler編譯產(chǎn)生的SRAM18k存儲容量為18 kB,定義為SRAM_DP。利用其支持bit MASK寫操作,可以根據(jù)當前的地址信息產(chǎn)生寫使能MASK信號,這樣就可以只改變一個地址中某個或者某些bit內容,對外體現(xiàn)為不同的地址深度和位寬組合模式。其具體的組合模式如表1所示。
同時,在讀操作時,通過地址信號寄存一拍的信號來選擇SRAM_DP的讀數(shù)據(jù)中比特位置(表2)。
另外當兩塊SRAM18k級聯(lián)作為BRAM36k使用時,由于支持同一個端口讀寫位寬不同,在合理的讀寫位寬組合下,當讀位寬或者寫位寬為32 bit或36 bit時,需要特別處理。
例子1是以1k×32模式寫,以4k×8模式讀,此時兩塊SRAM18k寫模式為1k×16,讀模式為2k×8,此時用戶邏輯發(fā)出的寫地址和讀地址映射關系為:
寫地址是X,則讀地址X<<2+[0,1,2,3]。
當寫入操作時,32 bit數(shù)據(jù)需要同時寫入SRAM18k_U1和SRAM18k_U0,此時SRAM18k_U1和SRAM18k_U0的寫地址信號相同,如地址為X。當進行讀操作時,需要以2k×8模式先讀SRAM18k_U0,要讀兩次,然后再以2k×8模式讀SRAM18k_U1,要讀兩次;這樣交替進行完成32 bit全部讀出,此時讀出的數(shù)據(jù)按位拼接后是與寫數(shù)據(jù)相同的。其地址關系如圖2所示。
例子2是以4k×8模式寫,以1k×32模式讀,此時兩塊SRAM18k寫模式為2k×8,讀模式為1k×16。此時用戶邏輯發(fā)出的讀地址和寫地址映射關系為:
寫地址是X、X+1、X+2、X+3,則讀地址X>>2。X需要與32 bit地址對齊。
當寫入操作時,8 bit數(shù)據(jù)需要根據(jù)寫地址關系,如果地址是X、X+1則寫入SRAM18k_U0,如果地址是X+2、X+3則寫入SRAM18k_U1。當進行讀操作時,需要以1k×16模式同時讀SRAM18k_U0和SRAM18k_U1;此時讀出的數(shù)據(jù)按位拼接后是與寫數(shù)據(jù)相同的。
進行寫操作時,需要以2 k×8模式先寫SRAM18k_U0,要寫兩次,然后再以2k×8模式寫SRAM18k_U1,要寫兩次;這樣交替進行完成32 bit全部寫入,進行讀操作,則以1k×16模式同時讀取SRAM18k_U1和SRAM18k_U0,讀地址信號相同,將兩段16 bit讀數(shù)據(jù)拼接起來,SRAM18k_U1讀數(shù)據(jù)放在高位,這樣就讀出了之前以4k×8模式寫入的數(shù)據(jù)。其地址關系如圖3所示。
表2 讀訪問操作關系
圖2 SRAM18k_U0/U1 地址對應關系
仿真1:BRAM36k A口作為1k×32模式寫入時,驗證功能正確。
仿真條件:實現(xiàn)一個A口按1k×32模式,從初始地址0,以初始寫數(shù)據(jù)32’h9ECAB63D,寫數(shù)據(jù)遞增,批量寫入BRAM中。其中0地址寫入數(shù)據(jù)為32’h9ECAB63D,1地址寫入數(shù)據(jù)為32’h9ECAB63E,2地址寫入數(shù)據(jù)為32’h9ECAB63F,3地址寫入數(shù)據(jù)為32’h9ECAB640,…。
圖4中GROUP14為Testbench中構造的用戶邏輯驅動輸入激勵以及用戶的讀數(shù)據(jù)輸出。{di_a_u1[15:0],di_a_u0[15:0]}構成32 bit寫數(shù)據(jù),初始寫數(shù)據(jù)為32’h9ECAB63D,每次寫操作依次遞增,{do_a_u1[15:0],do_a_u0[15:0]}構成32 bit讀數(shù)據(jù),en_a_u0信號為BRAM36k訪問的片選信號,高有效;{we_a_u1[1:0],we_a_u0[1:0]}構成32 bit寫數(shù)據(jù)的byte寫使能,高有效,全零則表示此次訪問為讀操作;addr_a_u0[13:0]在寫操作時為寫地址,在讀操作時為讀地址,初始值為0,每次寫操作或者讀操作后依次遞增。
圖3 SRAM18k_U0/U1 地址對應關系
GROUP16為內部SRAM18k_U1 A端口訪問的接口信號,ENA表示RAM A端口片選使能,高有效;ADDRA表示A端口訪問地址,WENA為18 bit寫數(shù)據(jù)的MASK信息,當某一位置bit為0,表示寫數(shù)據(jù)中對應bit位置的數(shù)據(jù)需要寫入RAM中;DIA和DOA分別為寫數(shù)據(jù)和讀數(shù)據(jù),實際還有DIPA、DOPA圖中未畫出,用于承載18 bit高2 bit,用于用戶的奇偶校驗bit輸入和輸出;GROUP15為內部SRAM18k_U0 A端口訪問的接口信號,信號含義同SRAM18k_U1。
由仿真波形可見,當BRAM36k作為1k×32模式寫入時,此時32 bit的寫數(shù)據(jù)需要同時寫入SRAM18k_U1、SRAM18k_U0,兩塊RAM的訪問地址是相同的,但數(shù)據(jù)不同,兩塊RAM的WENA[15:0]為0,表示要將各自輸入的DIA[15:0]寫入RAM中。
仿真2:當BRAM作為4k×8模式讀出時,驗證功能正確性。
仿真條件:A口按4k×8模式,從初始地址0,批量讀出BRAM36K中的數(shù)據(jù)。期望從0地址讀出數(shù)據(jù)為8’h3D,1地址讀出數(shù)據(jù)為8’hB6,2地址讀出數(shù)據(jù)為8’hCA,3地址讀出數(shù)據(jù)為8’h9E;從4地址讀出數(shù)據(jù)為8’h3E,5地址讀出數(shù)據(jù)為8’hB6,6地址讀出數(shù)據(jù)為8’hCA,7地址讀出數(shù)據(jù)為8’h9E;從8地址讀出數(shù)據(jù)為8’h3F,9地址讀出數(shù)據(jù)為8’hB6,10地址讀出數(shù)據(jù)為8’hCA,11地址讀出數(shù)據(jù)為8’h9E…。
圖5中GROUP14為TESTBENCH中構造的用戶邏輯驅動輸入激勵以及用戶的讀數(shù)據(jù)輸出。{do_a_u1[15:0],do_a_u0[15:0]}構成32 bit讀數(shù)據(jù),en_a_u0信號為BRAM36K訪問的片選信號,高有效;{we_a_u1[1:0],we_a_u0[1:0]}構成32 bit寫數(shù)據(jù)的byte寫使能,高有效,全零則表示此次訪問為讀操作;addr_a_u0[13:0]在寫操作時為寫地址,在讀操作時為讀地址,初始值為0,每次寫操作或者讀操作后依次遞增。
GROUP16為內部SRAM18k_U1 A端口訪問的接口信號,ENA表示RAM A端口片選使能,高有效;ADDRA表示A端口訪問地址,WENA為18 bit寫數(shù)據(jù)的MASK信息,當某一位置bit為0,表示寫數(shù)據(jù)中對應bit位置的數(shù)據(jù)需要寫入RAM中,在讀操作時,必須全部為1;讀數(shù)據(jù)在ENA有效后的后一拍輸出。DIA和DOA分別為寫數(shù)據(jù)和讀數(shù)據(jù),實際還有DIPA、DOPA圖中未畫出,用于承載18 bit高2 bit,用于用戶的奇偶校驗bit輸入和輸出;GROUP15為內部SRAM18k_U0 A端口訪問的接口信號,信號含義同SRAM18k_U1。
圖4 BRAM36k A口作為1k×32模式寫入仿真結果
圖5 BRAM作為4k×8模式讀出時仿真結果
由仿真波形可見,當BRAM36k作為4k×8模式讀出時,此時原來按32 bit的寫入0地址(1k×32模式的地址0)的數(shù)據(jù)需要通過四次讀0、1、2、3(4k×8模式的地址0、1、2、3)才能全部回讀回來。兩塊RAM的訪問是交替進行,先讀SRAM18k U0的0、1地址,再讀SRAM18k U1的0、1地址。兩塊RAM的WENA為全1,表示此時進行的是讀操作。
仿真3:當B口按4k×8模式寫入時,驗證功能正確性。
仿真條件:B口按4k×8模式,從初始地址0,批量寫入數(shù)據(jù)。
圖6中GROUP11為TESTBENCH中構造的用戶邏輯驅動輸入激勵以及用戶的讀數(shù)據(jù)輸出。di_b_u0[7:0]}構成8 bit寫數(shù)據(jù),每次寫操作依次遞增,以初始寫數(shù)據(jù)8’hDF,實際有效的寫數(shù)據(jù)承載在di_b_u0[7:0]上,批量寫入BRAM中。0地址寫入數(shù)據(jù)為8’hDF,1地址寫入數(shù)據(jù)為8’hE0,2地址寫入數(shù)據(jù)為8’hE1,3地址寫入數(shù)據(jù)為8’hE2,…。{do_b_u1[15:0],do_b_u0[15:0]}構成32 bit讀數(shù)據(jù),en_b_u0信號為BRAM36k B端口訪問的片選信號,高有效;we_b_u0[0]構成8 bit寫數(shù)據(jù)的byte寫使能,高有效,we_b_u0[0]為零則表示此次訪問為讀操作;addr_b_u0[13:0]在寫操作時為寫地址,在讀操作時為讀地址,初始值為0,每次寫操作或者讀操作后依次遞增。
GROUP13為內部SRAM18k_U1 B端口訪問的接口信號,ENB表示RAM B端口片選使能,高有效;ADDRB表示B端口訪問地址,WENB為18 bit寫數(shù)據(jù)的MASK信息,當某一位置bit為0,表示寫數(shù)據(jù)中對應bit位置的數(shù)據(jù)需要寫入RAM中;DIB和DOB分別為寫數(shù)據(jù)和讀數(shù)據(jù),實際還有DIPB、DOPB圖中未畫出,用于承載18 bit高2 bit,用于用戶的奇偶校驗bit輸入和輸出;GROUP12為內部SRAM18k_U0 B端口訪問的接口信號,信號含義同SRAM18k_U1。
圖6 B口按4k×8模式寫入仿真結果
由仿真波形可見,當BRAM作為4k×8模式寫入時,此時8 bit的寫數(shù)據(jù)需要根據(jù)寫地址是屬于X、X+1還是X+2、X+3,選擇寫入SRAM18k_U0還是SRAM18k_U1,其中X為32 bit地址對齊。WENB[17:0]為18’h3FF00表示寫入低8 bit,即是18 bit的[7:0],WENB[17:0]為18’h300FF表示寫入高8 bit,即是18 bit的[15:8]。
仿真4:當B口按1k×32模式讀出數(shù)據(jù)時,驗證功能正確性。
仿真條件: B口按1k×32模式,從初始地址0,批量讀出BRAM中的數(shù)據(jù)。期望從0地址讀出數(shù)據(jù)為32’hE2E1E0DF,1地址讀出數(shù)據(jù)為32’hE6E5E4E3。
圖7中GROUP11為testbench中構造的用戶邏輯驅動輸入激勵以及用戶的讀數(shù)據(jù)輸出。{do_b_u1[15:0],do_b_u0[15:0]}構成32 bit讀數(shù)據(jù),en_b_u0信號為BRAM36K訪問的片選信號,高有效;{we_b_u1[1:0],we_b_u0[1:0]}構成32 bit寫數(shù)據(jù)的byte寫使能,高有效,全零則表示此次訪問為讀操作;addr_b_u0[13:0]在寫操作時為寫地址,在讀操作時為讀地址,初始值為0,每次寫操作或者讀操作后依次遞增。GROUP13為內部SRAM18k_U1 B端口訪問的接口信號,ENB表示RAM片選使能,高有效;ADDRB表示B端口訪問地址,WENB為18 bit寫數(shù)據(jù)的MASK信息,當某一位置bit為0,表示寫數(shù)據(jù)中對應bit位置的數(shù)據(jù)需要寫入RAM中,在讀操作時,必須全部為1;讀數(shù)據(jù)在ENB有效后的后一拍輸出。DIB和DOB分別為寫數(shù)據(jù)和讀數(shù)據(jù),實際還有DIPB、DOPB圖中未畫出,用于承載18 bit高2 bit,用于用戶的奇偶校驗bit輸入和輸出;GROUP12為內部SRAM18k_U0 B端口訪問的接口信號,信號含義同SRAM18k_U1。
由仿真波形可見,當BRAM作為1k×32模式讀出時,此時原來按8 bit寫入0、1、2、3地址(4k×32模式的地址0、1、2、3)的數(shù)據(jù)只需要通過一次讀0地址(1k×32模式的地址0)就能全部回讀回來。兩塊RAM的訪問同時進行,地址變化相同,兩塊RAM的WENB為全1,表示此時進行的是讀操作。
圖7 B口按1k×32模式讀出數(shù)據(jù)仿真結果
[1] Xilinx Inc. Xapp(130). Virtex中塊狀SelectRAM+特性的使用[Z]. 2000-12-18.
[2] 王睿,劉布民. FPGA中BRAM設計研究[D]. 2009.