2013-07-26 14 views
1

我正在使用生成塊來創建流水線多路複用器: 有沒有辦法在case語句中參數化個案?在參數中定義的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 
    [email protected](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 
+1

請顯示更多代碼。目前還不清楚'pipelineStage'是如何在生成for循環中使用的。什麼是'i'的數據類型? – Greg

+0

答案是肯定的。此外,有多種方法可以做到這一點。然而,正如摩根在他的回答中聲明的那樣,RTL模型應該獨立於您的技術庫 - 它是綜合工具的功能,可將您的抽象RTL描述映射到lib單元中。要麼不這樣做,要麼更詳細地解釋爲什麼你需要這個功能。此外,您提供的代碼(如現在看起來)是沒有意義的。 – Vasiliy

回答

0

即使用產生看起來不很乾淨,我會帶你試圖包裹起來,並把它變成代碼一個子模塊。然後生成可以創建子模塊的多個實例並將其連接起來。然後生成可以根據實例的需要設置參數。這將問題分解爲生成,然後模塊正確地縮放。

怎麼能寫這樣的代碼,這樣,如果一個不同的技術只能實現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 

NB:如果從它們被解釋爲十進制值的情況下聲明(可能整數寬度)除去的寬度和位置。下面是有效的:我通常不會這樣做,但在選擇的寬度可以基於參數改變的上下文中可能有意義。

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