在 if else 条件下使用 Verilog 参数
Using Verilog parameters in if else conditions
考虑以下 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 成为一个参数并根据上述参数设置其值?
我正在使用 Xilinx Vivado 综合上述代码。 (它必须能够合成)
谢谢。
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));
试试这种编码方式。它可能有逻辑错误,但它是综合的。
考虑以下 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 成为一个参数并根据上述参数设置其值?
我正在使用 Xilinx Vivado 综合上述代码。 (它必须能够合成)
谢谢。
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));
试试这种编码方式。它可能有逻辑错误,但它是综合的。