如何在verilog中使用const

发布于 2024-11-04 08:52:24 字数 435 浏览 4 评论 0原文

使​​用而不是

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中实现这个愿望吗?

Instead of using

module ... ( .. )  ;

     #15 
endmodule

I want use

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

endmodule

Or same thing

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

endmodule

Can I do that wish in verilog ?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

沫尐诺 2024-11-11 08:52:24

您有几个选择:

  • 带有 `defines
  • parameters
  • localparams

的宏这是一个包含所有这些选项的小示例。

`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 

You've a few options :

  • Macros with `defines
  • parameters
  • localparams

Here's a small example with them all.

`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 
桜花祭 2024-11-11 08:52:24

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

与 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

For the cases you listed, I would recommend parameters.

Like the C compiler directive, `define is global for the compilation. If your code is ever going to be used with code you don't control you will need to be careful here.

Parameters are always local to the module scope so identically named parameters in different design elements will not conflict with each other. They also have the advantage that they can be overridden on a per-instance basis.

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
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文