簡體   English   中英

SystemVerilog生成語句中的變量分配

[英]Variable assignment in SystemVerilog generate statement

我創建了一個簡單的模塊,可以使用Verilog generate語句復制多次。 但是,似乎generate語句以某種方式影響模塊中的變量分配。 這是代碼:

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變量中的values未分配給MUT模塊中的out變量。 但是,當我替換my_reg[7] <= in; my_reg[7] <= 5; ,代碼按預期工作。 當我直接分配給out (在將其聲明為寄存器之后),即out <= in;時,該代碼也適用out <= in; 如果我不使用任何generate語句而“手動”復制MUT模塊,就沒有問題。

您沒有將輸出連接到單獨的電線。 因此它們隱式地綁在一起(就像時鍾一樣),從而導致了多個驅動程序。

只需添加

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初始化clk變量。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM