SystemVerilog生成语句中的变量赋值

时间:2014-08-29 13:21:41

标签: hardware verilog system-verilog

我创建了一个简单的模块,我使用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。似乎values模块中test变量中的值未分配给out模块中的MUT变量。但是,当我用my_reg[7] <= in;替换my_reg[7] <= 5;时,代码按预期工作。当我直接分配给out(在将其声明为寄存器之后),即out <= in;时,代码也有效。如果我在不使用任何生成语句的情况下手动复制MUT模块,则没有问题。

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:0)

尝试用0初始化clk变量。