Verilog เปลี่ยนขนาดด้านขวามือ
ฉันมีโมดูลพื้นฐานดังต่อไปนี้เพื่อสาธิตบางสิ่ง
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;
นี่เป็นการยืนยันว่าความสงสัยของฉันถูกต้อง ฉันมีวิธีแก้ปัญหาดังกล่าวใช่ อย่างไรก็ตามฉันไม่พอใจจริงๆฉันคิดว่าควรมีวิธีป้องกันพฤติกรรมนั้น
ความช่วยเหลือใด ๆ จะได้รับการชื่นชม
คำตอบ
เมื่อคุณมีตัวถูกดำเนินการของการผสมที่มีความกว้างต่างกัน Verilog จะมีกฎสำหรับการปรับขนาดตัวถูกดำเนินการแต่ละตัวให้มีความกว้างของตัวถูกดำเนินการที่ใหญ่ที่สุดตามบริบทของนิพจน์ คุณสังเกตถูกต้องว่า LHS เป็น 4 บิตตัวถูกดำเนินการบน RHS จะขยายเป็น 4 บิต สิ่งนี้เกิดขึ้นก่อนที่จะใช้การดำเนินการ
คุณสามารถแก้ไขปัญหานี้ได้โดยใช้ประโยชน์จากข้อเท็จจริงที่ว่าตัวถูกดำเนินการของการเรียงต่อกันเป็นบริบทที่กำหนดขึ้นเอง:
{E, C} = U + {~T} + 1'b1;
ตอนนี้ความกว้างของ~T
จะถูกกำหนดโดยความกว้างของT
.