那是对生成和分配的错误使用。
generate 不应该在 Verilog 中随意使用,它们的使用应该是特殊的,比如扩展模块以进行参数化等。
如果它可以静态展开(根据您在此处的用法),则可以使用普通的 for 循环。Generates 通常用于参数化模块实例化;
assign
应该每根导线一次,并不断将右侧表达式驱动到该导线上。
您的代码看起来就像您只是在尝试对disp
总线进行 OR,这可以通过 OR 减少运算符来实现:
wire bus;
assign bus = |disp ;
更新1
disp 实际上被定义为内存,我们并不是要计算单个位或减少。这里可以使用 for 循环来计算 OR。
logic [3:0] data [5:0];
logic [3:0] or_data;
integer i;
always @* begin
or_data = 4'b0;
for(i=0; i<6; i=i+1) begin
or_data = or_data | data[i] ;
end
end
简单模拟:
logic [3:0] data [5:0];
logic [3:0] or_data;
integer i;
initial begin
for(i=0; i<6; i=i+1) begin
data[i] = i*2;
end
#1ns;
for(i=0; i<6; i=i+1) begin
$displayb(data[i]);
end
or_data = 4'b0;
for(i=0; i<6; i=i+1) begin
or_data = or_data | data[i] ;
end
#1ns;
$displayb(or_data);
end