如何用 verilog 综合出 RAM 和 ROM

如何用 verilog 综合出 RAM 和 ROM (使用 Block RAM)

  (2006-07-28 10:41:20)
  分类: verilog

之前看过一个 xilinx 的分析报告,说最早的 FPGA 主要用作逻辑接口,后来集成度高了,逐渐开始被用来做 DSP。作逻辑接口的时候,对 RAM 或者 ROM 的需求不明显,所以就用多个逻辑单元的寄存器,组合成分布式的存储,这样做既浪费了逻辑单元,而且拼凑出来的存储器的速度也很低。所以当有需求拿 FPGA 做 DSP 开始,FPGA 就开始集成专用 RAM 了。

我开始用的第一块 FPGA 是 altera 的 Max10K10, 已经集成了三块专用 RAM,每块 256 bytes。当时用 schematic 的方式输入,拿一块做了 51 core 的 register file。

在设计中引入专用 RAM,面临的问题包括:

  1. 如何写可综合代码
  2. 如果是 ROM,如何初始化内存单元的值
  3. 如何参与仿真
可综合出 RAM 或 ROM 的代码

按照 xilinx 和 synplify 的说法,异口同声要求实例化 Block RAM。这样做好处是效率高,可以肯定综合结果是什么。坏处当然是没有移植性,拿到 altera 就玩不转。所以 xilinx 网站上只有这一种方式。搁着 synplify 这么好的综合工具,不让它去自动综合也对不起它啊。

综合 RAM 比较简单:
reg [width-1:0] ram [length-1:0];
这样就 ok。前提是 length 要足够长,如果只有很少的单元,它还是会综合到逻辑单元里头。如果希望让 synplify 更智能一点,就加上指示:
 
手册里面还有更多的细节。
初始化ROM

把 $readmem 放在 initial 里面可以初始化 RAM,不过这仅限于仿真。synplify 根本就 ignore initial,所以综合器还都不支持用 $readmem 初始化存储器。synplify 提供更聪明的办法综合 ROM。写法如下:

reg [7:0] data_out ;
always @(posedge clk)
  if (en)
    case (address)
      8'd0 : data_out = 8'd101;
      8'd1 : data_out = 8'd251;
      8'd2 : data_out = 8'd112;


如果综合成功,会提示:
Packed ROM ... to Block SelectRAM
综合的结果 Technology View 截到下图,点击查看完整图:

以上的方法综合的结果可以直接支持仿真。如何用 <wbr>verilog <wbr>综合出 <wbr>RAM <wbr>和 <wbr>ROM <wbr>(使用 <wbr>Block <wbr>RAM)

 

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值