我创建了一个简单的模块,我使用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
模块,则没有问题。
答案 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变量。