2016-03-25 6 views
0

Ich versuche, die Erzeugung von FSM-Zustand parametrisch oder automatisch zu machen. Ich habe viele Möglichkeiten ausprobiert und scheint es gibt keine Möglichkeit, den Code zu generieren, den ich brauche. Kann jemand bitte helfen?Automatisches Verilog-Codegenerierungsproblem

Der Kodex, die ich generieren müssen Teil der FSM-Zustandsmaschine ist, für den ST_DATA_CHECK Zustand: kann 0

always @(posedge ui_clk_sync_rst or posedge ui_clk) 
    begin 
    if (rst) begin 
     s_app_cmd   <= 3'b111; 
     s_app_en   <= 1'b0; 
end 
end else begin 
     case (ddr3_state) 
      ST_INIT : 
…. 
      ST_DATA_CHECK : // This part of the code, needs to make parameteric 
       if (~dwfifo_ef[0]) begin 
       s_data_write_active[0] <= 1'b1 ; 
       end else if (~dwfifo_ef[1]) begin 
       s_data_write_active[1] <= 1'b1 ; 
       end else if (~dwfifo_ef[2]) begin 
       s_data_write_active[2] <= 1'b1 ; 
       end else if (~d_rfifo_ef[0]) begin 
       s_data_read_active[0] <= 1'b1 ; 
       end else if (~d_rfifo_ef[1]) begin 
       s_data_read_active[1] <= 1'b1 ; 
       end 
      ST_WRITE : 
       … 
endcase 

Bitte beachten Sie, dass zum Beispiel dwfifo_ef [0] und dwfifo_ef [1] Bits bei der sein gleichzeitig, deshalb muss ich hier den Prioritäts-Encoder verwenden.

Jede Hilfe/Idee/Vorschlag ist willkommen darüber, wie ich den Code parametrisch machen kann.

Dank Hayk

Antwort

1

Sie wollen eine for Schleife mit einer break Aussage:

ST_DATA_CHECK : 
       for (int i=0;i<$bits(dwfifi_ef);i++) 
       if (~dwfifo_ef[i]) begin 
       s_data_write_active[i] <= 1'b1 ; 
       break; 
       end 
+0

Dank Dave für Antwort Allerdings gibt es 2 Teile mit dem sollution 1) in meinem if-Anweisung gibt es 2 Signale s_data_write_active und s_data_read_active 2) auch ich bin mir nicht sicher, ob for-break synthetisierbar ist Anweisung – haykp

+0

@haykp 'for' Schleifen sind generativ synthetisierbar. Die Schleifenparameter müssen statisch sein - es muss kristallklar sein, was die maximale Anzahl von Iterationen der Schleife sein wird. –

1

@ dave_59 hat Ihr Problem nur etwa gelöst, aber wie Sie „sagen, in meiner if-Anweisung gibt es zwei Signale s_data_write_active und s_data_read_active ", wie wäre es mit so etwas wie das?

ST_DATA_CHECK : 
       if (|dwfifo_ef == 1'b1) 
       for (int i=0;i<$bits(dwfifi_ef);i++) 
        if (~dwfifo_ef[i]) begin 
        s_data_write_active[i] <= 1'b1 ; 
        break; 
        end 
       else 
       for (int i=0;i<$bits(d_rfifo);i++) 
        if (~d_rfifo[i]) begin 
        s_data_read_active[i] <= 1'b1 ; 
        break; 
       end 

(Ich habe nicht meinen Ausdruck zu kompilieren, zu simulieren oder synthsise dies, damit so etwas wie versucht.)

+0

Dank gut könnte dies funktionieren, d. H. Für die Simulation kann es gute Ergebnisse geben jedoch, wie wäre es mit Synthese und P & R? Ich werde versuchen, dies zu synthetisieren, um zu sehen, ob For-Break ist überhaupt synthetisch – haykp

+0

@ haykp Wie ich schon sagte, es sollte synthetisieren. Lass uns wissen, wie es dir geht. –

+0

Arbeiten! Ich könnte es durch Synplify synthetisieren Vielen Dank für die Hilfe – haykp