Использование параметров 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 параметром и установить его значение на основе вышеупомянутых параметров?

Я использую Xilinx Vivado для синтеза приведенного выше кода. (Его нужно уметь синтезировать)

Спасибо.


person user2389323    schedule 07.05.2016    source источник
comment
Кстати, для моделирования плохо использовать always @(*) только с параметрами в всегда блоке. Поскольку параметры никогда не меняются, блоку не к чему быть чувствительным, и блок никогда не выполняется. SystemVerilog решает эту проблему с помощью конструкции always_comb, которая гарантирует выполнение блока хотя бы один раз в течение времени 0.   -  person dave_59    schedule 07.05.2016
comment
Спасибо за вашу ценную информацию   -  person user2389323    schedule 07.05.2016


Ответы (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));

Попробуйте этот тип кодирования. Это может иметь логическую ошибку, но это синтез.

person Prakash Darji    schedule 07.05.2016