Вывод истинного двухпортового ОЗУ (совместимого с Xilinx и Intel) в Verilog - PullRequest
0 голосов
/ 20 февраля 2020

Я пытался написать свой собственный настоящий двухпортовый модуль памяти, надеясь, что он будет выводиться как 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-поколения. Спасибо

1 Ответ

1 голос
/ 20 февраля 2020

Я не думаю, что # 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 Synthesis' do c. Для TDP BRAM, смотрите «Методы кодирования HDL RAM».

В качестве альтернативы, если вы не возражаете против того, чтобы быть заблокированным в Xilinx, вы можете использовать модуль xpm_memory_tdpram.

...