Verilog เปลี่ยนขนาดด้านขวามือ

Jan 14 2021

ฉันมีโมดูลพื้นฐานดังต่อไปนี้เพื่อสาธิตบางสิ่ง

module tb();

reg [2:0] U;
reg [2:0] T;
reg [2:0] C;
reg E;

initial begin

    U = 5;
    T = 3;
    {E, C} = U + ~T + 1'b1;
    #1000;

end

endmodule

สิ่งที่ฉันคาดหวังคือ E จะเป็น 1 เพราะ;

U คือ 101

T คือ 011

และU + ~T + 001คือ

   101
   100
   001
+______
= 1010 

ดังนั้น C ได้รับ 010 ส่วนและ E ได้รับ 1 นี่คือพฤติกรรมที่คาดไว้อย่างไรก็ตามฉันได้ C เหมือนกัน แต่ E เป็น 0 ฉันคิดว่า verilog กำลังเพิ่มขนาดของตัวแปร RHS เป็น 4 บิตเพราะด้านซ้ายมือคือ 4 บิต ( 1 + 3) อย่างไรก็ตามสำหรับ T จะผนวก 0 นำหน้าก่อนที่จะเติมเต็ม T ดังนั้น T จึงกลายเป็น 0011 และส่วนเติมเต็มจะเป็น 1100 แทนที่จะเป็น 0100 ซึ่งเป็นเวอร์ชัน 4 บิตของส่วนเติมเต็มของ T

และสิ่งนี้นำไปสู่

   0101
   1100
   0001
+______
= 10010 

ซึ่งทำให้ E เป็น 0 อย่างที่เห็น.

ฉันไม่เข้าใจว่าทำไมจึงเป็นเช่นนั้นและไม่สามารถหาวิธีที่จะทำให้การเสริมเกิดขึ้นก่อนที่จะเพิ่มศูนย์นำ

ถ้าฉันทำสิ่งต่อไปนี้แทนมันก็ใช้ได้ดีและ E ได้ 1:

    U = 5;
    T = 3;
    T = ~T;
    {E, C} = U + T + 1'b1;

นี่เป็นการยืนยันว่าความสงสัยของฉันถูกต้อง ฉันมีวิธีแก้ปัญหาดังกล่าวใช่ อย่างไรก็ตามฉันไม่พอใจจริงๆฉันคิดว่าควรมีวิธีป้องกันพฤติกรรมนั้น

ความช่วยเหลือใด ๆ จะได้รับการชื่นชม

คำตอบ

3 dave_59 Jan 14 2021 at 05:55

เมื่อคุณมีตัวถูกดำเนินการของการผสมที่มีความกว้างต่างกัน Verilog จะมีกฎสำหรับการปรับขนาดตัวถูกดำเนินการแต่ละตัวให้มีความกว้างของตัวถูกดำเนินการที่ใหญ่ที่สุดตามบริบทของนิพจน์ คุณสังเกตถูกต้องว่า LHS เป็น 4 บิตตัวถูกดำเนินการบน RHS จะขยายเป็น 4 บิต สิ่งนี้เกิดขึ้นก่อนที่จะใช้การดำเนินการ

คุณสามารถแก้ไขปัญหานี้ได้โดยใช้ประโยชน์จากข้อเท็จจริงที่ว่าตัวถูกดำเนินการของการเรียงต่อกันเป็นบริบทที่กำหนดขึ้นเอง:

{E, C} = U + {~T} + 1'b1;

ตอนนี้ความกว้างของ~Tจะถูกกำหนดโดยความกว้างของT.