Frage

Anstatt zu verwenden

module ... ( .. )  ;

     #15 
endmodule

Ich möchte benutzen

module ... ( ... ) ;
 // GateDelay is a const, like in c language const int GateDelay = 15 ;
 # GateDelay     

endmodule

Oder das gleiche

module ... ( ... ) ;
 // assume Wordsize is defined at " define Wordsize 15 "
 reg [ Wordsize -1 : 0 ] mem ;

endmodule

Kann ich diesen Wunsch in Verilog machen?

War es hilfreich?

Lösung

Sie haben ein paar Optionen:

  • Makros mit `defines
  • parameters
  • localparams

Hier ist ein kleines Beispiel mit allen.

`define CONSTANT_MACRO 1          /* important: no ';' here */
module mymodule
    #( parameter WIDTH = 5 )
    ( 
      input wire [WIDTH-1:0] in_a,
      output wire [WIDTH-1:0] out_a
    );

    localparam CONSTANT_LOCAL = 2;

    assign out_a = in_a + `CONSTANT_MACRO - CONSTANT_LOCAL;

endmodule 

Andere Tipps

Für die aufgeführten Fälle würde ich Parameter empfehlen.

Wie die C -Compiler -Richtlinie ist "Define für die Zusammenstellung global. Wenn Ihr Code jemals mit Code verwendet wird, den Sie nicht kontrollieren, müssen Sie hier vorsichtig sein.

Parameter sind immer lokal für den Modulbereich, so dass identisch benannte Parameter in verschiedenen Designelementen nicht miteinander in Konflikt stehen. Sie haben auch den Vorteil, dass sie pro Instanzbasis überschrieben werden können.

module #(parameter DATA_WIDTH = 1) busSlave(
  input [DATA_WIDTH-1:0] bus_data,
  input                  bus_wr,
  ...
);

endmodule


module top;

  //DATA_WIDTH is 32 in this instance
  busSlave #(.DATA_WIDTH(32)) slave32(
    .bus_data(data_0),
    .bus_wr(wr_0),
    ...
    );

  //DATA_WIDTH is 64 in this instance
  busSlave #(.DATA_WIDTH(64)) slave64(
    .bus_data(data_1),
    .bus_wr(wr_1),
    ...
    );


endmodule
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top