2014-08-29 34 views
0

我創建了一個簡單模塊,使用Verilog generate語句多次複製。但是,似乎生成語句以某種方式影響模塊中的變量賦值。下面的代碼:SystemVerilog中的變量賦值生成語句

module test(); 
    timeunit  10ns; 
    timeprecision 1ns; 

    wire[3:0] out; 
    reg[3:0] values[0:4] = {5, 6, 7, 8, 9}; 

    logic clk; 

    generate 
    genvar i; 
    for (i=0; i < 5; i++) begin: M1 
     MUT mut(
     .out, 
     .in(values[i]), 
     .clk 
    ); 
    end 
    endgenerate 

    initial begin 
    #1 clk = 0; 

    $monitor("%b %b %b %b %b\n", M1[0].mut.out, M1[1].mut.out, M1[2].mut.out, M1[3].mut.out, M1[4].mut.out); 

    #10 $stop; 
    end 

    always #1 clk++; 
endmodule 

module MUT(output [3:0] out, input [3:0] in, input clk); 

reg[3:0] my_reg[0:7]; 

assign out = my_reg[7]; 

always @(posedge clk) begin 
    my_reg[7] <= in; //5 
end 

endmodule 

這個測試方案的預期產出將是0101 0110 0111 1000 1001,但是輸出我得到的是xxxx xxxx xxxx xxxx。看起來test模塊中的values變量中的值沒有被分配給MUT模塊中的out變量。但是,當我用my_reg[7] <= 5;代替my_reg[7] <= in;時,代碼將按預期工作。當我直接指定out(將其聲明爲寄存器之後),即out <= in;時,該代碼也適用。如果我不使用任何生成語句而手動複製MUT模塊,則沒有任何問題。

回答

2

您沒有將輸出連接到單獨的導線。所以它們被隱含地聯繫在一起(比如它對時鐘的做法),導致多個驅動程序一點點。

只需添加

wire[3:0] out[0:4]; 

    generate 
    genvar i; 
    for (i=0; i < 5; i++) begin: M1 
     MUT mut(
     .out(out[i]), // Connect to different wires 
     .in(values[i]), 
     .clk 
    ); 
    end 
    endgenerate 
+0

我欠你的咖啡。很完美,謝謝。 – iab 2014-08-29 15:25:18