2016-03-29 3 views
0

sagen, dass ich den folgenden Code haben:In Verilog, wie verwende ich eine Variable in der Logik

genvar i,j; 
generate 
for(i = 0; i < MAX; i = i + 1) begin: gen_blah 
    for(j = 0; j < MAX; j = j + 1) begin: gen_foo 
    assign match[i] = entry[j] = i; 
    end 
end 
endgenerate 

Ist das ein synthetisierbaren Ausdruck? Es scheint so, als würde es so sein, da sich dies nur in eine Reihe von Vergleichen mit konstanten Zuordnungen ausrollen wird. Wenn nicht, wie würde ich das schreiben, um das zu erreichen?

+3

Haben Sie versucht, diesen Code in einer tatsächlichen Synthese und Umsetzung Workflow? Ein Blick auf die RTL- und Technologie-Schemata, wie sie von ISE bereitgestellt werden, sowie bei allen Synth-Tool-Ausgaben oder Warnungen kann sehr hilfreich sein. – hexafraction

Antwort

1

Nein. Stellen Sie sich vor, dass Sie dies ausrollen und es von Hand eingeben. Die Faust zwei Linien verursachen würden ein mehrfach angetrieben net:

assign match[0] = (entry[0] == 0); 
assign match[0] = (entry[1] == 0); 

Wenn Sie jedoch die erzeugt loszuwerden und diesen Block im Innern einer immer mit Schleifen tun, dann wird es funktionieren:

always_comb begin 
    for(int i = 0; i < MAX; i = i + 1) begin: gen_blah 
    for(int j = 0; j < MAX; j = j + 1) begin: gen_foo 
     match[i] = (entry[j] == i); 
    end 
    end 
end 

Innerhalb dieses Blockieren Sie mehrere Zuweisungen auf den gleichen Wert, aber der letzte "gewinnt". Ich bin mir nicht sicher, was Sie mit Ihrem Code erreichen möchten, damit die Funktion, die Sie suchen, nicht funktioniert. Wenn Sie sehen wollen, wenn eine der Einträge gleich i dann sollten Sie es ändern:

always_comb begin 
    for(int i = 0; i < MAX; i = i + 1) begin: gen_blah 
    match[i]=0; 
    for(int j = 0; j < MAX; j = j + 1) begin: gen_foo 
     match[i] = match[i] || (entry[j] == i); 
    end 
    end 
end