Перейти к содержанию
    

Как сгенерировать несколько модулей памяти (больше 20)

Попробовал сделать следующим образом

library ieee;
use ieee.std_logic_1164.all;
library work;    

package Const_type is
type mem_type is array ( (2**7)-1 downto 0 ) of std_logic_vector(7 downto 0);
type my_array is array (0 to 10) of std_logic_vector (7 downto 0);
type my_array0 is array (0 to 10) of std_logic;
type my_mem_array is array (0 to 10) of mem_type;
end package;

library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;
use work.Const_type.all;

entity parametr_blockRAM is

port (
    -- Port A
    a_clk   : in  std_logic;
    a_wr    : in my_array0;
    a_addr  : in my_array;
    a_din   : in my_array;
    a_dout  : out my_array;
     
    -- Port B
    b_clk   : in  std_logic;
    b_wr    : in my_array0;
    b_addr  : in my_array;
    b_din   : in my_array;
    b_dout  : out my_array
);
end parametr_blockRAM;

architecture rtl of parametr_blockRAM is
    -- Shared memory
    shared variable mem : my_mem_array;
begin

-- Port A
process(a_clk)
begin
    if(a_clk'event and a_clk='1') then
for i in 0 to 10 loop      
        if(a_wr(i)='1') then
            mem(i)(conv_integer(a_addr(i))) := a_din(i);
        end if;
        a_dout(i) <= mem(i)(conv_integer(a_addr(i)));
end loop;          
    end if;
end process;

-- Port B
process(b_clk)
begin
    if(b_clk'event and b_clk='1') then
for i in 0 to 10 loop      
        if(b_wr(i)='1') then
            mem(i)(conv_integer(b_addr(i))) := b_din(i);
        end if;
        b_dout(i) <= mem(i)(conv_integer(b_addr(i)));
end loop;          
    end if;
end process;

end rtl;

 

выдается ошибка (ругается на 2 процесс - Port B )

Error (10028): Can't resolve multiple constant drivers for net "mem[0][127][7]" at parametr_blockRAM.vhd(57)

Error (10029): Constant driver at parametr_blockRAM.vhd(44)

Error (10028): Can't resolve multiple constant drivers for net "mem[0][127][6]" at parametr_blockRAM.vhd(57)

Error (10028): Can't resolve multiple constant drivers for net "mem[0][127][5]" at parametr_blockRAM.vhd(57)

Error (10028): Can't resolve multiple constant drivers for net "mem[0][127][4]" at parametr_blockRAM.vhd(57)

Error (10028): Can't resolve multiple constant drivers for net "mem[0][127][3]" at parametr_blockRAM.vhd(57)

Error (10028): Can't resolve multiple constant drivers for net "mem[0][127][2]" at parametr_blockRAM.vhd(57)

Error (10028): Can't resolve multiple constant drivers for net "mem[0][127][1]" at parametr_blockRAM.vhd(57)

Error (10028): Can't resolve multiple constant drivers for net "mem[0][127][0]" at parametr_blockRAM.vhd(57)

Error (10028): Can't resolve multiple constant drivers for net "mem[0][126][7]" at parametr_blockRAM.vhd(57)

Error (10028): Can't resolve multiple constant drivers for net "mem[0][126][6]" at parametr_blockRAM.vhd(57)

Error (10028): Can't resolve multiple constant drivers for net "mem[0][126][5]" at parametr_blockRAM.vhd(57)

Error (10028): Can't resolve multiple constant drivers for net "mem[0][126][4]" at parametr_blockRAM.vhd(57)

Error (10028): Can't resolve multiple constant drivers for net "mem[0][126][3]" at parametr_blockRAM.vhd(57)

Error (10028): Can't resolve multiple constant drivers for net "mem[0][126][2]" at parametr_blockRAM.vhd(57)

Error (10028): Can't resolve multiple constant drivers for net "mem[0][126][1]" at parametr_blockRAM.vhd(57)

Error (10028): Can't resolve multiple constant drivers for net "mem[0][126][0]" at parametr_blockRAM.vhd(57)

Error (10028): Can't resolve multiple constant drivers for net "mem[0][125][7]" at parametr_blockRAM.vhd(57)

Error (10028): Can't resolve multiple constant drivers for net "mem[0][125][6]" at parametr_blockRAM.vhd(57)

 

Или как описать с минимальным количеством строк несколько однотипных памятей (true dual port ram dual clock)?

Хотя бы намекните, пожалуйста

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Или как описать с минимальным количеством строк несколько однотипных памятей?

Хотя бы намекните, пожалуйста

  bit [3 : 0] pipa [4][4]; 

  always_ff @(posedge iclk) begin
     for(int i = 0; i < 4; i++) begin
         rpopa <= pipa[i][raddr];
         if (write) 
           pipa[i][waddr] <= wpopa[i];
     end 
  end

 

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

  bit [3 : 0] pipa [4][4]; 

  always_ff @(posedge iclk) begin
     for(int i = 0; i < 4; i++) begin
         rpopa <= pipa[i][raddr];
         if (write) 
           pipa[i][waddr] <= wpopa[i];
     end 
  end

спасибо...

Но мне кажется для двупортовой памяти (настоящей - true dual port ram dual clock), такой вариант не подходит (мое мнение будет Error (10028): Can't resolve multiple constant drivers for net - для Port B )

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Но мне кажется для двупортовой памяти (настоящей - true dual port ram dual clock), такой вариант не подходит (мое мнение будет Error (10028): Can't resolve multiple constant drivers for net - для Port B )

Похоже что вы правы. Вот ка....шка, только через инстанс модуля тогда.

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Похоже что вы правы. Вот ка....шка, только через инстанс модуля тогда.

Думал уйти от этого варианта, но не тут то было ...

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Думал уйти от этого варианта, но не тут то было ...

А если попробовать generate, причём shared variable запихнуть внутрь generate block, создавая, таким образом, индивиндуальные экземпляры mem_array для каждого модуля памяти?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

не помогает даже объявление памяти локально в генерейте :(

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Вот самый лаконичный способ:

module array_of_rams #(
    parameter    N = 20,
    parameter    DW = 8,
    parameter    AW = 7
)(
    input  logic            clk,
    input  logic            we[N],
    input  logic [AW-1:0]    adr[N],
    input  logic [DW-1:0]    din[N],
    output logic [DW-1:0]    dout[N]
);

genvar i;
generate
    for(i=0; i<N; i++) begin : block_ram
        logic [DW-1:0]        ram[2**AW] = '{default : '0};
        
        always @(posedge clk) begin
            if(we[i])
                ram[adr[i]] <= din[i];
            dout[i]    <= ram[adr[i]];
        end
    end : block_ram
endgenerate

endmodule

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Вот самый лаконичный способ:

Только, с темой и вопросом никак не связанный. Где тут "true dual port" и "dual clock" ?

 

Вариантов нет, только инферрить модули в цикле generate.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Окей, исправить 5 секунд:

module array_of_rams #(
    parameter    N = 20,
    parameter    DW = 8,
    parameter    AW = 7
)(
    input  logic            clk1,
    input  logic            we1[N],
    input  logic [AW-1:0]    adr1[N],
    input  logic [DW-1:0]    din1[N],
    output logic [DW-1:0]    dout1[N],
    input  logic            clk2,
    input  logic            we2[N],
    input  logic [AW-1:0]    adr2[N],
    input  logic [DW-1:0]    din2[N],
    output logic [DW-1:0]    dout2[N]
);

genvar i;
generate
    for(i=0; i<N; i++) begin : block_ram
        logic [DW-1:0]        ram[2**AW] = '{default : '0};
        
        always_ff @(posedge clk1) begin : port1
            if(we1[i])
                ram[adr1[i]] <= din1[i];
            dout1[i]    <= ram[adr1[i]];
        end : port1
        
        always_ff @(posedge clk2) begin : port2
            if(we2[i])
                ram[adr2[i]] <= din2[i];
            dout2[i]    <= ram[adr2[i]];
        end : port2
    end : block_ram
endgenerate

endmodule

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Окей, исправить 5 секунд:

module array_of_rams #(
    parameter    N = 20,
    parameter    DW = 8,
    parameter    AW = 7
)(
    input  logic            clk1,
    input  logic            we1[N],
    input  logic [AW-1:0]    adr1[N],
    input  logic [DW-1:0]    din1[N],
    output logic [DW-1:0]    dout1[N],
    input  logic            clk2,
    input  logic            we2[N],
    input  logic [AW-1:0]    adr2[N],
    input  logic [DW-1:0]    din2[N],
    output logic [DW-1:0]    dout2[N]
);

genvar i;
generate
    for(i=0; i<N; i++) begin : block_ram
        logic [DW-1:0]        ram[2**AW] = '{default : '0};
        
        always_ff @(posedge clk1) begin : port1
            if(we1[i])
                ram[adr1[i]] <= din1[i];
            dout1[i]    <= ram[adr1[i]];
        end : port1
        
        always_ff @(posedge clk2) begin : port2
            if(we2[i])
                ram[adr2[i]] <= din2[i];
            dout2[i]    <= ram[adr2[i]];
        end : port2
    end : block_ram
endgenerate

endmodule

Ошибки как и мои - результат синтеза Вашего описания:

 

Error (10028): Can't resolve multiple constant drivers for net "block_ram[0].ram[0][7]" at parametr_blockram.v(29)

Error (10029): Constant driver at parametr_blockram.v(23)

Error (10028): Can't resolve multiple constant drivers for net "block_ram[0].ram[0][6]" at parametr_blockram.v(29)

Error (10028): Can't resolve multiple constant drivers for net "block_ram[0].ram[0][5]" at parametr_blockram.v(29)

Error (10028): Can't resolve multiple constant drivers for net "block_ram[0].ram[0][4]" at parametr_blockram.v(29)

Error (10028): Can't resolve multiple constant drivers for net "block_ram[0].ram[0][3]" at parametr_blockram.v(29)

Error (10028): Can't resolve multiple constant drivers for net "block_ram[0].ram[0][2]" at parametr_blockram.v(29)

Error (10028): Can't resolve multiple constant drivers for net "block_ram[0].ram[0][1]" at parametr_blockram.v(29)

Error (10028): Can't resolve multiple constant drivers for net "block_ram[0].ram[0][0]" at parametr_blockram.v(29)

Error (10028): Can't resolve multiple constant drivers for net "block_ram[0].ram[1][7]" at parametr_blockram.v(29)

Error (10028): Can't resolve multiple constant drivers for net "block_ram[0].ram[1][6]" at parametr_blockram.v(29)

Error (10028): Can't resolve multiple constant drivers for net "block_ram[0].ram[1][5]" at parametr_blockram.v(29)

Error (10028): Can't resolve multiple constant drivers for net "block_ram[0].ram[1][4]" at parametr_blockram.v(29)

Error (10028): Can't resolve multiple constant drivers for net "block_ram[0].ram[1][3]" at parametr_blockram.v(29)

Error (10028): Can't resolve multiple constant drivers for net "block_ram[0].ram[1][2]" at parametr_blockram.v(29)

Error (10028): Can't resolve multiple constant drivers for net "block_ram[0].ram[1][1]" at parametr_blockram.v(29)

Error (10028): Can't resolve multiple constant drivers for net "block_ram[0].ram[1][0]" at parametr_blockram.v(29)

Error (10028): Can't resolve multiple constant drivers for net "block_ram[0].ram[2][7]" at parametr_blockram.v(29)

Error (10028): Can't resolve multiple constant drivers for net "block_ram[0].ram[2][6]" at parametr_blockram.v(29)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Окей, исправить 5 секунд:

И что? Категорически нельзя в разных always заносить в одну переменную какие либо значения. Именно поэтому нельзя описать dual clock память на HDL.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

И что? Категорически нельзя в разных always заносить в одну переменную какие либо значения. Именно поэтому нельзя описать dual clock память на HDL.

мне кажется, даже если упростить задачу сделать настоящую двупортовую память, но с одним клоком - все равно не получиться

Т.к. 2 процесса/always

 

upd

Проверил с одним клоком на своем описании и на ~Elrond~ - ошибки (что и требовалось доказать)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Всё получилось, но при помощи вложенного модуля. Почему не получается в одном - не знаю, видимо очередной тупняк квартуса.

module dpram #(
    parameter    DW = 8,
    parameter    AW = 7
)(
    input  logic            clk1,
    input  logic            we1,
    input  logic [AW-1:0]    adr1,
    input  logic [DW-1:0]    din1,
    output logic [DW-1:0]    dout1,
    input  logic            clk2,
    input  logic            we2,
    input  logic [AW-1:0]    adr2,
    input  logic [DW-1:0]    din2,
    output logic [DW-1:0]    dout2
);

(* ramstyle = "no_rw_check" *) logic [DW-1:0]        ram[2**AW] = '{default : '0};
always_ff @(posedge clk1) begin : port1
    if(we1)
        ram[adr1] <= din1;
    dout1    <= ram[adr1];
end : port1

always_ff @(posedge clk2) begin : port2
    if(we2)
        ram[adr2] <= din2;
    dout2    <= ram[adr2];
end : port2

endmodule


module array_of_rams #(
    parameter    N = 20,
    parameter    DW = 8,
    parameter    AW = 7
)(
    input  logic            clk1,
    input  logic            we1[N],
    input  logic [AW-1:0]    adr1[N],
    input  logic [DW-1:0]    din1[N],
    output logic [DW-1:0]    dout1[N],
    input  logic            clk2,
    input  logic            we2[N],
    input  logic [AW-1:0]    adr2[N],
    input  logic [DW-1:0]    din2[N],
    output logic [DW-1:0]    dout2[N]
);

genvar i;
generate
    for(i=0; i<N; i++) begin : block_ram
        dpram #(
            .DW        (DW),
            .AW        (AW))
        dpram (
            .clk1,
            .we1    (we1[i]),
            .adr1    (adr1[i]),
            .din1    (din1[i]),
            .dout1    (dout1[i]),
            .clk2,
            .we2    (we2[i]),
            .adr2    (adr2[i]),
            .din2    (din2[i]),
            .dout2    (dout2[i])        
        );
    end : block_ram
endgenerate

endmodule

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

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

Гость
К сожалению, ваш контент содержит запрещённые слова. Пожалуйста, отредактируйте контент, чтобы удалить выделенные ниже слова.
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...