参数中定义的verilog RTL“case”宽度?

参数中定义的verilog RTL“case”宽度?,case,verilog,parameterized,Case,Verilog,Parameterized,我正在使用generate块创建流水线mux: 有没有办法在case语句中参数化case module muxNto1byW( input clk, input reset, input wire[(SELECT_WIDTH-1):0] select, input wire[(DATA_WIDTH*NUM_IN

我正在使用generate块创建流水线mux: 有没有办法在case语句中参数化case

module  muxNto1byW(
  input                                     clk,
  input                                     reset,
  input   wire[(SELECT_WIDTH-1):0]          select,
  input   wire[(DATA_WIDTH*NUM_INPUTS-1):0] din,
  output  reg[(DATA_WIDTH-1):0]             y
);

/* 4 LUT_WIDTH = 6, SEL DATA_INPUTS = 2 */
parameter SELECT_WIDTH = LUT_WIDTH - DATA_INPUTS; 

...

generate 

/* some for loops */

    //  register this stage's muxes  
    reg[(DATA_WIDTH-1):0] pipelineStage;

    //  assign values to each mux in this stage
    always@(posedge reset or posedge clk)
      if( reset )
        pipelineStage <= {DATA_WIDTH{1'b0}};
      else
      begin
      if( i == 0 )          // Stage 0 evaluates the inputs
        case ( select[(SELECT_BITS_PER_STAGE-1):0] )
          2'b00 : /* do something */
          2'b01 : /* do something different */
          2'b10 : /* you get the picture */
          2'b11 : /* the last case */
        endcase
endgenerate

generate的使用看起来不是很干净,我会将您试图包装的代码转换成一个子模块。然后,generate可以对子模块进行多个实例化,并将它们连接起来。然后,generate可以根据需要在实例上设置参数。这将问题分解为生成,然后再正确缩放模块

如果不同的技术只能实现2对1的多路复用,如何编写此代码

对我来说,这是一个有点令人困惑的说法。您是指根据可用于合成的库更改RTL吗?综合将能够从可用的2到1个多路复用器中实现隐含逻辑,将其中的3个多路复用器组合起来创建一个4到1的多路复用器

RTL应该独立于用于合成的库,其可移植性是一个优势

如果您指的是可以基于参数扩展其功能的RTL,那么我将对select的MSB进行零填充,以使case语句不受影响,但具有无法访问的状态除外

parameter SELECT_BITS_PER_STAGE = 1;
localparam SELECT_MAX_WIDTH     = 2;

localparam SELECT_EXTEND_BY = SELECT_MAX_WIDTH-SELECT_BITS_PER_STAGE;

wire select_ext = { {SELECT_EXTEND_BY{1'b0}}, select};

alway @* begin //just putting case statement in valid syntax
//...
    case ( select_ext )
      2'b00 : /* do something */
      2'b01 : /* do something different */
      2'b10 : /* you get the picture */
      2'b11 : /* the last case */
      default : /* catch all when select larger than 2 bits */
    endcase
//...
end
注意:如果从case语句中删除width和base,它们将被解释为十进制值,可能是整数width。下面是有效的:我通常不会这样做,但在select的宽度可以根据参数更改的上下文中可能有意义

    case ( select_ext )
      0 : /* do something */
      1 : /* do something different */
      2 : /* you get the picture */
      3 : /* the last case */
      default : /* catch all when select larger than 2 bits */
    endcase

请显示更多的代码。目前尚不清楚pipelineStage打算如何在generate for循环中使用。i的数据类型是什么?答案是肯定的。此外,实现这一点的方法不止一种。然而,正如Morgan statet在他的回答中所说,RTL模型应该独立于您的技术库——它是合成工具的功能,用于将抽象RTL描述映射到库单元中。要么不这样做,要么更详细地解释为什么需要此功能。而且,您提供的代码现在看起来毫无意义。
    case ( select_ext )
      0 : /* do something */
      1 : /* do something different */
      2 : /* you get the picture */
      3 : /* the last case */
      default : /* catch all when select larger than 2 bits */
    endcase