จะตัดทอนความกว้างบิตของนิพจน์ใน Verilog ได้อย่างไร


11

พิจารณาการแสดงออกเช่น:

assign x = func(A) ^ func(B);

โดยที่เอาต์พุตของ func กว้าง 32 บิตและ x เป็นสายของ 16 บิต ฉันต้องการกำหนดเฉพาะบิตที่ต่ำที่สุดของบิตผลลัพธ์

ฉันรู้ว่าโค้ดด้านบนทำเช่นนั้นแล้ว แต่มันก็สร้างคำเตือน วิธีการ "ชัดเจน" ไม่ทำงาน:

assign x = (func(A) ^ func(B))[15:0]; // error: '[' is unexpected

คำตอบ:


8

คุณสามารถใช้ตัวแปรอื่น ๆ ได้แม้ว่านี่จะไม่ได้สวยงามโดยเฉพาะ

wire[31:0] y;

assign y = func(A) ^ func(B);
assign x = y[15:0];

แนวทางที่ดีกว่าคือการใช้ฟังก์ชั่น

function [15:0] trunc_32_to_16(input [31:0] val32);
  trunc_32_to_16 = val32[15:0];
endfunction

assign x = trunc_32_to_16(func(A) ^ func(B));

ฉันหวังว่าจะมีบางสิ่งที่ดีกว่านั้น ... โอเคฉันจะสร้างฟังก์ชั่นการตัดทอนจำนวนมาก
user23106

5

ในตัวอย่างของคุณคุณกำลังตัดบิตโดยปริยาย

การตัดทอนอย่างชัดเจนมักจะสามารถลบคำเตือนในการจำลอง / ผ้าสำลี / การสังเคราะห์

วิธีหนึ่งในการทำเช่นนี้ในบรรทัดคือการใช้ตัวดำเนินการ cast เช่น:

typedef logic [15:0] HALF_WORD;
assign x = HALF_WORD'((func(A) ^ func(B));

วิธีการนี้อาจเหมาะสมถ้าเห็นได้ชัดจากบริบทว่าบิตทั้งหมดที่ถูกดร็อปเป็น 0

หากบางส่วนของบิตอาจไม่ใช่ศูนย์ดังนั้นฉันขอแนะนำให้คุณใช้ net ระดับกลางเช่น @dwikle ที่แนะนำในคำตอบก่อนหน้าเนื่องจากจะทำให้ชัดเจนยิ่งขึ้นว่าคุณทิ้งบิตไปแล้ว นี่มันเป็นอีกครั้งสำหรับการอ้างอิง

wire[31:0] y;

assign y = func(A) ^ func(B);
assign x = y[15:0];

1
ฉันคิดว่ามันจะทำงานเฉพาะใน SystemVerilog ที่น่าสนใจไม่น้อย
Tom Carpenter

@TomCarpenter คุณต้องการ จำกัด ตัวเองให้กับชุดย่อยของ Verilog ที่มีอยู่ใน IEEE Std 1364-2005 แทนที่จะใช้ verilog ที่สังเคราะห์ได้เต็มรูปแบบที่มีอยู่ในการปรับปรุง IEEE Std 1800 แบบรวมรุ่นใหม่หรือไม่ คุณอาจต้องการที่จะพูด Verilog-2005 หรือบางสิ่งบางอย่างที่จะชี้แจงตั้งแต่มาตรฐาน Verilog วิทยเข้าสู่มาตรฐาน SystemVerilog แบบครบวงจรในปี 2009
mattgately

3

ฉันคิดว่านี่อาจช่วยให้เส้นนับถอยหลัง

wire [15:0] not_used ;

assign {not_used, x} = (func(A) ^ func(B));

ไม่แน่ใจว่าเหมาะสมกับการมอบหมายหรือไม่

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.