2017-08-07 1 views
-2

Ich habe diesen Code in Systemverilog, wo ich Hex-Zahlen in For-Schleife verwenden müssen. Ich versuche unten Syntax und Code.Hex-Wert in Verilog erzeugen für Schleife

genvar i,j; 

localparam int i_d = 1; 

localparam int j_d = 134; 

generate 

for (i = 8'h01; i <= MAX1; i = i + INCR) 

begin 

    add_bit[i_d] = (creg_add == i); 

    i_d = i_d + 1; 

end 

for (j = 8'h86; j <= MAX2; j = j + INCR) 

begin 

    add_bit[j_d] = (creg_add == j); 

    j_d = j_d + 1; 

end 

endgenerate 

Aber ich bin mit diesem Fehler konfrontiert. Kann mir hier jemand helfen?

Error-[SE] Syntax error 
Following verilog source has syntax error : 
    "creg.vs", 
    715: token is '[' 
       add_bit[i_d] = (creg_add == i); 
      ^
+0

Was ist 'add_bit'? Du musst wahrscheinlich 'ad_bit [i_d] = ....' zuweisen. Ich denke, es ist ein Duplikat dafür: https://stackoverflow.com/questions/45491164/getting-the-invalid-module-instantiation-in-my-fir-verilog-code – Serge

+0

was hast du 'add_bit' als definiert? –

+0

add_bit ist definiert als logisch –

Antwort

0

Dies sollte das Problem lösen.

genvar i,j; 

localparam int i_d = 1; 

localparam int j_d = 134; 

generate 

for (i = 8'h01; i <= MAX1; i = i + INCR) 

begin 

    assign add_bit[i_d] = (creg_add == i); 

    i_d = i_d + 1; 

end 

for (j = 8'h86; j <= MAX2; j = j + INCR) 

begin 

    assign add_bit[j_d] = (creg_add == j); 

    j_d = j_d + 1; 

end 

endgenerate 
+1

Dies wird nicht kompiliert, da 'i_d' /' j_d' inkrementiert werden. Das Hinzufügen von 'assign' funktioniert nicht, da es localparams (aka Konstanten) sind. – Greg

+0

Das wird nicht kompiliert ??? –

2

generate Blöcke werden bei Ausarbeitung Zeit (Pre-Simulation) bewertet. Sie können darin always Blöcke, assign Anweisungen, Modulinstanzen und lokale Deeskalation enthalten. Die direkte Zuweisung eines Werts, der kontinuierlich außerhalb einer always-Block- oder assign-Anweisung aktualisiert wird, ist nicht zulässig.

localparam s sind Konstanten, daher ist die Zeile i_d = i_d + 1 ungültig.

Eine einfachere Lösung wäre die prozedurale Zuweisung in einem kombinatorischen always-Block.

int i,j; 
int i_d, j_d; 
logic [WIDTH:0] add_bit; 

always_comb begin 
    i_d = 1; 
    j_d = 134; 
    add_bit = '0; // fill zeros in case of gap between last i_d and first j_d 
    for (i = 8'h01; i <= MAX1; i = i + INCR) 
    begin 
    add_bit[i_d] = (creg_add == i); 
    i_d = i_d + 1; 
    end 
    for (j = 8'h86; j <= MAX2; j = j + INCR) 
    begin 
    add_bit[j_d] = (creg_add == j); 
    j_d = j_d + 1; 
    end 
end 
+0

danke für Hilfe; anstelle von add_bit [i_d], kann ich add_bit [i] verwenden? Wird das in der Lage sein, Hex-Werte im Index zu verstehen? –

+0

Die Radix spielt keine Rolle (hex, dec, bin, oct). Verwenden Sie, mit welchem ​​Radix einfacher zu arbeiten ist. '134' und' 8'h86' sind gleichwertig und meistens austauschbar. Ich nehme an, 'INCR' ist größer als 1, was erklären würde, warum' i' und 'i_d' nicht die gleiche Variable sind. – Greg