次の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にパラメータを設定し、上記のパラメータに基づいて値を設定するにはどうすればよいですか?
私はザイリンクスビバードを使用して上記のコードを合成しています。 (合成可能でなければならない)
ありがとう。
ところで、シミュレーションでは、常にブロック内のパラメータだけで 'always @(*)'を使用するのは悪いです。パラメータは決して変更されないので、ブロックが敏感であることは何もなく、ブロックは決して実行されません。 SystemVerilogはこれを 'always_comb'構造体で解決します。この構造体は時間0の間にブロックを少なくとも1回実行することを保証します。 –
貴重な情報ありがとう – user2389323