2013-11-14 3 views
0

Для расчета сигнала разрешения я написал следующий рабочий код.Параметры SystemVerilog для функции или функции

logic   l_en [0:N-1]; 
logic [0:N-1] l_output_grant [0:M-1]; 

always_comb begin 
    for (int i=0; i<N; i++) begin 
    l_en[i] = |{l_output_grant[0][i], 
        l_output_grant[1][i], 
        l_output_grant[2][i], 
        l_output_grant[3][i], 
        l_output_grant[4][i]}; 
    end 
end 

Теперь я пытаюсь изменить код на параметр [0] - [4]. Я пробовал следующий код

logic   l_en [0:N-1]; 
logic [0:N-1] l_output_grant [0:M-1]; 

always_comb begin 
    for(int i=0; i<N; i++) begin 
    for(int j=0; j<M; j++) begin 
     l_en[i] = |l_output_grant[j][i]; 
    end 
    end 
end 

Какой из них не работает. Я предполагаю, что это происходит из-за того, что он пересчитывает каждую итерацию j и, таким образом, очищает разрешение, назначенное [j] [i], если [j + 1] [i] является низким.

Какие еще способы я могу сделать это, пожалуйста?

+1

Являются ли l_en и l_output_grant также параметризованы для N и M? или их объявления независимы? Пожалуйста, покажите свои заявления. –

+0

Да, они есть. Я редактировал. – user2646276

ответ

1

l_en[i] = |l_output_grant[j][i] переопределяет назначение предварительного просмотра. Кроме того, |l_output_grant[j][i] бит-бит или оператор к биту сигнала, который ничего не делает.

Для желаемой функциональности используйте операционный бит |=; l_en |= l_output_grant[j]. В качестве альтернативы используйте традиционный метод Verilog l_en = l_en | l_output_grant[j]. Не забудьте очистить старые значения, назначив l_en всем нулям перед циклами for. Неспособность очистить значения приведет к появлению защелок и предотвращению любого перехода с высокой до низкой. Поскольку ширина соответствует петле for(i=...), не требуется.

always_comb begin 
    l_en = '0; // all bits to zero 
    for(int j=0; j<M; j++) begin 
    l_en |= l_output_grant[j]; 
    // equivalent to: l_en[0:N-1] = l_en[0:N-1] | l_output_grant[j][0:N-1]; 
    end 
end 

Примечание: Используйте стиль Verilog, если синтезаторов не поддерживает |= оператора. Симулятор будет поддерживать оператора, если поддерживается SystemVerilog.

+0

Спасибо, хотя с первого взгляда я не думаю, что этот код берет в транспозиции. Мое намерение состоит в том, что у меня есть N разрешающих сигналов, и что i-я разрешающая способность высока, если i-й бит какого-либо из M упакованных выходных грантов высок. Возможно, я ошибаюсь, завтра я проверю. Спасибо. – user2646276

+0

Работает, см. Пример: http://www.edaplayground.com/s/6/379. Мне пришлось удалить какой-то СВ из-за пределов Икара. Ключевые моменты работают. – Greg

+0

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

Смежные вопросы