在线咨询
eetop公众号 创芯大讲堂 创芯人才网
切换到宽版

EETOP 创芯网论坛 (原名:电子顶级开发网)

手机号码,快捷登录

手机号码,快捷登录

找回密码

  登录   注册  

快捷导航
搜帖子
查看: 3504|回复: 6

[原创] ic设计的sram和fifo

[复制链接]
发表于 2020-12-13 22:57:51 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?注册

x
数字IC设计萌新,之前一直用FPGA开发,现在在做IC设计,遇到了关于数字IC中的SRAM和fifo的综合问题。问题如下:
(1)sram的verilog实现
module cbuf_mem
(
        input clk,
        input rst_n,

        //Wr Port
        input wr_en,
        input [5:0]wr_addr,
        input [16*16-1:0]wr_dat,

        //Rd Port
        input rd_en,
        input [5:0]rd_addr,
        output reg rd_dat_vld,
        output [16*16-1:0]rd_dat
);

reg [16*16-1:0]rd_dat_r;
(* ram_style = "block" *) reg [16*16-1:0]mem[5:0];

always @(posedge clk or negedge rst_n)
if(~rst_n)
        rd_dat_r<='d0;
else
        if(rd_en)
                rd_dat_r<=mem[rd_addr];

always @(posedge clk or negedge rst_n)
if(~rst_n)
        rd_dat_vld<=1'b0;
else
        rd_dat_vld<=rd_en;

always @(posedge clk)
if(wr_en)
        mem[wr_addr]<=wr_dat;

assign rd_dat=rd_dat_r;

endmodule

(2)fifo的verilog实现
module hs_pipe #
(
    parameter DATA_WIDTH=256,
    parameter PIPE_DEPTH=8
)
(
    input clk,
    input rst_n,

    input data_in_vld,
    input [DATA_WIDTH-1:0]data_in,
    output data_in_rdy,

    output data_out_vld,
    output [DATA_WIDTH-1:0]data_out,
    input data_out_rdy   
);

function integer clogb2 (input integer bit_depth);
begin
    for(clogb2=0;bit_depth>0;clogb2=clogb2+1)
        bit_depth=bit_depth>>1;
end
endfunction

localparam clog2_PIPE_DEPTH=clogb2(PIPE_DEPTH-1);

reg [DATA_WIDTH-1:0]mem[PIPE_DEPTH-1:0];
reg [clog2_PIPE_DEPTH-1:0]w_pointer;
reg w_phase;
reg [clog2_PIPE_DEPTH-1:0]r_pointer;
reg r_phase;

wire wr_en=data_in_vld&data_in_rdy;
wire rd_en=data_out_vld&data_out_rdy;

always@(posedge clk or negedge rst_n)
begin
    if(~rst_n)
    begin
        w_phase<=1'b0;
        w_pointer<=0;
    end
    else
    begin
        if(wr_en)
        begin
            if(w_pointer==PIPE_DEPTH-1)
            begin
                w_pointer<='d0;
                w_phase<=~w_phase;
            end
            else
                w_pointer<=w_pointer+1'b1;
        end
    end
end

always@(posedge clk)
begin
    if(wr_en)
        mem[w_pointer]<=data_in;
end

always@(posedge clk or negedge rst_n)
begin
    if(~rst_n)
    begin
        r_pointer<=0;
        r_phase<=1'b0;
    end
    else
    begin
        if(rd_en)
        begin
            if(r_pointer==PIPE_DEPTH-1)
            begin
                r_pointer<='d0;
                r_phase<=~r_phase;
            end
            else
                r_pointer<=r_pointer+1'b1;
        end
    end
end

assign data_out=mem[r_pointer];
wire empty=(w_pointer==r_pointer)&&(w_phase^~r_phase);
wire full=(w_pointer==r_pointer)&&(w_phase^r_phase);
assign data_out_vld=~empty;
assign data_in_rdy=~full;

endmodule


因为之前做FPGA设计,对于片上SRAM缓存,我会用如(1)所示的代码实现,然后把寄存器类型设置为bram,在综合时便会用bram来综合而不是触发器组成sram。同样的fifo也是。但是换成使用DC综合时,数字IC里面对于SRAM和fifo如果像这样设计,则会用触发器去综合组成sram和fifo。我想请问下,在数字IC中如何将sram和fifo加入到电路设计中,而不是综合器用触发器来组成。需要添加什么库?有什么介绍资料吗?求解答!!!!

发表于 2020-12-14 05:32:58 | 显示全部楼层
SRAM, dual-port SRAM based FIFO取决于工艺库,标准元库商家是否提供memory compiler。 SRAM不是综合出来的,是直接例化的。 很多工艺库是没有memory compiler的,只能用FF作为存储元件。
发表于 2020-12-14 14:26:58 | 显示全部楼层
SRAM是需要额外花钱买的IP,用Synopysys的比较多,需要有对应memory compiler工具生成所需要的SRAM类型
发表于 2020-12-14 15:22:39 | 显示全部楼层
路过学习 很实用 谢谢分享
发表于 2021-4-2 16:50:28 | 显示全部楼层
谢谢分享
发表于 2021-4-13 16:37:48 | 显示全部楼层
新手学习中。
发表于 2023-1-10 19:36:16 | 显示全部楼层
感谢分享
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

站长推荐 上一条 /2 下一条

×

小黑屋| 关于我们| 联系我们| 在线咨询| 隐私声明| EETOP 创芯网
( 京ICP备:10050787号 京公网安备:11010502037710 )

GMT+8, 2024-5-22 19:31 , Processed in 0.028192 second(s), 8 queries , Gzip On, Redis On.

eetop公众号 创芯大讲堂 创芯人才网
快速回复 返回顶部 返回列表