2016-08-05 27 views
0

Momentan versuche ich meine VHDL Fähigkeiten zu entwickeln und deshalb benutze ich das Sigasi Plugin für Eclipse um VHDL Code zu schreiben. Sigasi ist ein großartiges Werkzeug, aber es gibt eine Sache, die mich jedoch stört. Ständig weckt Sigasi Warnungen über unvollständige Sensitivitätslisten in Prozessdefinitionen, die aus meiner Sicht nicht gerechtfertigt sind. Ein Beispiel ist die folgende Entität mit der entsprechenden Architektur. Es ist die Beschreibung eines RingschiebeUnvollständige Sensitivitätsliste in VHDL mit Sigasi Editor

library ieee; 
use ieee.std_logic_1164.all; 
use ieee.numeric_std.all; 

entity RingShiftReg is 
    generic(
     WIDTH : integer := 8 
    ); 
    port(
     clock  : in std_ulogic; 
     reset  : in std_ulogic; 
     set  : in std_ulogic; 
     initValue : in std_ulogic_vector(WIDTH - 1 downto 0); 
     value  : out std_ulogic_vector(WIDTH - 1 downto 0) 
    ); 
end; 

architecture ringShiftRegArch of RingShiftReg is 
    signal innerValue : std_ulogic_vector(WIDTH - 1 downto 0); 
begin 
    P1: process(clock, reset) 
    begin 
     if reset = '1' then 
      innerValue <= (others => '0'); 
     elsif rising_edge(clock) then 
      if set = '1' then 
       innerValue <= initValue; 
      end if; 
     else 
      innerValue <= innerValue(WIDTH - 2 downto 0) & innerValue(WIDTH - 1); 
     end if; 
    end process; 
    value <= innerValue; 
end ringShiftRegArch; 

Die Sigasi Linter behauptet registrieren, dass die Empfindlichkeit der Prozessliste P1 unvollständig ist, da das Signal innerValue fehlt. Aber meiner Meinung nach ist es nicht notwendig, innerValue in die Empfindlichkeitsliste zu setzen, denn es ist völlig abhängig von clock und reset.

Was ist jetzt richtig?

+2

Sigasi. Und nicht unbedingt aus dem Grund, den Sie vielleicht denken. innerValue wird nicht aktualisiert, solange ein ausstehender Prozess noch nicht fortgesetzt oder angehalten wurde. Du implizierst eine Verzögerung bei der letzten Aufgabe. Das Setzen von innerValue in die Empfindlichkeitsliste ist ebenfalls ein Fehler, der dazu führen würde, dass innerValue in aufeinanderfolgenden Delta-Zyklen fortlaufend aktualisiert wird (bis Sie ein Limit erreichen, wenn es implementiert ist). Die Zuweisung ist eine kombinatorische Schleife. Warum sollte innerValue nicht auf den Ausdruck der rechten Hand in der letzten Zuweisung in der if-Anweisung gesetzt werden, die von initValue aus zuweist? Oder deklarieren Sie innerValue als Variable im Prozess. – user1155120

+3

Ihr Prozess modelliert nicht die Art von digitaler Hardware, die in den meisten Technologien (ASIC oder FPGA) implementiert werden kann. Ich schlage vor, die Antwort, die ich vor ein paar Stunden für die sehr ähnliche Frage geschrieben habe, sorgfältig zu lesen (Match-Simulation und Post-Synthese-Verhalten in VHDL) (http://stackoverflow.com/questions/38778965/match-simulation-and-post) -synthesis-Verhalten-in-vhdl/38783500 # 38783500)? –

Antwort

2

Haben Sie das vielleicht gemeint?

elsif rising_edge(clock) then 
    if set = '1' then 
    innerValue <= initValue; 
    else 
    innerValue <= innerValue(WIDTH - 2 downto 0) & innerValue(WIDTH - 1); 
    end if; 
end if; 
2

Um es kurz, Ihre

else 
    innerValue <= ... 
end if; 

macht keinen Sinn in der klassischen digitalen Hardware machen, weil in diesem Zusammenhang Ihre else bedeutet:

  • clock oder reset (oder beide) geändert, und
  • reset ist nicht gleich '1' und
  • das ist nicht ar Kante von clock.

So kann es sein:

  • eine fallende Flanke von reset oder
  • eine fallende Flanke von clock während reset gleich '0'.

Wahrscheinlich nicht das, was Sie vorhatten. Wenn es das ist, was Sie beabsichtigten, sollten Sie versuchen, eine andere Zieltechnologie zu finden. Klassische digitale Hardware kann dies nicht erreichen, da es keine Multi-Clocks, Multi-Edge-Register in ASIC-Standardzellenbibliotheken oder in FPGAs gibt.