首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >SystemVerilog generate语句中的变量赋值

SystemVerilog generate语句中的变量赋值
EN

Stack Overflow用户
提问于 2014-08-29 21:21:41
回答 2查看 10.3K关注 0票数 0

我已经创建了一个简单的模块,并使用Verilog generate语句多次复制该模块。然而,似乎generate语句以某种方式影响了模块中的变量赋值。代码如下:

代码语言:javascript
运行
复制
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 xxxxtest模块中的values变量中的值似乎没有分配给MUT模块中的out变量。但是,当我用my_reg[7] <= 5;替换my_reg[7] <= in;时,代码可以按预期工作。当我将其直接赋值给out (在将其声明为寄存器之后),即out <= in;时,代码也可以工作。如果我不使用任何generate语句就“手动”复制MUT模块,这是没有问题的。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-08-29 23:19:17

您没有将输出连接到单独的导线。因此,它们被隐式地捆绑在一起(就像它对时钟所做的那样),导致了一段时间的多个驱动程序。

只需添加

代码语言:javascript
运行
复制
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
票数 2
EN

Stack Overflow用户

发布于 2014-08-29 21:34:40

尝试使用0初始化clk变量。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25569177

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档