ไม่ทราบผลลัพธ์ของ for แทนที่จะเป็น 1 ใน Verilog

ฉันใช้ Icarus iVerilog เพื่อสังเคราะห์และทดสอบโค้ดของฉัน แต่ฉันได้รับค่าที่ไม่รู้จักเมื่อค่า 1 ควรปรากฏขึ้นตามตรรกะ นี่คือตัวอย่างสิ่งที่ฉันพยายามทำ

reg [8:0] a = 000110100;
wire [8:0] b = 0;

generate
    genvar i;
    for (i = 8; i > -1; i = i - 1)
    begin:loop
        assign b[i] = |a[8:i];
    end
endgenerate

สิ่งนี้ควรสร้างประตูบางส่วนในรูปแบบของ

b[8] = a[8];
b[7] = a[8] | a[7];
b[6] = a[8] | a[7] | a[6];
b[5] = a[8] | a[7] | a[6] | a[5];
...

ผลลัพธ์ที่คาดหวังของฉันคือ

000111111

ฉันได้รับจริงๆ

000xxxxxx

ฉันไม่พบสาเหตุใด ๆ สำหรับ x's และฉันเริ่มสงสัยว่าเป็นปัญหากับ iVerilog


person adragon202    schedule 31.07.2016    source แหล่งที่มา
comment
เครื่องมือสังเคราะห์ของคุณรองรับการเริ่มต้นการประกาศตัวแปรหรือไม่?   -  person dave_59    schedule 01.08.2016
comment
พรุ่งนี้ฉันจะลองใช้เครื่องมืออื่นได้ แต่มีสองสิ่งที่คุณสามารถลองได้ในตอนนี้: 1) ใช้ i>=0 แทน i>-1 และ 2) นับไปข้างหน้าจาก 0 แทนที่จะย้อนกลับจาก 8   -  person teadotjay    schedule 01.08.2016


คำตอบ (1)


โปรดลบการมอบหมายในประกาศด้านล่าง การกำหนดเส้นลวดให้กับ 0 ในการประกาศทำให้เกิดข้อขัดแย้งกับการกำหนด 1 ในบล็อกเจนวาร์

 wire [8:0] b = 0;

เปลี่ยนไป

wire [8:0] b;

นี้เป็นเพราะ

wire [8:0] b = 0;

ไม่ใช่การเริ่มต้น แต่เป็นการกำหนดอย่างต่อเนื่อง มันเทียบเท่ากับ

wire [8:0] b;
assign b = 0;

จึงมีความขัดแย้ง

person babyworm    schedule 01.08.2016