DSP

如何用 verilog 综合出 RAM 和 ROM

2019-07-13 18:39发布

如何用 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)