3

私はVerilogでいくつかのハードウェアを設計していますが、物事を柔軟に保つために、パラメーターを使用して幅を設定し、コードを変更せずに必要に応じて幅を変更できるようにしています。私が遭遇した問題の1つは、複数のセルへの並列書き込みを実行できるようにしたいコードのセクションにあります。

parameter DATA_WIDTH = 16;
parameter BUFFER_SIZE = 16;
parameter LOAD_WIDTH = DATA_WIDTH*BUFFER_SIZE;

input [LOAD_WIDTH-1:0] i_load_data;

reg [DATA_WIDTH-1:0]    r_data_buf[BUFFER_SIZE-1:0];

...

always@(posedge clk) begin
....
    else if (i_load_flag) begin
        for(i = 0; i < BUFFER_SIZE; i = i + 1)
            r_data_buf[i] <= i_load_data[i * BUFFER_SIZE + BUFFER_SIZE - 1:i * BUFFER_SIZE];
    end
end

データの読み取り方法のため、r_data_bufを配列として保持する必要があります。また、コンパイル時にすべてが一定であるため、Verilogがこのコードを好まない理由や、修正して希望の動作を維持する方法もわかりません。

4

1 に答える 1

7

Verilogコンパイラは、xとyの両方がパラメータに依存するi_load_data [x:y]を検出するため、不満があります。そのため、幅が変更される可能性があります(ただし、あなたの場合は不可能です)。

これを修正する簡単な方法がいくつかあります。

  1. +:演算子を使用して幅を指定します。(タイプミスのように見えたため、BUFFER_SIZEもDATA_WIDTHに変更しました。)このフォームでは、LSBのインデックスと選択するデータの幅を指定します。

    r_data_buf[i] <= i_load_data[i * DATA_WIDTH  +: DATA_WIDTH];
    
  2. 追加のforループを使用して、各ビットを個別に設定します

    for(i = 0; i < BUFFER_SIZE; i = i + 1)
    begin
        for(j = 0; j < DATA_WIDTH; j = j + 1)
        begin
            r_data_buf[i][j] <= i_load_data[i * DATA_WIDTH  + j];
        end
    end
    
于 2012-04-10T18:49:51.770 に答える