我已经创建了一个简单的模块,并使用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
变量中的值似乎没有分配给MUT
模块中的out
变量。但是,当我用my_reg[7] <= 5;
替换my_reg[7] <= in;
时,代码可以按预期工作。当我将其直接赋值给out
(在将其声明为寄存器之后),即out <= in;
时,代码也可以工作。如果我不使用任何generate语句就“手动”复制MUT
模块,这是没有问题的。
发布于 2014-08-29 23:19:17
您没有将输出连接到单独的导线。因此,它们被隐式地捆绑在一起(就像它对时钟所做的那样),导致了一段时间的多个驱动程序。
只需添加
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
发布于 2014-08-29 21:34:40
尝试使用0初始化clk变量。
https://stackoverflow.com/questions/25569177
复制相似问题