Maverick_ 15 26 марта, 2015 Опубликовано 26 марта, 2015 · Жалоба Попробовал сделать следующим образом 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)? Хотя бы намекните, пожалуйста Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
des00 25 26 марта, 2015 Опубликовано 26 марта, 2015 · Жалоба Или как описать с минимальным количеством строк несколько однотипных памятей? Хотя бы намекните, пожалуйста 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 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Maverick_ 15 26 марта, 2015 Опубликовано 26 марта, 2015 · Жалоба 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 ) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
des00 25 26 марта, 2015 Опубликовано 26 марта, 2015 · Жалоба Но мне кажется для двупортовой памяти (настоящей - true dual port ram dual clock), такой вариант не подходит (мое мнение будет Error (10028): Can't resolve multiple constant drivers for net - для Port B ) Похоже что вы правы. Вот ка....шка, только через инстанс модуля тогда. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Maverick_ 15 26 марта, 2015 Опубликовано 26 марта, 2015 · Жалоба Похоже что вы правы. Вот ка....шка, только через инстанс модуля тогда. Думал уйти от этого варианта, но не тут то было ... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Timmy 1 26 марта, 2015 Опубликовано 26 марта, 2015 · Жалоба Думал уйти от этого варианта, но не тут то было ... А если попробовать generate, причём shared variable запихнуть внутрь generate block, создавая, таким образом, индивиндуальные экземпляры mem_array для каждого модуля памяти? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
alexadmin 0 26 марта, 2015 Опубликовано 26 марта, 2015 · Жалоба А если вместо for loop сделать generate снаружи процесса? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
des00 25 26 марта, 2015 Опубликовано 26 марта, 2015 · Жалоба не помогает даже объявление памяти локально в генерейте :( Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ElrondTelvanni 0 26 марта, 2015 Опубликовано 26 марта, 2015 · Жалоба Вот самый лаконичный способ: 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 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
SM 0 26 марта, 2015 Опубликовано 26 марта, 2015 · Жалоба Вот самый лаконичный способ: Только, с темой и вопросом никак не связанный. Где тут "true dual port" и "dual clock" ? Вариантов нет, только инферрить модули в цикле generate. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ElrondTelvanni 0 26 марта, 2015 Опубликовано 26 марта, 2015 · Жалоба Окей, исправить 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 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Maverick_ 15 26 марта, 2015 Опубликовано 26 марта, 2015 · Жалоба Окей, исправить 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) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
SM 0 26 марта, 2015 Опубликовано 26 марта, 2015 · Жалоба Окей, исправить 5 секунд: И что? Категорически нельзя в разных always заносить в одну переменную какие либо значения. Именно поэтому нельзя описать dual clock память на HDL. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Maverick_ 15 26 марта, 2015 Опубликовано 26 марта, 2015 · Жалоба И что? Категорически нельзя в разных always заносить в одну переменную какие либо значения. Именно поэтому нельзя описать dual clock память на HDL. мне кажется, даже если упростить задачу сделать настоящую двупортовую память, но с одним клоком - все равно не получиться Т.к. 2 процесса/always upd Проверил с одним клоком на своем описании и на ~Elrond~ - ошибки (что и требовалось доказать) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ElrondTelvanni 0 26 марта, 2015 Опубликовано 26 марта, 2015 · Жалоба Всё получилось, но при помощи вложенного модуля. Почему не получается в одном - не знаю, видимо очередной тупняк квартуса. 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 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться