Как создать битовые диапазоны с терминами, определенными как логика

Я понимаю, что следующий код не скомпилируется, но есть ли что-то подобное, которое компилируется?

logic [7:0] complete_set, partial_set;  
logic [2:0] msb_bit, lsb_bit;  

always_comb complete_set = <driven by a logic equation>;  
always_comb msb_bit = <driven by a logic equation>;  
always_comb lsb_bit = <driven by a logic equation>;  

always_comb partial_set[msb_bit:lsb_bit] = complete_set[msb_bit:lsb_bit];

person DarinT    schedule 10.11.2017    source источник
comment
То, о чем вы просите, не является комбинационной логикой, пока вы не укажете, какими должны быть значения битов за пределами диапазона msb/lsb.   -  person dave_59    schedule 10.11.2017
comment
Нет синтаксиса vcs, чтобы сделать это за одну операцию, вам понадобится цикл и назначайте его по крупицам. И это защелка, а не гребенка, потому что вы потенциально не назначаете все биты в одном и том же цикле моделирования.   -  person Serge    schedule 10.11.2017


Ответы (2)


Вы можете сделать некоторые побитовые решения, подобные этому. Я просто предположил, что вы захотите установить другие биты равными нулю, но вы также можете установить для него значение «безразлично» (1'bx).

for(i = 0; i < 8; i = i + 1) begin
    partial_set[i] = (i < lsb_bit) || (i > msb_bit) ? 1'b0 : complete_set[i];
end
person samuelnj    schedule 10.11.2017

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

   always_comb partial_set = complete_set & (2**(msb_bit+1-lsb_bit)-1)<<lsb_bit;

Но я думаю, что цикл for будет намного проще понять кому-то другому.

always_comb begin
       partial_set = '0; // or whatever the unspecified bits should be
       for(int ii = lsb_bit; ii <= msb_bit; ii++)
           partial_set[ii] = complete_set[ii]
    end
person dave_59    schedule 11.11.2017