Cara membuat rentang bit dengan istilah yang didefinisikan sebagai logika

Saya memahami kode berikut tidak dapat dikompilasi, tetapi apakah ada kode serupa yang dapat dikompilasi?

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 sumber
comment
Apa yang Anda minta bukanlah logika kombinasional sampai Anda menentukan nilai bit di luar rentang msb /lsb yang seharusnya.   -  person dave_59    schedule 10.11.2017
comment
Tidak ada sintaks vcs untuk melakukannya dalam satu operasi, Anda memerlukan perulangan, dan menetapkannya sedikit demi sedikit. Dan ini adalah kait, bukan sisir, karena Anda berpotensi tidak menetapkan semua bit dalam siklus simulasi yang sama.   -  person Serge    schedule 10.11.2017


Jawaban (2)


Anda dapat melakukan beberapa keputusan bitwise seperti ini. Saya hanya berasumsi Anda ingin menyetel bit lainnya ke nol, tetapi Anda juga bisa menyetelnya ke tidak peduli (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

Dengan asumsi Anda ingin bit yang tidak ditentukan menjadi 0, Anda dapat melakukannya dalam satu baris:

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

Tapi menurut saya loop for akan lebih mudah dipahami orang lain

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