logo elektroda
logo elektroda
X
logo elektroda
REKLAMA
REKLAMA
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

Czy zmiana kolejności instrukcji sekwencyjnych w automacie SRAM pomoże?

zlootawy 04 Gru 2007 23:15 2086 13
REKLAMA
  • #1 4552858
    zlootawy
    Poziom 10  
    Posty: 54
    Witam,
    nie jestem pewien czy ide z rozumowaniem w dobra strone. Sytuacja wyglada nastepujaco: mam komponent obslugujacy SRAM. No i do testow stworzylem automat, ktory steruje komponentem.

    Mecze sie juz dlugo.. Odnosze wrazenie, ze uklad "czasem" dziala. Byc moze to przypadek ale czy to mozliwe, aby pomogla zamiana kolejnosci instrukcji sekwencyjnych?

    Kod automatu do testu wyglada mniej wiecej tak (fragment):

    process( sig_zegar_nowy,P_I_RESET_N ) 
        variable v_state : natural := 0;
    	 variable v_cnt : natural ;
      begin
       if P_I_RESET_N = '0' then
    	  v_state := 0 ;
     	elsif sig_zegar_nowy'event and sig_zegar_nowy = '0' then
    
         case v_state is
    	    when 0 => -- idle state 
    	SIG_COUNTER_SET <= '1';
    	     
    	      SIG_WR_N     <= '0' ;
    	      SIG_BENA_N   <= '1' ;
    	      SIG_ADDR     <= "0000000000000111100" ; --SIG_ADDR     <= ( others => '0' ) ;
    	      SIG_I_DATA0  <= ( others => '0' ) ;
    	      SIG_I_DATA1  <= ( others => '0' ) ;
    	      SIG_I_DATA2  <= ( others => '0' ) ;
    	      SIG_I_DATA3  <= ( others => '0' ) ;
    	SIG_STROBE_N <= '1' ;
    			
    					  
    		v_state := 1 ;
    
    	when 1 => 
    		 SIG_COUNTER_SET <= '1';
    			
    			SIG_WR_N     <= '1' ;
    			SIG_BENA_N   <= '1' ;
    			SIG_ADDR     <= "0000000000000111100" ;
    			
    			SIG_I_DATA0  <= ( others => '0' ) ;
    			SIG_I_DATA1  <= ( others => '0' ) ;
    			SIG_I_DATA2  <= ( others => '0' ) ;
    			SIG_I_DATA3  <= ( others => '0' ) ;
    			SIG_STROBE_N <= '0' ;
    			v_state := 2 ;
    					 
    		 when 2 =>
    		  SIG_COUNTER_SET <= '1';
    		 	
    			SIG_WR_N     <= '1' ;
    			SIG_BENA_N   <= '1' ;
    			SIG_ADDR     <= "0000000000000111100" ;
    			
    			SIG_I_DATA0  <= ( others => '0' ) ;
    			SIG_I_DATA1  <= ( others => '0' ) ;
    			SIG_I_DATA2  <= ( others => '0' ) ;
    			SIG_I_DATA3  <= ( others => '0' ) ;
    			SIG_STROBE_N <= '1' ;
    			if SIG_ACK = '1' then
    			  v_state := 0 ;--6
    			end if ;
    		 
    


    Przeniosel sygnal SIG_STROBE_N z poczatku kazdego "whena" na koniec i na 3 wyslane do zapisu slowa, 2 udalo mi sie odczytac. Dalej mnie to nie zadowala ale troche przykra jest to sytuacja gdy takich rzeczy trzeba sie doszukiwac. Byc moze jutro tych dwoch slow juz nie odczytam :(

    no bo jak to mozliwe?

    mam narastajace zbocza zegara wautomacie sterujacym. tuz po nim ustawiaja sie sygnaly sterujace... ale tych sygnalow sterujacych nie widac jeszcze w komponenecie obslugujacym sram... dopiero kolejne narastanie powoduje ze sa one tam w srodku WSZYSTKIE chwytane... no i to chwytanie juz w komponencie tez sie odbywa sekwencyjnie (proces clockowany)... konkretnie to taki:
    
    elsif P_I_CLK'event and P_I_CLK = '1' then
    	REG_STROBE_N <= P_I_STROBE_N ;
    	REG_WR_N     <= P_I_WR_N  ;  
    	REG_BENA_N	 <= P_I_BENA_N;	 	                          
    	REG_ADDR     <= P_I_ADDR  ;   	                        
    	REG_DATA0    <= P_I_DATA0 ;   
    	REG_DATA1    <= P_I_DATA1 ;   
    	REG_DATA2    <= P_I_DATA2 ;   
    	REG_DATA3    <= P_I_DATA3 ;
    	
    	P_O_DATA0 <= REG_O_DATA0 ;
    	P_O_DATA1 <= REG_O_DATA1 ;
    	P_O_DATA2 <= REG_O_DATA2 ;
    	P_O_DATA3 <= REG_O_DATA3 ;
    	
    	P_O_ACK <= REG_ACK ;
      end if ;
     end process ;
    


    to moze bardziej na tym poziomie ma znaczenie kolejnosc?
    gdzie tu w ogole miejsce na jakas asynchronicznosc?

    nie chce wchodzic w mechanizmy, ktore byc moze tu nie zachodza. Moze ktos ma jakas zlota porade?

    Dzieki

    Dodano po 6 [minuty]:

    sciagnalem ze strony producenta model sramu (taki niesyntezowalny) bliski temu ktorego uzywam. No i pojawil sie tam komunikat: "iADDR - Cyp_tAH violation"

    W kodzie sprawdzilem ze wywoluje sie on gdy:

      IF iCLK'DELAYED(Cyp_tAH) = '1' THEN
                ASSERT (iADDR'LAST_EVENT > Cyp_tAH)
                    REPORT "iADDR - Cyp_tAH violation"
                    SEVERITY ERROR; 


    Cyp_tAH to czas hold after clk rise. jakies 0.5 ns w zaleznosci od czestotliwosci.

    Dodano po 59 [minuty]:

    no i skoro we wszystkich stanach adres jest caly czas podany ten sam, nie ma zadnego momentu jego zmiany, to skad komunikat:

    Error: iADDR - Cyp_tAH violation

    Czy to o czyms swiadczy?

    Dodano po 37 [minuty]:

    jak to sprawdzic, zniwelowac...? :(
  • REKLAMA
  • Pomocny post
    #2 4553385
    mariusz102102
    Poziom 12  
    Posty: 67
    Pomógł: 2
    Witam,

    Czego uzywasz do symulacji? Ja ostanio w ActiveHDL mialem podobny blad. (2 tygodnie szukania w plecy!).

    entity
    Main_comp
    port
    (
     CLK : std_logic
     .......
    )
    
    architecture
    signal CLKSignal : std_logic;
    comp u1
    port
    (
     CLK : std_logic
     .......
    )
    
    comp u2
    port
    (
     CLK : std_logic
     .......
    )
    beging
    comp u1
    port map
    (
     CLK => CLKSignal
     .......
    )
    
    comp u2
    port map
    (
     CLK => CLKSignal
     .......
    )
    
    CLKSignal <= CLK;
    end;

    Okazalo sie, ze po usunieciu sygnalu CLKSignal (i podpieciu componentow bezposredio do CLK) symulacja funkcjonalna w ActiveHDL przeszla bez problemu! Blad ActivaHDL!
    Juz teraz dokladnie nie pamietam, ale problem wystepowal tylko przy symulacji funkcjonalnej po syntezie i implementacji symulcja przechodzila prawidlowo rowniez z CLKSignal <= CLK;

    Troche nie jasno napisales ale czy napewno pracujesz na dobrych zboczach zegara.
    Logika ktora testujesz powinna prcowac na narastajacym zboczu zegara, a testbench na opadajacym.

    Pozdrawiam
    Mariusz
  • REKLAMA
  • Pomocny post
    #3 4553774
    [g.d.]
    Poziom 18  
    Posty: 174
    Pomógł: 31
    mariusz102102 napisał:

    Okazalo sie, ze po usunieciu sygnalu CLKSignal (i podpieciu componentow bezposredio do CLK) symulacja funkcjonalna w ActiveHDL przeszla bez problemu! Blad ActivaHDL!

    Nie Mario, twój błąd. Przypisanie typu:
    CLKSignal <= CLK;
    to dodatkowa "delta symulacyjna" na zegarze, czyli nowa domena zegarowa, pasowałoby wstawić fifo itp. ... :D

    No chyba że kod wygenerowany np. z BDE Active-a to w pewnym sensie niefrasobliwość developerów. Jeśli nie chce się mieć takiego przypisania to nie można nadawać nazwy netowi z sygnałem zagarowym w BDE, bo to powoduje stworzenie dodatkowego sygnału(tylko po to żeby sie nazwa zgadzała) i takie właśnie kłopotliwe przypisanie na sygnale zegarowym :D

    Mogłeś wrzucić temat wcześniej, a tak dwa tygodnie przeminęło z wiatrem. :D

    Dodano po 16 [minuty]:

    zlootawy napisał:
    no i skoro we wszystkich stanach adres jest caly czas podany ten sam, nie ma zadnego momentu jego zmiany, to skad komunikat:

    W każdym stanie masz przypisanie, nie ważne czy wartość sie zmienia 'LAST_EVENT to nie 'LAST_ACTIVE.

    Jeśli używasz takiego modelu w symulacji kodu bez opoźnień to musisz sie liczyć z takimi komunikatami. Żeby sie ich pozbyć musiałbyś sztucznie opóźnić przypisania na wejściach modelu względem zegara, tak jak to będzie "w sprzęcie", choćby o tą umowną 1ns.

    Przesunięcie przypisania wewnątrz when nic nie zmienia(wyjątkiem mogłyby być variable, ale zdaje sie że to nie ten przypadek) z punktu widzenia kodu. Natomiast program robiący syntezę i implementację może inaczej po"route"ować połączenia i jeśli są w projekcie "wyścigi" to może działać raz lepiej raz gorzej. Nie mam teraz czasu ale jakbyś wrzucił więcej kodu, najlepiej całość, to mogę poszukać "ryzykownych" konstrukcji językowych.
  • #4 4554747
    zlootawy
    Poziom 10  
    Posty: 54
    [g.d.] napisał:

    Jeśli używasz takiego modelu w symulacji kodu bez opoźnień to musisz sie liczyć z takimi komunikatami. Żeby sie ich pozbyć musiałbyś sztucznie opóźnić przypisania na wejściach modelu względem zegara, tak jak to będzie "w sprzęcie", choćby o tą umowną 1ns.

    Przesunięcie przypisania wewnątrz when nic nie zmienia(wyjątkiem mogłyby być variable, ale zdaje sie że to nie ten przypadek) z punktu widzenia kodu. Natomiast program robiący syntezę i implementację może inaczej po"route"ować połączenia i jeśli są w projekcie "wyścigi" to może działać raz lepiej raz gorzej. Nie mam teraz czasu ale jakbyś wrzucił więcej kodu, najlepiej całość, to mogę poszukać "ryzykownych" konstrukcji językowych.



    plik pamiec.vhd to kontroler sramu. wykonuje zapis, odczyt. Tryb burst lub single.

    plik gora.vhd to automat sterujacy kontrolerem. aktualnie jego zadaniem jest zapis pod podany adres w trybie burst (czyli pod 4 adresy) takiego samego slowa. na koniec nastepuje nieskonczony odczyt pierwszego z czterech adresow (na te chwile odczytuje mi to blednie).

    Gdybys mogl zerknac i wychwycic ewentualnie grozne miejsca... a nie da sie dac wskazowek syntezerowi, zeby zawsze dobrze rozmieszczal bramki? :)

    device to virtex2pro. zegar z plyty to 50Mhz, poprzez dcm podnosze go do 100 Mhz.

    sporo kodu jest wykomentowanego.
    Załączniki:
    • projekt_poniedzialek.zip (1.4 MB) Musisz być zalogowany, aby pobrać ten załącznik.
  • REKLAMA
  • Pomocny post
    #5 4555454
    mariusz102102
    Poziom 12  
    Posty: 67
    Pomógł: 2
    g.d.
    CLKSignal <= CLK;
    Teraz juz wiem, ze czegos takiego sie nie robi. Ale ma pytanie
    Ta dodatkowa "delta symulacyjna" czyli "nowa domena zegarowa" mam nadzieje ze ma miejsce tylko podczas uzycia dodatkowego sygnalu dla zegara.


    zlootawy
    te 4 punkty dostalem za to, ze tez stworzyles nowa "nowa domena zegarowa" ;)

    Pozdrawiam
    Mariusz
  • #6 4556010
    zlootawy
    Poziom 10  
    Posty: 54
    w kazdym badz razie analiza posr-route nie ma wiekszego sensu jesli mam przebegu rzeczywiste z chip scope pro. przyjrze sie czy wszystkie sygnaly przy kazdym zapisie slowaustawiaja sie identycznie. jesli tak, to nie wiem co to oznacza... moze sram musi chwile odpoczac po operacji? :-)

    Dodano po 4 [minuty]:

    [g.d.] napisał:


    W każdym stanie masz przypisanie, nie ważne czy wartość sie zmienia 'LAST_EVENT to nie 'LAST_ACTIVE.



    hmm...... to co mozna zrobic zeby wszystko po podaniu zdazylo sie ustabilizowa itd? nie podawac adresu w kazdym stanie, tylko ten jeden raz o jeden takt wczesniej niz jest potrzebny? i wtedy pojdzie to do zatrzasku... dobrze mysle?
  • Pomocny post
    #7 4557176
    [g.d.]
    Poziom 18  
    Posty: 174
    Pomógł: 31
    mariusz102102 napisał:
    Ta dodatkowa "delta symulacyjna" czyli "nowa domena zegarowa" mam nadzieje ze ma miejsce tylko podczas uzycia dodatkowego sygnalu dla zegara.


    Jeśli port jest "podmapowany" na port instancji powyżej, to nie dochodzi dodatkowe opóźnienie(delta). Jeśli z portu idzie na sygnał i dopiero na port to dochodzi 1 delta w symulacji, jak dwa sygnały po drodze to dwie "delty". Ładnie to widać jak masz "waveform" z dokładnością do delt. W Active-HDL to sie chyba nazywa *.lst

    Problem tkwi jest w tym że sygnały zatrzaśnięte na "nie ospóźnionym" sygnale zegarowym dotrą równo z "opóźnionym" sygnałem zegarowym do następnego przerzutnika i tam też zostaną zatrzaśnięte. Czyli zmiana na sygnale może przelecieć przez dwa rzędy przerzutników na "jednym" zboczy sygnału zegarowego(w symulacji, bo "w sprzęcie" już takich cudó nie ma :D).

    Dodano po 7 [minuty]:

    zlootawy napisał:
    hmm...... to co mozna zrobic zeby wszystko po podaniu zdazylo sie ustabilizowa itd? nie podawac adresu w kazdym stanie, tylko ten jeden raz o jeden takt wczesniej niz jest potrzebny? i wtedy pojdzie to do zatrzasku... dobrze mysle?


    VHDL pozwala na opóźnienie przypisania do sygnału. Drugi adres z google: http://www.gmvhdl.com/delay.htm

    Jest to konstrukcja nie syntezowalna, program robiący syntezę ją zignoruje, więc możesz ją smiało zostawić w kodzie. Zysk jest tylko taki że znikną Ci te komunikaty. No i mogą zniknąć w symulacji problemy z zegarem opóźnionym o delty, by ty wstawisz na danych "realne" opóźnienie(czyt. większe niż zylion delt).
  • Pomocny post
    #8 4562261
    J.A
    Poziom 28  
    Posty: 596
    Pomógł: 159
    Ocena: 12
    zlootawy napisał:
    /.../sciagnalem ze strony producenta model sramu (taki niesyntezowalny) bliski temu ktorego uzywam.

    moze zrob tak: wygeneruj w coregen pamiec podobna do tej, jakiej bedziesz uzywal w rzeczywistosci
    i zrob symulacje post place&route;
    nie bedziesz mial problemow z subtelnosciami symulacji;
    inne podejscie to powazne studia nad tym, jak dzialaja symulatory :)
    J.A
  • REKLAMA
  • Pomocny post
    #9 4562436
    [g.d.]
    Poziom 18  
    Posty: 174
    Pomógł: 31
    J.A napisał:
    inne podejscie to powazne studia nad tym, jak dzialaja symulatory :)

    Dziękuję, nie trzeba było. :D
  • #10 4564802
    zlootawy
    Poziom 10  
    Posty: 54
    J.A napisał:
    zlootawy napisał:
    /.../sciagnalem ze strony producenta model sramu (taki niesyntezowalny) bliski temu ktorego uzywam.

    moze zrob tak: wygeneruj w coregen pamiec podobna do tej, jakiej bedziesz uzywal w rzeczywistosci
    i zrob symulacje post place&route;
    nie bedziesz mial problemow z subtelnosciami symulacji;
    inne podejscie to powazne studia nad tym, jak dzialaja symulatory :)
    J.A




    nie wiem jak wygenerowac taka pamiec... to model cypres CY7C1386B.


    hmmm.. a czy automat sterujacy nie oparty na sygnalach next_state i current_state, tylko na wartosci variable moze sprawic jakies psikusy?
  • Pomocny post
    #11 4566636
    J.A
    Poziom 28  
    Posty: 596
    Pomógł: 159
    Ocena: 12
    zlootawy napisał:
    nie wiem jak wygenerowac taka pamiec... to model cypres CY7C1386B

    znalazlem opis CY7C1386D, z punktu widzenia logiki dzialania to z pewnoscia to samo;
    dzialanie tych ukladow rozni sie od starszych pamieci sram, z ktorymi pracowalem
    na tyle, ze prawdopodobnie nie ma szans wygenrowanie podobnego modelu
    za pomoca coregen w ise, czy w quartusie;
    problem mozna rozwiazac na kilka sposobow:
    - mozesz w ogole zrezygnowac z modelu pamieci i badac symulatorem post place&route
    [badz chipscope, jednak symulator daje rowniez informacje o timing'ach sygnalow,
    czego brakuje w chipscope] sekwencje sygnalow sterujacych i danych wysylanych
    do pamieci, definiujac wg. data-sheet odpowiedz pamieci mozesz sprawdzic,
    czy prawidlowo odczytujesz dane z pamieci;

    - mozesz zrobic wlasny, syntetyzowalny model tej pamieci cypressa
    na podstawie data-sheet;
    jadrem takiego modelu bylaby wew. pamiec w xilinxie, ktora implementuje
    sie tak: [verilog!]

    reg [15:0] mem[7:0];
    always @(posedge clk)
    if (write) mem[addr] <= data_in;
    else data_out <= mem[addr];

    aby dopasowac te pamiec do pamieci cypress musialbyc stworzyc
    ekstra logike, ktora ustawia dane i sygnaly sterujace tak, by
    odpowiadaly specyfikacji pamieci CY7C1386B;
    glownie chodzi o to, ze wg. specyfikacji CY7C1386B dane do zapisu
    maja pojawic sie o jeden cykl zegara pozniej niz adres i write_enable;
    podobnie z cyklem odczytu, co oznacza dodanie extra rejestru/rejestrow
    wyrownujacego pojawienie sie danych i sygnalow sterujacych;
    nie jest to jakies super trudne zadanie, ale wymagajace precyzji i uwagi,
    by czegos nie przeoczyc - oceniam, ze nie powinno to zajac wiecej niz
    2 dni dla srednio zaawansowanego uzytkownika fpga;

    - mozesz uzyc gotowego modelu sciagnietego ze strony cypress,
    i przesymulowac rtl, zamiast netlisty post place&route;
    to podejscie wymaga jakiejs wiedzy o tym, jak dzialaja symulatory,
    gdzie wstawic konieczne opoznienia, by symulator nie pokazywal
    glupot [tu moja wiedza jest najmniejsza], ale [g.d] podal
    juz kilka cennych wskazowek i zapewne bedzie bardzo pomocny;


    [g.d] napisał:
    Dziękuję, nie trzeba było

    nie mam pewnosci, ze rozumiem, co autor mial na mysli,
    mam nadzieje, ze to nie sarkazm;

    J.A
  • Pomocny post
    #12 4572095
    [g.d.]
    Poziom 18  
    Posty: 174
    Pomógł: 31
    J.A napisał:
    [g.d] napisał:
    Dziękuję, nie trzeba było

    nie mam pewnosci, ze rozumiem, co autor mial na mysli,
    mam nadzieje, ze to nie sarkazm;
    J.A

    To nie sarkazm, potraktowałem to jako komplement i komentarz do wypowiedzi o deltach w symulatorze i atrybutach VHDL.

    Brakło mi czasu i miejsca na dysk na dogłębną riposte w kwesti EMPTY na fifo xilinx-a, a że sam jestem ciekaw to będę dalej drążył ten temat.

    Pozdrawiam.
  • Pomocny post
    #13 4572423
    J.A
    Poziom 28  
    Posty: 596
    Pomógł: 159
    Ocena: 12
    <<zlootawy>>
    zapominalem o jeszcze jednej opcji, byc moze najporeczniejszej
    i najbardziej wiarygodnej;
    otoz quartus mozna poprosic [w settings], by w czasie kompilacji
    wyprodukowal netliste do symulacji dla konkretnego narzedzia,
    modelsim, ncsim, active-hdl i cos tam jeszcze;
    pliki wynikowe zawieraja tez informacje o opoznieniach;
    majac takie pliki tworzysz testbench w ktorym laczysz ten
    twoj niesyntetyzowalny model pamieci z wygenerowanym kontrolerem
    i symulujesz w modelsim;
    jak zwykle - nie mam pojecia, czy ise rowniez mozna poprosic
    o taki model do symulacji, ale skoro konkurencja xilinxa
    ma taka opcje od lat, nie sadze by zaspali sprawe i nie dolaczyli
    podobnych mozliwosci;

    [g.d] napisał:
    /.../potraktowałem to jako komplement/.../

    slusznie, zgodnie z zamierzeniem piszacego :)
    J.A
  • Pomocny post
    #14 4572841
    [g.d.]
    Poziom 18  
    Posty: 174
    Pomógł: 31
    We "flow" Xilinx-a odpowiednikiem na potrzeby "back-annotation simulation" jest para plików *.vhd i *.sdf. Pewnie jest jakaś opcja w ISE żeby wygenerował pliki do post-par simulation. Generalnie robi się to programem NetGen, ale chyba jeszcze z tego nie korzystałem.

    Jak już się ma te pliki to symuluje się *.vhd i trzeba zadbać żeby symulator "podłączył" opóźnienia z pliku *.sdf, w różnych symulatorach są rożne opcje do tego.

Podsumowanie tematu

✨ Dyskusja dotyczy problemów z automatem sterującym komponentem SRAM, w szczególności z poprawnym działaniem sekwencji zapisu i odczytu w trybie burst oraz pojedynczym. Poruszono kwestię wpływu kolejności instrukcji sekwencyjnych w automacie na stabilność działania układu. Wskazano, że w symulacjach VHDL, zwłaszcza w Active-HDL, pojawiają się problemy związane z dodatkową "deltą symulacyjną" wynikającą z użycia pośrednich sygnałów zegarowych (np. CLKSignal), co może tworzyć niezamierzone domeny zegarowe i powodować błędy w symulacji funkcjonalnej. Zalecane jest bezpośrednie podłączenie komponentów do sygnału zegarowego, aby uniknąć tych opóźnień. Omówiono także, że w symulacji bez opóźnień mogą występować niezgodności czasowe, które w sprzęcie nie występują, a ich eliminacja wymaga wprowadzenia sztucznych opóźnień w przypisaniach sygnałów.

W kontekście modelowania pamięci SRAM, zwłaszcza modelu Cypress CY7C1386B/D, zasugerowano, że nie jest możliwe wygenerowanie dokładnego modelu w Coregen czy Quartus, dlatego lepszym podejściem jest symulacja post place & route z rzeczywistym modelem lub stworzenie własnego, syntetyzowalnego modelu pamięci na podstawie dokumentacji technicznej. Wskazano również na możliwość generowania netlist i plików SDF do symulacji z uwzględnieniem opóźnień w narzędziach Xilinx ISE i Quartus, co pozwala na bardziej wiarygodne testy funkcjonalne. Poruszono też temat stosowania zmiennych (variable) zamiast sygnałów (signal) w automatach sterujących i potencjalnych problemów z tym związanych.

Podsumowując, zmiana kolejności instrukcji sekwencyjnych może mieć wpływ na działanie automatu, ale kluczowe jest prawidłowe zarządzanie sygnałami zegarowymi i opóźnieniami w symulacji oraz odpowiednie modelowanie pamięci SRAM i sterownika, uwzględniające specyfikę sprzętową i symulacyjną.
Wygenerowane przez model językowy.
REKLAMA