2016-09-12 4 views
-1

Wenn ich es in einem Programm verwendete, wurde ein Fehler generiert ($clog2 wird nicht unterstützt). Aber ich sehe unsere StackOverflowers mit $clog2 Aufgabe in ihrem Programm. Bitte sagen Sie mir, wie man das benutzt.

+1

Um Ihr spezifisches Problem zu beheben, können Sie Ihren Simulator wahrscheinlich anweisen, Ihren Code als SystemVerilog zu behandeln. Ich weiß nicht, welches Werkzeug Sie verwenden, aber das Hinzufügen von etwas wie "-sv" zum Befehl könnte den Trick tun. – nguthrie

Antwort

3

$clog2 wird von Verilog nicht unterstützt. Es ist eine Systemaufgabe SystemVerilog. Darüber hinaus sind Systemaufgaben nicht synthetisierbar.

Sie können jedoch eine Funktion/Makro machen, die den log bsae 2 Wert einer gegebenen Zahl ausgibt. Hier sind einige der Beispiele von benutzerdefinierten Implementierung:

Mit Makro:

`define CLOG2(x) \ 
    (x <= 2) ? 1 : \ 
    (x <= 4) ? 2 : \ 
    (x <= 8) ? 3 : \ 
    (x <= 16) ? 4 : \ 
    (x <= 32) ? 5 : \ 
    (x <= 64) ? 6 : \ 
    ..etc, .. 
    (x <= 4294967296) ? 32 : \ 
    -1 

parameter MAX_VALUE = 42; 
parameter MAX_WIDTH = `CLOG2(MAX_VALUE); 

Mit function:

function [31:0] log2; 
    input [31:0] value; 
    integer i; 
    reg [31:0] j; 
    begin 
     j = value - 1; 
     log2 = 0; 
     for (i = 0; i < 31; i = i + 1) 
     if (j[i]) log2 = i+1; 
    end 
endfunction 

initial 
begin 
    $display("10 = %d", log2(10)); 
end 

Sowohl die obigen Beispiele führt zu synthetisierbaren Code. Der Benutzer kann diesen Code gemäß der maximalen Bitbreitenanforderung erweitern.

Sie können also entweder den Compiler ändern, um SystemVerilog-Code zu kompilieren, oder die obige Funktion implementieren, um einen benutzerdefinierten Protokollcode zu erstellen.

+1

Obwohl im Allgemeinen eine SystemVerilog-Erweiterung betrachtet wird, wurde "$ clog2" zu Verilog in IEEE Std 1364-2005 – Greg

+1

Yep hinzugefügt. Danke für die Klarstellung. AFAIK, es war kein Teil von Verilog 1364-2001. – sharvil111

3

$clog2wird unterstützt von Verilog, aber nur Verilog-2005 (IEEE Std 1364-2005). Da Verilog-2005 zur selben Zeit wie IEEE SystemVerilog veröffentlicht wurde, wird es allgemein als SystemVerilog-Erweiterung betrachtet. Hier sind zwei Quelle $clog2 als Verilog-2005-Funktion zu dokumentieren:

Der Verilog-2005 war vor allem ein Zwischen Release für eventuelle Fusion von Verilog und SystemVerilog (was in IEEE Std 1800-2009 passiert). Einige Simulatoren haben Verilog-2005 möglicherweise nicht implantiert, da alles in SystemVerilog enthalten ist. Wenn Ihr Simulator Verilog-2005 nicht standardmäßig ausführt, lesen Sie in Ihrem Handbuch nach, das möglicherweise eine Option zum Aktivieren enthält. Das Aktivieren von SystemVerilog ist eine weitere Option oder Benutzermethoden wie in der Lösung von sharvil111 beschrieben.