【问题标题】:Verilog: How to define parameters in a generate block and access them outside?Verilog:如何在生成块中定义参数并在外部访问它们?
【发布时间】:2021-05-27 06:09:15
【问题描述】:

我想定义一些本地参数,其值由在该模块外部分配的参数决定。在这里,我使用了一个生成块。就像下面这样:

module doppler_fft_cluster # (
  parameter CORE_TYPE = "DOPPLER_FFT_D0"
) (
  clk, rst_,
  i_tvalid, i_tdata, i_tready, i_tlast
  // and more ports
);

input clk;
input rst_;

generate
  case (CORE_TYPE)
    "DOPPLER_FFT_D0": begin
      localparam FFT_XN_DATA_WIDTH = 42;
      localparam FFT_XK_DATA_WIDTH = 66;
      localparam FFT_LENGTH = 2048;
    end
    "DOPPLER_FFT_D1": begin
      localparam FFT_XN_DATA_WIDTH = 64;
      localparam FFT_XK_DATA_WIDTH = 66;
      localparam FFT_LENGTH = 512;
    end
  endcase
endgenerate

input  i_tvalid;
input  i_tdata;
output i_tready;
input  i_tlast;
input  [FFT_XN_DATA_WIDTH-1:0] i_tdata;  // Boom!

// ... ...

endmodule

我曾尝试使用 ModelSim 模拟此模块,但它显示那些本地参数未定义。

Error: ./demo.v(31): (vlog-2730) Undefined variable: 'FFT_XN_DATA_WIDTH'.

这个localparams好像不能进入模块级作用域。

那么,如何在模块级别访问它们?或者,有没有其他方法可以实现这样的东西?

更新 0616

我最终选择 Ehab Ibrahim 的方法,因为我的项目需要 Xilinx ISE 或 XST 合成器,它不能接受带有点语法的 parameterlocalparam 分配。但是,如果您没有遇到 EDA 工具的限制,请随意尝试 dave_59 的方法。

谢谢!

【问题讨论】:

    标签: parameters verilog modelsim


    【解决方案1】:

    错误的原因是您在未命名的begin/end 块中定义了localparams。你需要给它们一个名字才能从外部访问它们。

    module doppler_fft_cluster # (
      parameter CORE_TYPE = "DOPPLER_FFT_D0"
    ) (
      clk, rst_,
      i_tvalid, i_tdata, i_tready, i_tlast
      // and more ports
    );
    case (CORE_TYPE)
        "DOPPLER_FFT_D0": begin : FFT
          localparam XN_DATA_WIDTH = 42;
          localparam XK_DATA_WIDTH = 66;
          localparam LENGTH = 2048;
        end
        "DOPPLER_FFT_D1": begin : FFT
          localparam XN_DATA_WIDTH = 64;
          localparam XK_DATA_WIDTH = 66;
          localparam LENGTH = 512;
        end
    endcase
    input clk;
    input rst_;
    input  i_tvalid;
    input  i_tdata;
    output i_tready;
    input  i_tlast;
    input  [FFT.XN_DATA_WIDTH-1:0] i_tdata;  // Boom!
    
      initial $display("%m FFT.LENGTH = ", FFT.LENGTH);
    endmodule
    
    module top;
      doppler_fft_cluster #()                 D0(,,,,,);
      doppler_fft_cluster #("DOPPLER_FFT_D1") D1(,,,,,);
    endmodule
    

    【讨论】:

      【解决方案2】:

      您不需要在 generate 语句中定义本地参数。有几种方法可以解决这个问题,您可以像这样以 if-else 方式定义本地参数:

      localparam FFT_XN_DATA_WIDTH = (CORE_TYPE=="DOPPLER_FFT_DO") ? 42 
                                   : (CORE_TYPE=="DOPPLER_FFT_D1") ? 64
                                   : 24;     // Equivalent to case "default"
      localparam FFT_XK_DATA_WIDTH = (CORE_TYPE=="DOPPLER_FFT_DO") ? 66 
                                   : (CORE_TYPE=="DOPPLER_FFT_D1") ? 66
                                   : 24;     // Equivalent to case "default"
      localparam FFT_LENGTH        = (CORE_TYPE=="DOPPLER_FFT_DO") ? 2048 
                                   : (CORE_TYPE=="DOPPLER_FFT_D1") ? 512
                                   : 256;     // Equivalent to case "default"
      

      或者,如果太复杂,您可以定义一个实现该功能的函数,并使用本地参数实例化调用该函数:

      function automatic int get_xn_width(input string core_type); 
          if(core_type == "DOPPLER_FFT_DO")       return 42; 
          else if(core_type == "DOPPLER_FFT_DO")  return 64; 
          else                                    return 24; 
      endfunction
      
      // Define similar functions for the other local parameters 
      
      module doppler_fft_cluster # (
        parameter CORE_TYPE = "DOPPLER_FFT_D0"
      ) (
        clk, rst_,
        i_tvalid, i_tdata, i_tready, i_tlast
        // and more ports
      );
          // port definitions
      -------------
          localparam FFT_XN_DATA_WIDTH = get_xn_width(CORE_TYPE);
          // Same for other localparams
      -------------
          // Rest of module
      endmodule
      

      【讨论】:

        猜你喜欢
        • 2019-10-06
        • 1970-01-01
        • 1970-01-01
        • 2019-03-29
        • 2022-01-05
        • 1970-01-01
        • 2017-03-20
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多