2016-05-06 5 views
-1

Ich versuche, einen C++ Code in Verilog HDL zu ändern. Ich möchte ein Modul schreiben, das einen seiner Eingänge ändert. (einige, wie Aufruf durch Referenz in C++) wie ich weiß, gibt es keine Möglichkeit, einen Aufruf von Referenzmodul in Verilog schreiben (ich kann nicht Systemverilog verwenden) Hier ist ein Code, den ich geschrieben habe und es funktioniert. Gibt es bessere Möglichkeiten, dies zu tun ?! mein Problem ist, dass das Register, das ich als Referenz aufrufen möchte, ein großes Array ist. Auf diese Weise werden die Register dupliziert und die Kosten sind hoch.Anruf per Referenz in Verilog-Code

module testbench(); 
reg a; 
wire b; 
reg clk; 
initial begin 
    a = 0; 
    clk = 0; 
    #10 
    clk = 1; 
end 

test test_instance(
    .a(a), 
    .clk(clk), 
    .aOut(b) 
    ); 

[email protected](*)begin 
     a = b; 
end 
endmodule 



module test(
    input a, 
    input clk, 
    output reg aOut 
    ); 
    always @(posedge clk) begin 
     if (a == 0)begin 
      a = 1; 
      aOut = a; 
     end 
    end 

endmodule 
+3

Sie müssen viel mehr Informationen über Ihre "Anforderungen" bereitstellen. Ich nehme an, Sie versuchen, einen Softwarealgorithmus in Hardware zu übersetzen. Eine direkte Übersetzung des Verfahrensablaufs wird höchstwahrscheinlich nicht funktionieren. Warum können Sie SystemVerilog auch nicht verwenden? –

+0

Ja Ich versuche, einen Softwarealgorithmus in HDL zu übersetzen. Der Algorithmus ist so kompliziert, dass ich ihn nicht auf Hardware umstellen kann. also sollte ich es Zeile für Zeile ändern zu HDL-Code – Mehdi

+0

Angesichts Ihrer Antwort unter ("logic area"), es klingt wie Ändern Ihres Algorithmus zu Hardware ist _exactly_, was Sie versuchen. Und wenn Sie HDL-Code für die Implementierung auf einem FPGA oder IC schreiben, ist das Entwerfen von Hardware _exactly_ was Sie tun. Sie müssen beginnen, Ihren Algorithmus in Hardware zu konvertieren und dann das in Ihrem HDL zu kodieren. Ein HDL ist keine Möglichkeit, das Entwerfen von Hardware zu vermeiden. Es gibt Tools, die C-Code in HDL-Code/Hardware umwandeln, aber sie sind keine schnelle Lösung - Sie müssen ziemlich viel üben, bevor Sie die gewünschten Ergebnisse erhalten. –

Antwort

1

Verilog ist kein Software Programmiersprache; es ist eine Hardware Beschreibung Sprache. Die Eingänge zu einem Modul sind Metallteile (Drähte, Spuren, Stifte); Die Ausgänge eines Moduls sind Metallteile. Wenn Sie einen Port haben wollen, der sowohl ein Eingang als auch ein Ausgang ist, können Sie einen inout verwenden. inout Ports sind jedoch am besten zu vermeiden; Es ist normalerweise viel besser, separate Ein- und Ausgänge zu verwenden.

Ein Verilog Modul ist keine Softwarefunktion. Nichts wird auf die Eingänge kopiert; Von den Ausgaben wird nichts kopiert. Ein Verilog-Modul ist ein Klumpen von Hardware: es hat Eingaben (Metallstücke, die Information in sich tragen) und Ausgaben (Metallstücke, die Information hinaustragen).

Sie haben recht, wenn Sie sagen, dass Sie in SystemVerilog entweder "Pass-by-Copy" oder "Pass-by-Reference" verwenden können. Wenn Sie eine große Datenstruktur in eine Funktion oder in eine/aus einer Aufgabe überführen möchten, kann die Weitergabe als Referenz die Simulationszeit einsparen.

+0

thanx, ich weiß. Du hast recht. Wie Sie sehen können, habe ich zwei verschiedene Input und Input des Moduls, um das zu tun. Aber ich möchte wissen, gibt es einen besseren Weg, um das mit ein wenig Kosten zu tun – Mehdi

+2

Eigentlich hat SystemVerilog durch Referenz für Modul-Ports übergeben. Aber das wird dieser Person nicht helfen. –

+0

Danke @ dave_59. Tatsächlich klingelt eine Finte Glocke. Ich sollte das besser überarbeiten. –

0

Durch Verweis bedeutet Adresse, so dass dies direkt in hdl übersetzt werden muss, müssen Sie entweder eine Möglichkeit für das Modul bereitstellen, auf diesen Bus zuzugreifen und Transaktionen basierend auf dieser Adresse auszuführen.

Oder besser, wenn Sie dies als eine Eingabe benötigen, nehmen Sie jedes der Elemente in der Struktur und machen Sie individuelle Eingaben von ihnen. Wenn es als Verweis übergeben wird, weil es sich um eine Ausgabe oder auch um eine Ausgabe handelt, erstellen Sie für jedes der Elemente in der Struktur individuelle Ausgaben. Das Modul unterscheidet dann zwischen der Eingabeversion dieses Unterelements und der Ausgabeversion dieses Unterelements.

my.thing.x = mein.thing.x + 1;

wird so etwas wie

my_thing_x_output = my_thing_x_input + 1;

+0

bist du sicher, dass dies funktioniert?! Kannst du meine Probe neu erstellen ?! – Mehdi

+0

Wie denken Sie, Hardware oder Software-Module/Funktionen funktionieren? Ein- und Ausgänge, und das Modul/die Funktion modifiziert den Eingang, um eine Ausgabe zu machen. Warum sollte das nicht funktionieren? –

Verwandte Themen