Как использовать const в Verilog - PullRequest
8 голосов
/ 01 мая 2011

Вместо использования

module ... ( .. )  ;

     #15 
endmodule

Я хочу использовать

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

endmodule

Или то же самое

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

endmodule

Могу ли я сделать это желание в verilog?

Ответы [ 2 ]

19 голосов
/ 01 мая 2011

У вас есть несколько вариантов:

  • Макросы с `define с
  • parameter с
  • localparam S

Вот небольшой пример со всеми ними.

`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 
4 голосов
/ 02 мая 2011

Для перечисленных вами случаев я бы порекомендовал параметры.

Как и директива компилятора C, `define является глобальным для компиляции.Если ваш код когда-либо будет использоваться с кодом, который вы не контролируете, вам нужно быть здесь осторожным.

Параметры всегда локальны для области видимости модуля, поэтому идентичные имена параметров в разных элементах дизайна не будут конфликтоватьдруг с другом.У них также есть преимущество в том, что они могут быть переопределены для каждого отдельного экземпляра.

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
...