2016-11-14 4 views
0

Ich frage mich, ob diese SyntaxSystem Verilog immer in immer

always_comb begin 
    case (aaa) 
    3'b000: always #(CLKREF_HALF_PERIOD + 5000ps) xclk=~xclk ;//000 at 80MHZ : 
    3'b001: always #(3750ps + CLKREF_HALF_PERIOD) xclk=~xclk;//001 at 100MHZ 
    3'b010: always #(1250ps + CLKREF_HALF_PERIOD) xclk=~xclk;//010 at 200MHZ 
    3'b011: always #(0.252ns + CLKREF_HALF_PERIOD) xclk=~xclk;//011 at 333MHZ 
    3'b100: always #(0.112ns + CLKREF_HALF_PERIOD) xclk=~xclk;//100 at 367MHZ 

    default always #(CLKREF_HALF_PERIOD/1) xclk=~xclk;//default at 400MHZ 
      endcase 

darf ich erhalte Kompilierungsfehler in Bezug auf die verschachtelten immer in den Fällen. Ich versuche, die Taktfrequenz zu ändern, abhängig von der Eingabe von aaa. aber die Frage ist eher eine Frage auf "ob ein immer innerhalb eines immer Block ist legal oder nicht"

+0

bitte fügen Sie hinzu und erklären Sie, was Sie zu tun versuchen. – suku

Antwort

2

Die Lösung forever loop funktioniert nicht, da es keine Möglichkeit gibt, dass der Block always der obersten Ebene für die Schleife forever beendet wird und zu einem anderen Zweig der case-Anweisung gelangt. Eine einfachere Lösung besteht darin, einen Immer-Block zu verwenden, um die Taktverzögerung zu berechnen, und einen anderen Immer-Block, um den Takt zu erzeugen.

int clk_delay; 
always_comb 
    case (aaa) 
    3'b000: clk_delay = CLKREF_HALF_PERIOD + 5000ps; //000 at 80MHZ 
    3'b001: clk_delay = 3750ps + CLKREF_HALF_PERIOD; //001 at 100MHZ 
... 
always #clk_delay xclk = ! xclk; 
+0

danke Jungs für alle Antworten !!! – TheSprintingEngineer

1

Verschachtelte prozedurale Blöcke sind nicht erlaubt. Ich glaube, dass aaaaaa ein Parameter hier ist. Wenn ja, können Sie generate Block verwenden. unterschiedliche Taktfrequenzen verwenden. Dadurch wird jeweils ein kombinatorischer Block aktiv. Ein Code-Beispiel kann wie folgt sein:

generate 
    case (aaaaaa) 
    3'b000: always #(CLKREF_HALF_PERIOD + 5000ps) xclk=~xclk ;//000 at 80MHZ : 
    3'b001: always #(3750ps + CLKREF_HALF_PERIOD) xclk=~xclk;//001 at 100MHZ 
    3'b010: always #(1250ps + CLKREF_HALF_PERIOD) xclk=~xclk;//010 at 200MHZ 
    3'b011: always #(0.252ns + CLKREF_HALF_PERIOD) xclk=~xclk;//011 at 333MHZ 
    3'b100: always #(0.112ns + CLKREF_HALF_PERIOD) xclk=~xclk;//100 at 367MHZ 

    default always #(CLKREF_HALF_PERIOD/1) xclk=~xclk;//default at 400MHZ 

endgenerate 

Wenn aaa ein Variable/Register/Draht dann kann man forever Schleifenkonstrukt anstelle von inneren always Block verwenden. Die Beispielverwendung wird in der Antwort von Dave_59 deutlicher gezeigt.

Siehe Abschnitt IEEE 1800-2012 Abschnitt 27.5 für weitere Informationen zu generate Blöcke.

+0

aaa wird in dieser Testumgebung als "Logik" deklariert. – TheSprintingEngineer

+0

Es handelt sich also um eine Variable, deren Wert zur Laufzeit geändert werden kann (und keine Zeitkonstante). Du solltest also mit der zweiten Option von "forever" loop gehen. – sharvil111

+1

BTW, Sie können 'always_comb' nicht mit Verzögerung oder Code verwenden, der keine kombinatorische Logik darstellt –