2015-12-07 1 views
0

У меня есть массив размером 2400. Я хочу иметь возможность обновлять определенный бит в этом массиве на основе комбинационной логики, которая определяет индекс этого бита.SystemVerilog: нужно изменить 2 бита в очень большом массиве

Доступ к биту напрямую дает мне ошибку с несколькими драйверами из-за того, что уже назначил массив начальному значению, и после попытки реализовать конечный автомат я нашел его почти невозможным из-за того, что ему потребовалось предыдущее значение всего массив. т.е.: Нельзя назначать диапазоны с переменной.

logic [0:2400] big_array; 
assign big_array = {ALL BITS ASSIGNED}; 
//Here is where I want to be able to update 
logic [11:0] index; 
//INDEX Determined via logic 
assign big_array[index] = 1'b0; 

Любая помощь была бы замечательной!

Примечание: Я уверен, что смогу выполнить это через некоторый тип конечного автомата, потому что я назначаю исходное значение, но я не могу понять это. Возможно ли присвоить приоритет?

Вычитание из вопросов, так как число будет слишком большим.

+0

Удалить все инструкции 'assign'. Используйте цикл 'for' в' always @ (*) 'для назначения значений всем переменным. Всякий раз, когда 'i == index' (' i' является итератором цикла), тогда присвойте '1'b0' в этом индексе. – sharvil111

+0

@ sharvil111 SystemVerilog должен использовать 'always_comb' вместо' always @ (*) ' – Greg

+0

@Greg Oh ya, событие с нулевым временем и повышенная чувствительность для функций. 'always_comb' - это хорошо. Благодарю. – sharvil111

ответ

0

Я не уверен, что это то, что вы ищете, но есть массив (вектор) 2400 бит. Учитывая индекс, который мы предположим, вы получили с помощью комбинационной логики, как вы сказали, элемент в этом индексе обновляется.

Я даю решение, предназначенное для синтезируемого RTL, поскольку вы использовали слово combinational, и я предполагаю, что вы пытаетесь синтезировать эту логику для аппаратного обеспечения.

logic [2399:0] big_array; 
logic [11:0] index; 

always_comb begin 
    // combinational logic here 
    index = ... 
end 

always_ff @(posedge clk, posedge reset) begin 
    if (reset) begin 
     big_array = '0; // vector fill operation 
    end else begin 
     big_array[index] = ...; 
    end 
end 

Я не проверял код выше для синтаксических ошибок. Кроме того, обратите внимание, что я использовал синхронизированный процесс для обновления массива, однако вы могли бы использовать какой-то другой механизм запуска, если бы вы не собирались синтезировать этот код. Аналогичным образом вы можете использовать начальную инструкцию вместо блока сброса.

Я думаю, что назначение big_array[index] = ... будет уточнять, но если нет, вы можете прокручивать все индексы, пока совпадение не будет найдено, как предлагали другие комментаторы.

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