📍前言
在芯片设计中使用SRAM 进行数据的缓存是比不可少的,在后端实现时需要根据具体的工艺库完成对SRAM 的替换,mem 主要包括2种类型:单口sram和双口sram。这里把替换前的SRAM 称为LM(local memory),一般是比较大的sim-model ,是纯RTL 代码做功能实现;替换后的mem 称为IM(implemented memory),是根据工艺库选出来的真实的mem,也是最终流片用的。
sram 时序图
对于写操作:当拍将写数据送到数据线上,对于读操作,需要下一拍才能出数据
替换步骤
1、查看mem.list ,整理所有用到的LM 根据工艺要求(在mem compiler中进行选型,一般需要考虑PPA ,选出合适的mem),这个过程可能需要对mem 进行拆分。
2、填写mem request 需求表,让负责维护SRAM 的同事生成mem_wrap(包括用于仿真和用于综合的)
3、将所有的LM 替换成IM,并完成质量检查和功能仿真,确认替换无误。
如果LM 本身比较小,是可以直接在mem compiler找到对应大小的IM ,这种替换比较简单,这篇文章主要分享:针对比较大的LM 需要拆解成比较小的IM时的经验。
拆分包括对地址和数据两种方式,下面分别展开说。
-
对数据位宽进行拆分,一般需要将数据的高位和低位分别放在不同的IM 中,这种拆分比较简单,但需要注意如果有写数据的mask ,需要进行适配,确保maks grant 的bits 是一样的。 对于SRAM 的使能信号和控制信号大都是低有效的,替换时需要对接口进行取反。 举个例子:
替换前(原代码):
module Sifive_Tile_nlpArray_0_ext input RW_clk, input [5:0] RW0_addr; input RW0_en, input RW0_wmode, input [3:0] RW0_wmask, input [115:0] RW0_wdata, output [115:0] RW0_rdata); reg reg_RW0_ren; reg [5:0] reg_RW0_addr; reg [115:0] ram[63:0]; integer i; always@(posedge clk) reg_RW0_r en < = RW0_en &&am