[英]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.