在Verilog中可以合成$ readmem吗?

use*_*035 9 verilog synthesis

我正在尝试在FPGA上实现一个微控制器,我需要为它的程序提供一个ROM.如果我使用$ readmemb,那么它会被正确地合成到ROM吗?如果没有,这样做的标准方法是什么?

mrk*_*rkj 18

我会修改George的答案,说它取决于合成工具是否$readmemb可合成.

Altera 推荐的HDL编码样式指南包括示例10-31(第10-38页),其中演示了一个ROM $readmemb(从下面再现):

module dual_port_rom (
   input [(addr_width-1):0] addr_a, addr_b,
   input clk, 
   output reg [(data_width-1):0] q_a, q_b
);
   parameter data_width = 8;
   parameter addr_width = 8;
   reg [data_width-1:0] rom[2**addr_width-1:0];
   initial // Read the memory contents in the file
           // dual_port_rom_init.txt. 
   begin
      $readmemb("dual_port_rom_init.txt", rom);
   end
   always @ (posedge clk)
   begin
      q_a <= rom[addr_a];
      q_b <= rom[addr_b];
   end
endmodule
Run Code Online (Sandbox Code Playgroud)

同样,Xilinx的XST用户指南指出:

$readmemb$readmemh系统任务可以用来初始化块存储器.有关更多信息,请参阅:

从外部文件编码示例初始化RAM

使用$readmemb二进制和$readmemh十六进制表示.为避免XST与仿真器行为之间可能存在差异,Xilinx®建议您在这些系统任务中使用索引参数.请参阅以下编码示例.

$readmemb("rams_20c.data",ram, 0, 7);