2016-11-10 3 views
1

In einem System Verilog-Design, habe ich ein Top-Modul, Sub-Modul und ein Sub-Sub-Modul. Sub-Sub-Modul in dem Submodul in oberem module.Top Modul instanziiert instanziiert auch eine Instanz von Sub-Sub Modul.Verfahren Hierarchiebaum weist unterhalbSystem Verilog Deaktivieren `ifndef Blöcke in bestimmten Fällen

enter image description here

Die Sub-Sub-Modul Definition hat einen Code dargestellt in einer schriftlichen ‚IFNDEF wie diese

module sub_sub() 
{ 
........... 
`ifndef OFF 
<code to avoid> 
`endif 
........... 
} 

blockieren Wie kann ich den Code zu vermeiden nur in Sub-Sub-Modul instance1 während der Kompilierung zu deaktivieren? Ich habe `define OFF in Sub-Modul-Instanz verwendet, aber es deaktiviert -Code, um von allen Instanzen zu vermeiden.

Antwort

1

Der Bereich von `define macros, und die meisten anderen Compiler-Direktiven ist eine Kompilierungseinheit. Eine Kompilierungseinheit ist ein Quelltextfluss, den ein Compiler analysiert. Ein Makro wird an dem Punkt definiert, an dem es in der Übersetzungseinheit erscheint und von diesem Punkt an sichtbar ist.

Die von Modulen und anderen Namespaces definierten Bereiche sind irrelevant, da Makros vorverarbeitet werden, bevor eine Verilog- oder SystemVerilog-Syntax erkannt wird. Dies bedeutet, dass Sie nie über eine instanzspezifische Kontrolle über Makrodefinitionen verfügen können.

Wenn Sie eine instanzspezifische Kontrolle über Ihren Code wünschen, müssen Sie Parameter mit instanzspezifischen Überschreibungen definieren. Dann können Sie generate-if/case-Konstrukte verwenden, um den Code zu steuern, den Sie ausführen möchten. Wenn das generate-Konstrukt für Sie zu restriktiv ist, können Sie procedural-if/case-Anweisungen verwenden, und die Optimierung entfernt Zweige, die aufgrund konstanter Parameter nicht übernommen wurden.

2

Die sauberere Lösung besteht darin, einen Parameter zu übergeben und eine generate-if/case-Anweisung zu verwenden. Beispiel:

module sub_sub #(parameter OFF=0) (...); 
    generate 
    if (OFF) begin 
     <code to avoid> 
    end 
    endgenerate 
endmodule 

module sub (...); 
    ... 
    sub_sub #(.OFF(1'b1)) inst (...); 
endmodule 

module top (...); 
    ... 
    sub inst0 (...); 
    sub_sub #(.OFF(1'b0)) inst1 (...); 
endmodule 

Technisch das die if (OFF) muss nicht explizit sein generate-endgenerate; es wird anders gefolgert. Es wird für die menschliche Lesbarkeit empfohlen.

Für vollständige Einzelheiten über Blöcke erzeugen, siehe IEEE Std 1800-2012 § 27. Konstrukte generieren

0

Der beste Weg ist Ihr sub_sub Modul mit dem Parameter zu modifizieren, wie in anderen Antworten vorgeschlagen. Dies ist jedoch möglicherweise nicht praktikabel, wenn Sie das Modul sub_sub nicht bearbeiten/ändern können, z. B. kann es sich um eine verschlüsselte IP-Adresse handeln.

In diesem Fall besteht eine Lösung darin, ein verschachteltes Wrapper-Modul für jedes sub_sub-Modul zu erstellen. Sie können wie folgt tun:

// Wrapper for sub_sub with OFF defined 
module sub_sub_wrapper1; 
    `define OFF 
    `include "sub_sub.v" 
    `undef OFF 
endmodule 

// Wrapper for sub_sub without OFF defined 
module sub_sub_wrapper2; 
    `include "sub_sub.v" 
endmodule 

//////////////// 

module sub; 
    sub_sub_wrapper1 subsub1(); 
endmodule 

module top; 
    sub sub1(); 
    sub_sub_wrapper2 subsub2(); 
endmodule 

Quick sample

In diesem Fall natürlich gehe ich davon aus Sie in der Lage sind Ihre top und sub Modul zu bearbeiten. Beachten Sie, dass das verschachtelte Modul nur in system-verilog unterstützt wird.

Verwandte Themen