我们能合成一个简单的通用内存吗?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了我们能合成一个简单的通用内存吗?相关的知识,希望对你有一定的参考价值。

我正在尝试使用设计编译器中的简单通用内存模型进行综合。

但我确实发现一些错误信息如下,

我使用简单的通用内存模型如下所示

module RAM_generic
 (clk,
 enb,
 wr_din,
 wr_addr,
 wr_en,
 rd_addr,
 rd_dout);

 parameter AddrWidth = 1;
 parameter DataWidth = 1;

 input clk;
 input enb;
 input signed [DataWidth - 1:0] wr_din;
 input [AddrWidth - 1:0] wr_addr;
 input wr_en;
 input [AddrWidth - 1:0] rd_addr;
 output signed [DataWidth - 1:0] rd_dout;

 reg [DataWidth - 1:0] ram [2**AddrWidth - 1:0];
 reg [DataWidth - 1:0] data_int;


 always @(posedge clk)
 begin
 if (enb == 1'b1) begin
 if (wr_en == 1'b1) begin
 ram[wr_addr] <= wr_din;
 end
 data_int <= ram[rd_addr];
 end
 end

 assign rd_dout = data_int;
endmodule

我想知道我们不能合成一个简单的通用内存吗?如果是,我应该怎么做才能合成通用内存合成错误?

答案

是的你可以。

在FPGA中,单端口或双端口存储器将映射到内部存储器结构上。 (至少如果你使用正确的语法!寻找FPGA应用程序说明如何做到这一点)

在ASIC中,它将由寄存器构成。几年前我需要一个小的三端口存储器(两个读取和一个写入端口全部同时),它很好。大多数FIFO都有一个存储器,其中90%是由寄存器构成的。

您的代码缺少'endmodule'。我没有发现任何其他明显的错误。

一些技巧:

  • 使用((1 << AddrWidth)-1)也可以在旧式Verilog中使用。
  • 对于内存,我不会使用默认宽度/深度1。你得到的[0:0]结构有效,但是为什么你要这样做? 8x8更有可能被使用。
  • 不应签署通用内存。按照惯例,通用内存是无符号的。
  • 按惯例,参数全部为大写。 (至少在我工作的每家公司都是)

以上是关于我们能合成一个简单的通用内存吗?的主要内容,如果未能解决你的问题,请参考以下文章

标压和低压内存条频率相同,笔记本是低压内存条,能安装标压内存条通用吗?

有没有办法将2个非常相似的代码片段组合成一个函数并重复?

带有 UI 和内存泄漏的保留片段

VsCode 代码片段-提升研发效率

可以在不使用通用寄存器的情况下将 8 位从 XMM 寄存器移动到内存吗?

结束一个片段