Pregunta

En lugar de usar

module ... ( .. )  ;

     #15 
endmodule

Quiero usar

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

endmodule

O lo mismo

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

endmodule

¿Puedo hacer ese deseo en Verilog?

¿Fue útil?

Solución

Tienes algunas opciones:

  • Macros con `defines
  • parameters
  • localparams

Aquí hay un pequeño ejemplo con todos ellos.

`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 

Otros consejos

Para los casos que enumeró, recomendaría parámetros.

Al igual que la Directiva del compilador C, `Definir es global para la compilación. Si su código alguna vez se utilizará con el código que no controle, deberá tener cuidado aquí.

Los parámetros siempre son locales para el alcance del módulo, por lo que los parámetros nombrados idénticamente en diferentes elementos de diseño no entrarán en conflicto entre sí. También tienen la ventaja de que pueden ser anulados por instancia.

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
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top