VHDL'de array sorunu

Başlatan yamak, 25 Nisan 2012, 05:31:56

yamak

Xilinx ISE'de VHDL ile  255 elemanlı her elemanı 8 bitten oluşan bir constant array tanımlıyorum. Bu array elemanlarının bir kısmısını girip geri kalanını da others=>"00" ile 0 yapıyorum. Eğer girdiğim eleman sayısı biraz fazlalaşırsa place&root aşamasında ise takılıp kalıyo yani o aşama hiç bitmiyo. Bunun sebebi nedir acaba daha önce böyle bi sorunla karşılaşan oldu mu?

yamak

Böyle bi sorunla karşılaşan olmadı mı?

yamak

Arkadaşlar bahsettiğim kodlar şu şekilde
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
entity inst_mem is
	port(
			clk:in std_logic;
			inst_in:in std_logic_vector(7 downto 0);
			inst_out:out std_logic_vector(31 downto 0)
		 );
end inst_mem;

architecture Behavioral of inst_mem is
	type inst_array is array (0 to 55) of std_logic_vector(7 downto 0);
	signal index:std_logic_vector(7 downto 0);
	constant instruction:inst_array:=(
												 x"3C",x"00",x"06",x"30", --movi r5,#60
												 x"05",x"00",x"01",x"30", --movi r0,#5
												 x"2F",x"00",x"24",x"04", --addi r3,r0,#47
												 x"07",x"20",x"80",x"00", --inc  r3(etiket)
												 x"04",x"18",x"80",x"00",-- mov r2,r3
	                                                                                         x"FD",x"FF",x"C4",x"28",--bne r3,r5,#-3(etiket)
												 x"64",x"00",x"87",x"34",--subi r6,r3,#100
											         others=>x"00"
												 );
begin
 
index<=inst_in;
inst_out<=instruction(conv_integer(index)+3)&instruction(conv_integer(index)+2)&instruction(conv_integer(index)+1)&instruction(conv_integer(index));
end Behavioral;

Simulasyon yaparken bi sorun yok kodlar sorunsuz çalışyo. Çünkü simulasyon için sadece syntax kontrolü yeterli oluyo. Ama fpga ye yüklemek istediğimde place&route aşamasıda takılıyo. Ya da çok uzun sürüyo ve kodda timing hatası çıkıyo. Yani benim clock u 20 mhz data path delay 29 ns çıkıyo. Fakat bne r3,r5,#-3(etiket) satırını kaldırdığımda herşey gayet güzel oluyo. Bu sorunun sebebi nedir kafayı yiyecem artık. Böyle bi sorunla karşılaşan olmadı mı?

yamak

Ben bu sorunun sebebini yanlış tespit etmişim sorun eleman sayısının fazla olmasıyla alakası yokmuş. Örneğin :
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
entity inst_mem is
	port(
			clk:in std_logic;
			inst_in:in std_logic_vector(7 downto 0);
			inst_out:out std_logic_vector(31 downto 0)
		 );
end inst_mem;

architecture Behavioral of inst_mem is
	type inst_array is array (0 to 255) of std_logic_vector(7 downto 0);
	signal inst_out_reg:std_logic_vector(31 downto 0);
	signal index:std_logic_vector(7 downto 0);
	constant instruction:inst_array:=(
												 x"3C",x"00",x"06",x"30", --movi r5,#60
												 x"05",x"00",x"01",x"30", --movi r0,#5
												 x"2F",x"00",x"24",x"04", --addi r3,r0,#47
												 x"07",x"20",x"80",x"00", --inc  r3(etiket)
												 x"04",x"18",x"80",x"00",-- mov r2,r3
	                                                                                       --x"FD",x"FF",x"C4",x"28",--bne r3,r5,#-3(etiket)
												 x"FD",x"FF",x"C4",x"28",--bne r3,r5,#-3(etiket)
												 x"64",x"00",x"87",x"34",--subi r6,r3,#100
												 ------------------------------------
												 x"3C",x"00",x"06",x"30", --movi r5,#60
												 x"05",x"00",x"01",x"30", --movi r0,#5
												 x"2F",x"00",x"24",x"04", --addi r3,r0,#47
												 x"07",x"20",x"80",x"00", --inc  r3(etiket)
												 x"04",x"18",x"80",x"00",-- mov r2,r3
	                                                                                     --  x"FD",x"FF",x"C4",x"28",--bne r3,r5,#-3(etiket)
												 x"64",x"00",x"87",x"34"--subi r6,r3,#100
												 -------------------------------------------
											        others=>x"00"
												 );
begin
 
index<=inst_in;
inst_out_reg<=instruction(conv_integer(index)+3)&instruction(conv_integer(index)+2)&instruction(conv_integer(index)+1)&instruction(conv_integer(index));
inst_out<=inst_out_reg;
end Behavioral;

Bu haliyle sorunsuz çalışyıo.Ama --bne r3,r5,#-3(etiket) satırlarından herhangi birini aktifleştirince place&route aşamasında ISE tıkanıp kalıyo. Bunun sebebi nedir acaba.

pic365

Ben başlık açıldığı zaman bu kodları ISE 13.4'te denemiştim, Place & Route'u sorunsuz bir şekilde geçmişti.

yamak

Hocam acab diğer modüllerle mi alakalı bu durum. inst_in 32 bitlik PC nin ilk 8 bitini bağlıyorum. Bundan dolayı bi sorun olur mu acaba.

pic365

Alıntı yapılan: yamak - 09 Mayıs 2012, 20:20:31
Hocam acab diğer modüllerle mi alakalı bu durum. inst_in 32 bitlik PC nin ilk 8 bitini bağlıyorum. Bundan dolayı bi sorun olur mu acaba.
Olabilir, bilmiyorum. Yalnız şu da var; bazen RTL'deki küçük bir değişiklik sentez süresini çok fazla etkileyebiliyor. Place & Route ayarlarını biraz gevşetmeyi deneyebilirsin. Örneğin Extra Effort ayarını "None" yapıp, Effort Level'ı "Standard"a çekmek gibi... Map ayarlarında "Starting Placer Cost Table"ı da değiştirebilirsin, belki devre biraz farklı map edilince sorun ortadan kalkar.

yamak

Hocam şöyle bişey yaptım düzeldi. Şimdi bi üst modülde bu inst_out u onun da bi üst modülünde kullanılacak olan data_out diye bi sinyale atıyodum.Bunu iki hamlede yapmıştım ilk başka bi sinyale atıp oradan çıkış sinyali olan data_out atmıştım. Bunu tek hamlede yapınca düzeldi. Bu şekilde düzelmesine bir kaç yorum yaptım ama tam olarak mantığı oturtamadım.Neden böyle bişey olmuş olabilir sizce.

pic365

#8
Alıntı yapılan: yamak - 10 Mayıs 2012, 11:53:48
Hocam şöyle bişey yaptım düzeldi. Şimdi bi üst modülde bu inst_out u onun da bi üst modülünde kullanılacak olan data_out diye bi sinyale atıyodum.Bunu iki hamlede yapmıştım ilk başka bi sinyale atıp oradan çıkış sinyali olan data_out atmıştım. Bunu tek hamlede yapınca düzeldi. Bu şekilde düzelmesine bir kaç yorum yaptım ama tam olarak mantığı oturtamadım.Neden böyle bişey olmuş olabilir sizce.

Anladığım kadarıyla yaptığın değişikliğin normalde sentezlenen devreyi değiştirmemesi lazım. Fakat koddaki küçük değişiklik devreyi muhtemelen değiştirmiş. Sentezde bazı işlemler "random" olarak ilerlediği için devrenin önceki halinde bazı path'lerde P&R'ın daha fazla iterasyon yapması gerekmiş olabilir. Yani olay şansa bağlı. Önceki mesajda bahsettiğim "Starting Placer Cost Table" da random gerçekleşen olayların algoritmasını değiştiriyor. Bu sebeple aynı koddan farklı performansta devreler sentezleniyor. SmartXplorer ile sadece cost table'ın değiştiği birden fazla sentez yaparsan hem devrenin performansının hem de sentez süresinin farklı olduğu sonuçlar alabilirsin.

yamak

Hocam map aşamasında şu tarz uyarılar oluyo bunlar neyden kaynaklanıyo ve nasıl giderilir bir fikriniz var mı?
Alıntı YapThe function generator
   CPU/Controller/Alu_dec/alu_ctr_2_or0001 failed to merge with F5 multiplexer
   CPU/Data_Path/ALU/result_in<0>150_SW0.  There is a conflict for the FXMUX.
   The design will exhibit suboptimal timing.

pic365

Daha önce hiç böyle bir hata ile karşılaşmadım ama biraz arama yaptım, şöyle bir şey çıktı.

http://www.nalanda.nitc.ac.in/industry/appnotes/xilinx/documents/techdocs/9002.htm
Burada diyor ki, RAM'in yazma portunun clock'u (WCLK) ground'a bağlanınca Virtex'te böyle bir uyarı alınmış. Belki de buna benzer bir sorun var.