2016-05-07 8 views
0

次のVerilogコードを検討してください。if else条件でのVerilogパラメータの使用

parameter C_SUB_WIDTH = 2; 
parameter C_SUB_HEIGHT = 2; 
parameter BIT_DEPTH = 12; 

reg [5:0] single_block_width; 

always @ (*) begin 
    if(BIT_DEPTH == 8) begin 
     case({C_SUB_HEIGHT == 1, C_SUB_WIDTH == 1}) 
      2'b00: single_block_width = 6'd16; 
      2'b10: single_block_width = 6'd16; 
      2'b11: single_block_width = 6'd24; 
      default:single_block_width = 6'dx; 
     endcase 
    end 
    else if(BIT_DEPTH == 10) begin 
     case({C_SUB_HEIGHT == 1, C_SUB_WIDTH == 1}) 
      2'b00: single_block_width = 6'd16; 
      2'b10: single_block_width = 6'd24; 
      2'b11: single_block_width = 6'd32; 
      default:single_block_width = 6'dx; 
     endcase 
    end 
    else if(BIT_DEPTH == 12) begin 
     case({C_SUB_HEIGHT == 1, C_SUB_WIDTH == 1}) 
      2'b00: single_block_width = 6'd24; 
      2'b10: single_block_width = 6'd24; 
      2'b11: single_block_width = 6'd40; 
      default:single_block_width = 6'dx; 
     endcase 
    end 
    else begin 
     single_block_width = 6'dx; 
    end 
end 

C_SUB_WIDTH、C_SUB_HEIGHTとBIT_DEPTHは全てのパラメータなので、これはsingle_block_widthになるだろう、パラメータすぎ?

もしそうでなければ、single_block_widthにパラメータを設定し、上記のパラメータに基づいて値を設定するにはどうすればよいですか?

私はザイリンクスビバードを使用して上記のコードを合成しています。 (合成可能でなければならない)

ありがとう。

+2

ところで、シミュレーションでは、常にブロック内のパラメータだけで 'always @(*)'を使用するのは悪いです。パラメータは決して変更されないので、ブロックが敏感であることは何もなく、ブロックは決して実行されません。 SystemVerilogはこれを 'always_comb'構造体で解決します。この構造体は時間0の間にブロックを少なくとも1回実行することを保証します。 –

+0

貴重な情報ありがとう – user2389323

答えて

1
parameter [5:0] SINGLE_BLOCK_WIDTH = (BIT_DEPTH == 8) ? ((C_SUB_WIDTH == 0) ? ((C_SUB_HEIGHT == 0) ? 6'd16 : 6'd16) : 6'd24) 
           : ((BIT_DEPTH == 10) ? ((C_SUB_WIDTH == 0) ? ((C_SUB_HEIGHT == 0) ? 6'd16 : 6'd24) : 6'd32) 
            : (BIT_DEPTH == 12) ? ((C_SUB_WIDTH == 0) ? ((C_SUB_HEIGHT == 0) ? 6'd24 : 6'd24) : 6'd40)); 

このタイプのコーディングを試してください。それは論理的な誤りを有するかもしれないが、合成である。

+0

ありがとうございます。これはうまくいく – user2389323