story · 2020年06月15日

Verilog设计与逻辑综合实例解析(Memory)

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 == 1’b0)  memory[addr] <= datai ;
               else if(rd_n == 1’b0) 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
end

上面的多维数组最终会被合成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可扫描。

本文转载自公众号:芯片数字实验室
原文链接:
https://mp.weixin.qq.com/s/xZHE7iv1xZSgmfPHMLwdrA
未经作者同意,请勿转载!

推荐阅读
想了解更多内容,欢迎关注芯片数字实验室专栏
推荐阅读
关注数
12313
内容数
219
前瞻性的眼光,和持之以恒的学习~
目录
极术微信服务号
关注极术微信号
实时接收点赞提醒和评论通知
安谋科技学堂公众号
关注安谋科技学堂
实时获取安谋科技及 Arm 教学资源
安谋科技招聘公众号
关注安谋科技招聘
实时获取安谋科技中国职位信息