Ширина регистра verilog RTL определена в параметре?

Я использую блок генерации для создания конвейерного мультиплексора: есть ли способ параметризовать случаи в операторе 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

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

person Joe Baker    schedule 26.07.2013    source источник
comment
Пожалуйста, покажите больше вашего кода. Неясно, как pipelineStage предназначен для использования внутри цикла генерации for. Каков тип данных i?   -  person Greg    schedule 27.07.2013
comment
Ответ ДА. Кроме того, существует более одного способа сделать это. Однако, как заявил Морган в своем ответе, модель RTL должна быть независима от ваших технических библиотек - функция инструмента синтеза заключается в отображении вашего абстрактного описания RTL в ячейки lib. Либо не делайте этого, либо объясните подробнее, зачем вам этот функционал. Кроме того, предоставленный вами код (как он выглядит сейчас) бессмысленен.   -  person Vasiliy    schedule 01.08.2013


Ответы (1)


Это использование 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

NB: если вы удалите ширину и основание из операторов 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
person Morgan    schedule 29.07.2013