1

我正在使用生成块来创建流水线多路复用器:有没有办法在案例语句中对案例进行参数化?

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

我的目标技术中的 SELECT_BITS_PER_STAGE 是 2,所以情况是 2 位宽 00, 01, 10 , 11

如何编写此代码,以便如果不同的技术只能实现 2 比 1 多路复用器(SELECT_BITS_PER_STAGE == 1),case 语句会自动更改为:

case (    )
 1'b0: /* do something */
 1'b1: /* do something different
endcase
4

1 回答 1

0

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

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

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

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

如果您的意思是可以基于参数扩展其功能的 RTL,那么我将对 MSB 进行零填充,select以便 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 语句中删除宽度和基数,它们将被解释为十进制值(可能是整数宽度)。下面是有效的:我通常不会这样做,但在选择的宽度可以根据参数改变的情况下可能有意义。

    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
于 2013-07-29T06:54:58.533 回答