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

Проблема в ISE 13.1

ISE 13.1, DSP Edition.

В проекте есть такой кусок:

 

parameter BLOCK_MAX_SIZE = 2047;

parameter PARITY_MAX_SIZE = 1023;

 

//memory

 

reg [1:0] buffer_in[0:BLOCK_MAX_SIZE];

reg [1:0] buf_after_s1[0:BLOCK_MAX_SIZE];

reg [1:0] buf_after_s2[0:BLOCK_MAX_SIZE];

reg parity1[0:PARITY_MAX_SIZE];

reg parity2[0:PARITY_MAX_SIZE];

 

При симуляции и тестировании все работает замечательно, при имплементации на синтезе выдает такое:

 

Found 2048x2-bit single-port RAM <Mram_buffer_in> for signal <buffer_in>.

Found 2048x2-bit dual-port RAM <Mram_buf_after_s1> for signal <buf_after_s1>.

Found 2048x2-bit dual-port RAM <Mram_buf_after_s2> for signal <buf_after_s2>.

Found 1024x1-bit single-port RAM <Mram_parity1> for signal <parity1>.

Found 1024x1-bit dual-port RAM <Mram_parity2> for signal <parity2>.

 

......

 

FATAL_ERROR:Xst:xstmacronode.c:118:1.14 - Invalid In Port Name : diB from Mram_parity2, index==-1 Process will terminate. For technical support on this issue, please open a WebCase with this project attached at http://www.xilinx.com/support.

 

Описания ошибки ни на сайте xilinx, ни в инете не нашел %)

В чем может быть дело?

 

 

Process "Synthesize - XST" failed

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


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

Дело может быть в чём угодно :). По описанию ошибки Вы ничего не сможете понять, поскольку не являетесь разработчиком XST.

 

В общем-то, такого вида ошибки - это стандартная фича Xilinx, возникают обычно тогда, когда разработчик что-то делает не так, причем так "не так", что разработчики в данном случае XST такого варианта не предусмотрели.

 

В Quartus тоже бывают, да... Но реже.

 

У Вас есть 2 варианта:

1) Вручную искать, что Вы сделали не так в настройках или (скорее всего) исходном коде. При этом, например, можно комментарить куски кода и смотреть, ушла ли ошибка.

2) Применить другой синтезатор (как вариант - другую версию ISE, но это менее мощный метод) в надежде, что другой синтезатор от Вашего кода не повиснет, а выдаст ошибку, по которой можно будет чего-нибудь понять.

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


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

ISE 13.1, DSP Edition.

В проекте есть такой кусок:

 

parameter BLOCK_MAX_SIZE = 2047;

parameter PARITY_MAX_SIZE = 1023;

 

//memory

 

reg [1:0] buffer_in[0:BLOCK_MAX_SIZE];

reg [1:0] buf_after_s1[0:BLOCK_MAX_SIZE];

reg [1:0] buf_after_s2[0:BLOCK_MAX_SIZE];

reg parity1[0:PARITY_MAX_SIZE];

reg parity2[0:PARITY_MAX_SIZE];

 

При симуляции и тестировании все работает замечательно, при имплементации на синтезе выдает такое:

 

Found 2048x2-bit single-port RAM <Mram_buffer_in> for signal <buffer_in>.

Found 2048x2-bit dual-port RAM <Mram_buf_after_s1> for signal <buf_after_s1>.

Found 2048x2-bit dual-port RAM <Mram_buf_after_s2> for signal <buf_after_s2>.

Found 1024x1-bit single-port RAM <Mram_parity1> for signal <parity1>.

Found 1024x1-bit dual-port RAM <Mram_parity2> for signal <parity2>.

 

......

 

FATAL_ERROR:Xst:xstmacronode.c:118:1.14 - Invalid In Port Name : diB from Mram_parity2, index==-1 Process will terminate. For technical support on this issue, please open a WebCase with this project attached at http://www.xilinx.com/support.

 

Описания ошибки ни на сайте xilinx, ни в инете не нашел %)

В чем может быть дело?

 

 

Process "Synthesize - XST" failed

возможно Вы случайно где-то присвоили/(не перепутали) вектора по возрастанию с векторами по убыванию

типа так:

 

pipa (0 downto 7);

или

popa (7 to 0);

 

в общем посмотрите вектора - особенно на их длину и как заданы.

 

Еще:

Если это память проверьте адресацию (счетчики и их разрядность, задание вектора). Если Вы используете циклы при создании/описании памяти, то проверьте параметры, чтобы в результате WIDTH-1 не был равен -1 или любому другому отрицательному числу

 

library IEEE;
use IEEE.std_logic_1164.all;
use IEEE.std_logic_arith.all;
use IEEE.math_real.all;

entity DualPortMemory is
generic (
DEPTH : positive;
WIDTH : positive
);
port (
-- port a (read/write)
clka : in std_logic;
ena : in std_logic;
wea : in std_logic;
addra : in std_logic_vector(integer(ceil(
log2(real(DEPTH))))-1 downto 0);
dia : in std_logic_vector(WIDTH-1 downto 0);
doa : out std_logic_vector(WIDTH-1 downto 0);
-- port b (read/write)
clkb : in std_logic;
enb : in std_logic;
web : in std_logic;
addrb : in std_logic_vector(integer(ceil(
log2(real(DEPTH))))-1 downto 0);
dib : in std_logic_vector(WIDTH-1 downto 0);
dob : out std_logic_vector(WIDTH-1 downto 0)
);
end entity DualPortMemory;

architecture rtl of DualPortMemory is

type MEM_TYPE is array(0 to DEPTH-1) of
std_logic_vector(WIDTH-1 downto 0);
signal memory : MEM_TYPE;

attribute syn_ramstyle : string;
attribute syn_ramstyle of memory : signal is "block_ram";
attribute syn_ramstyle of memory : signal is "no_rw_check";

begin

--------------------------------------
-- Port A (read/write)
--------------------------------------
p_Port_A: process( clka )
begin
if ( rising_edge(clka) ) then

if ( ena = '1' ) then
if ( wea = '1' ) then
memory( conv_integer(unsigned(addra)) ) <= dia;
end if;
doa <= memory( conv_integer(unsigned(addra)) );
end if;

end if;
end process p_Port_A;

--------------------------------------
-- Port B (read/write)
--------------------------------------
p_Port_B: process( clkb )
begin
if ( rising_edge(clkb) ) then

if ( enb = '1' ) then
if ( web = '1' ) then
memory( conv_integer(unsigned(addrb)) ) <= dib;
end if;
dob <= memory( conv_integer(unsigned(addrb)) );
end if;

end if;
end process p_Port_B;

end architecture rtl;

 

Меня на эти мысли наталкнула строка

 

index==-1 в FATAL_ERROR

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


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

reg [1:0] buffer_in[0:BLOCK_MAX_SIZE];

я бы имя поменял..

p.s.может быть я параноик,но это ведь не значит, что за нами не следят?!

 

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


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

reg [1:0] buffer_in[0:BLOCK_MAX_SIZE];

reg [1:0] buf_after_s1[0:BLOCK_MAX_SIZE];

reg [1:0] buf_after_s2[0:BLOCK_MAX_SIZE];

reg parity1[0:PARITY_MAX_SIZE];

reg parity2[0:PARITY_MAX_SIZE];

 

 

Нафига обратное индексирование массива, то есть [0:BLOCK_MAX_SIZE], а не [bLOCK_MAX_SIZE:0]?

Нафига reg parity1[0:PARITY_MAX_SIZE], а не reg [0:PARITY_MAX_SIZE] parity1, или даже reg [PARITY_MAX_SIZE:0] parity1?

Я уверен, что ваш код можно переписать попрямее.

 

Такой ваш код сожрёт разве что Sinplify.

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


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

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

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

Гость
Ответить в этой теме...

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

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

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

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

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

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