【问题标题】:How to use const in verilog如何在verilog中使用const
【发布时间】:2011-05-01 14:43:51
【问题描述】:

而不是使用

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

【问题讨论】:

    标签: constants verilog hdl system-verilog


    【解决方案1】:

    你有几个选择:

    • 带有`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 
    

    【讨论】:

    • SystemVerilog 还提供了一个构造 const 来将任何数据类型的变量值声明为常量。
    【解决方案2】:

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

    与 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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-07-15
      • 1970-01-01
      • 1970-01-01
      • 2016-02-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多