如何在verilog中使用const

8 verilog const hdl system-verilog

而不是使用

module ... ( .. )  ;

     #15 
endmodule
Run Code Online (Sandbox Code Playgroud)

我想用

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

endmodule
Run Code Online (Sandbox Code Playgroud)

或者同样的事情

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

endmodule
Run Code Online (Sandbox Code Playgroud)

我能用verilog做那个愿望吗?

Mar*_*rty 19

你有几个选择:

  • 带有`defines的宏
  • parameter小号
  • localparam小号

这是一个小例子.

`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 
Run Code Online (Sandbox Code Playgroud)


小智 5

对于您列出的情况,我会推荐参数。

与 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
Run Code Online (Sandbox Code Playgroud)