วิธีสร้างช่วงบิตด้วยเงื่อนไขที่กำหนดเป็นตรรกะ

ฉันเข้าใจว่าโค้ดต่อไปนี้จะไม่คอมไพล์ แต่มีอะไรที่คล้ายกันที่คอมไพล์หรือไม่

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)


คุณสามารถตัดสินใจแบบ bitwise แบบนี้ได้ ฉันแค่คิดว่าคุณต้องการตั้งค่าบิตอื่น ๆ ให้เป็นศูนย์ แต่คุณสามารถตั้งค่าให้ไม่สนใจ (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