我在使用生成块表示简单赋值时遇到了困难。 我的意图是 assign bus = disp [0] | disp [1] | disp [2] ......; 以下代码不起作用。我该如何解决?这种与累积相关的任务不会出现在Verilog手册中。提前感谢任何建议。
genvar varx;
for (varx = 0; varx < `N; varx = varx + 1) begin
if (varx == 0) assign bus = disp[0];
else assign bus = bus | disp[varx];
end
答案 0 :(得分:3)
这是生成和分配的错误用法。
不应该在Verilog中使用生成,并且它们的使用应该是特殊的,比如扩展参数化模块等。
如果可以静态展开(根据您的使用情况),则可以使用plain for循环。 Generates通常用于参数化模块实例化;
assign
应该每线一次并且不断地将右侧表达式驱动到该线上。
您的代码看起来就像是在尝试OR disp
总线,这可以通过OR减少运算符来实现:
wire bus;
assign bus = |disp ;
<强> UPDATE1 强>
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