【问题标题】:Inferring a True Dual Port RAM (Xilinx and Intel compatible) in Verilog在 Verilog 中推断真正的双端口 RAM(Xilinx 和 Intel 兼容)
【发布时间】:2020-02-20 08:22:12
【问题描述】:

我尝试编写自己的真正双端口内存模块,希望它能推断为 BRAM:

module dp_async_ram (clk, rst, rd0, rd1, wr0, wr1, in1, in0, out1,out0, addr0, addr1);
  parameter DEPTH = 16;
  parameter WIDTH = 8;
  parameter ADDR = 4;

  input clk, rst;
  input rd0, rd1;
  input wr0, wr1;
  input [WIDTH-1:0] in0, in1;
  input [ADDR-1:0] addr0, addr1;

  output [WIDTH-1:0] out0, out1;

  //Define Memory
  logic [WIDTH-1:0] mem [0:DEPTH-1];
  logic [WIDTH-1:0] data0, data1;

  //Write Logic
  always_ff @ (posedge clk) begin
      if (wr0 && ~rd0)
        mem[addr0] <= in0;
      if (wr1 && ~rd1)
        mem[addr1] <= in1;
      if (rd0 && ~wr0)
        data0 <= mem[addr0];
      if (rd1 && ~wr1)
        data1 <= mem[addr1];
  end

  //Read Logic
  assign out0 = (rd0 && (!wr0))? data0: {WIDTH{1'bz}}; //High Impedance Mode here
  assign out1 = (rd0 && (!wr0))? data1: {WIDTH{1'bz}};


endmodule // dp_async_ram

在 Vivado 中运行综合后,报告中显示以下内容:

 WARNING: [Synth 8-4767] Trying to implement RAM 'mem_reg' in registers. Block RAM or DRAM implementation is not possible; see log for reasons.
Reason is one or more of the following :
    1: RAM has multiple writes via different ports in same process. If RAM inferencing intended, write to one port per process. 
    2: Unable to determine number of words or word size in RAM. 
    3: No valid read/write found for RAM. 
RAM "mem_reg" dissolved into registers

数字 1 最让我印象深刻,因为这意味着无法编写便携式真正的双端口 BRAM。我想知道我是否错了,或者我是否应该只使用 ip 生成。谢谢

【问题讨论】:

    标签: verilog fpga xilinx intel-fpga


    【解决方案1】:

    我不认为#1 意味着你不能进行多次写入——只是你不能从同一个进程中进行。尝试将它们分开:

    always_ff @ (posedge clk) begin
        if (wr0 && ~rd0)
            mem[addr0] <= in0;
        if (rd0 && ~wr0)
            data0 <= mem[addr0];
    end
    always_ff @ (posedge clk) begin
        if (wr1 && ~rd1)
            mem[addr1] <= in1;
        if (rd1 && ~wr1)
            data1 <= mem[addr1];
    end
    

    有关如何在 Vivado 中推断事物的更多信息,请查看“UG901 Vivado 综合”文档。对于 TDP BRAM,请查看“RAM HDL 编码技术”。

    或者,如果您不介意被赛灵思锁定,您可以使用xpm_memory_tdpram 模块。

    【讨论】:

    • 啊,我明白了。在这种情况下,进程是“始终”块的另一个术语。感谢您的帮助。
    • mem 由两个always_ff 分配不应该是合法的。 SystemVerilog LRM 第 9.2.2.4 节“always_ff 过程中赋值左侧的变量,包括来自被调用函数内容的变量,不得由任何其他进程写入。软件工具应执行额外检查如果always_ff 过程中的行为不代表顺序逻辑,则发出警告。”从技术上讲,将其更改为always 使其对于 LRM 角度而言是合法的,但综合工具通常要求寄存器仅由一个进程分配。
    • 好点,always 更好。 Xilinx 综合工具会将其推断为双端口 RAM,这是它首选的模板。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多